Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: GPU.js: Taulukko parametrina

dartvaneri [06.02.2017 11:17:07]

#

Onko kellään tietoa, miten käyttäytyy kun GPU.js:n GPU-olion createGernel-funktiolle annetaan parametrina 3-uloitteinen taulukko? Olen yrittänyt kokeilemalla selvittä, mutta tunttuu, etten löydä logikkaa sen järjestelystä.

-dartvaneri

Edit.
Kun syötän sinne tallaisen arrayn:

[
	[
		[1,2,3,4,5,6,7,8],
		[11,12,13,14,15,16,17,18],
		[21,22,23,24,25,26,27,28],
		[31,32,33,34,35,36,37,38]
	],
	[
		[41,42,43,44,45,46,47,48],
		[51,52,53,54,55,56,57,58],
		[61,62,63,64,65,66,67,68],
		[71,72,73,74,75,76,77,78]
	],
	[
		[91,92,93,94,95,96,97,98],
		[101,102,103,104,105,106,107,108],
		[111,112,113,114,115,116,117,118],
		[121,122,123,124,125,126,127,128]
	],
	[
		[131,132,133,134,135,136,137,138],
		[141,142,143,144,145,146,147,148],
		[151,152,153,154,155,156,157,158],
		[161,162,163,164,165,166,167,168]
	],
	[
		[181,182,183,184,185,186,187,188],
		[191,192,193,194,195,196,197,198],
		[201,202,203,204,205,206,207,208],
		[211,212,213,214,215,216,217,218]
	]
]

Tulee tällainen array takasin:

[
	[
		[1,2,3,4],
		[5,6,7,8],
		[11,12,13,14],
		[15,16,17,18],
		[21,22,23,24]
	],
	[
		[21,22,23,24]
		[25,26,27,28],
		[31,32,33,43],
		[1,2,3,4],
		[5,6,7,8]
	],
	[
		[5,6,7,8],
		[11,12,13,14],
		[21,22,23,24],
		[25,26,27,28],
		[31,32,33,34]
	],
	[
		[31,32,33,34],
		[35,36,37,38],
		[41,42,43,44],
		[45,46,47,48],
		[51,52,53,54]
	],
	[
		[51,52,53,54],
		[55,56,57,58],
		[61,62,63,64],
		[65,66,67,68],
		[35,36,37,38]
	],
	[
		[35,36,37,38],
		[41,42,43,44],
		[45,46,47,48],
		[55,56,57,58],
		[61,62,63,64]
	],
	[
		[61,62,63,64],
		[65,66,67,68],
		[71,72,73,74],
		[75,76,77,78],
		[91,92,93,94]
	],
	[
		[91,92,93,94],
		[95,96,97,98],
		[101,102,103,104],
		[105,106,107,108],
		[111,112,113,114]
	]
]

Dimensiot on määritelty näin: dimensions([5,4,8]).

hyrppa95 [06.02.2017 12:37:20]

#

Sinulla on elementit väärässä järjestyksessä

var arr = [
	[
		[ 1, 2, 3, 4 ],
		[ 1, 2, 3, 4 ],
		[ 1, 2, 3, 4 ]
	],
	[
		[ 1, 2, 3, 4 ],
		[ 1, 2, 3, 4 ],
		[ 1, 2, 3, 4 ]
	]
]

// Dimensiot (4, 3, 2)
// Accessi on "väärin"päin:
arr[z][y][x];

dartvaneri [07.02.2017 17:29:56]

#

Tarkoitatko dimensioiden määrityksessä?

Jos laitan dimensions([8,4,5]) saadaan seuraava taulukko:

[
	[
		[1,2,3,4,1,2,3,4],
		[5,6,7,8,5,6,7,8],
		[11,12,13,14,11,12,13,14],
		[15,16,17,18,21,22,23,24]
	],
	[
		[21,22,23,24,25,26,27,28],
		[25,26,27,28,31,32,33,34],
		[31,32,33,34,1,2,3,4],
		[1,2,3,4,5,6,7,8]
	],
	[
		[5,6,7,8,11,12,13,14],
		[11,12,13,14,15,16,17,18],
		[21,22,23,24,21,22,23,24],
		[25,26,27,28,25,26,27,28]
	],
	[
		[31,32,33,34,31,32,33,34],
		[35,36,37,38,35,36,37,38],
		[41,42,43,44,41,42,43,44],
		[45,46,47,48,45,46,47,48]
	],
	[
		[51,52,53,54,55,56,57,58],
		[55,56,57,58,61,62,63,64],
		[61,62,63,64,65,66,67,68],
		[65,66,67,68,35,36,37,38]
	]
]

Grez [07.02.2017 20:21:09]

#

Tosi hämmentävää että 5,4,8 määrityksellä tulee 8x5x4 taulukko. No, ehkä tuolla on ollut joku jenkkikoodari, nehän laittaa päivämäärätkin sakavasti nousevaan järjestykseen.

dartvaneri [09.02.2017 14:30:37]

#

Oisko jollakin heittää vinkkiä/kirjastoa, jotta saisin laskentaa tehostettua GPU:lla? Tuo GPU.js onnistuu sotkemaan jopa 2-uloitteisen arrayn, 1-uloitteisen se osaa vielä käsitellä oikein.

Metabolix [11.02.2017 13:34:26]

#

Syötettävä data ja palautettava data eivät liity automaattisesti toisiinsa. Dimensiot koskevat palautettavaa dataa. Se, mitä dataan muodostuu, riippuu täysin tekemästäsi funktiosta, eli virheet ovat melko varmasti omassa koodissasi.

Testatessa näyttää, että GPU.js on altis pyöristysvirheille eli toimii väärin, jos dimensioissa tapahtuu pyöristysvirhe 1 / dim * dim < 1. Esimerkiksi dimensiolla 3 kirjasto laskee pyöristysvirheen (1/3 = 0,333... ja 1/3*3 = 0,999...) takia neljä lukua, joista viimeinen menee muistissa väärään paikkaan. Kakkosen potensseilla koodi toimii ihan hyvin.

Painotan vielä, että ongelmalla ei ole mitään tekemistä syötteen sisällön kanssa, eli tuo saamasi taulukon ”sekoaminen” on luultavasti ihan itse aiheutettu vääränlaisella funktiolla.

Ohessa on testaamani koodi, joka tekee samat laskut GPU:lla ja CPU:lla ja näyttää virheelliset kohdat. Dimensiot menevät ihan oikein, ja pyöristysvirhettä lukuun ottamatta tulos on myös GPU:lla täysin odotusten mukainen

<script src="http://gpu.rocks/js/gpu.min.js?nocache"></script>
<script>
var gpulib = new GPU()

var func = function(bar) {
	var a = this.thread.x * 100 + this.thread.y * 10 + this.thread.z
	var b = bar[this.thread.z % 2][this.thread.y % 2][this.thread.x % 2]
	return 1000 * b + a
}

var dim_x = 2, dim_y = 3, dim_z = 4
var bar = [ [[1,2],[3,4]] , [[5,6],[7,8]] ]
var gpu = gpulib.createKernel(func).dimensions([dim_x, dim_y, dim_z]).mode("gpu")(bar)
var cpu = gpulib.createKernel(func).dimensions([dim_x, dim_y, dim_z]).mode("cpu")(bar)

var s = ""
for (var z = 0; z < dim_z; ++z) {
	for (var y = 0; y < dim_y; ++y) {
		for (var x = 0; x < dim_x; ++x) {
			s += "(" + x + ", " + y + ", " + z + "): "
			s += gpu[z][y][x] + ", " + cpu[z][y][x]
			s += gpu[z][y][x] == cpu[z][y][x] ? ", ok\n" : ", FAIL\n"
		}
		s += "\n"
	}
	s += "\n"
}
document.write("<pre>" + s)
</script>

Tulos:

(0, 0, 0): 1000, 1000, ok
(1, 0, 0): 2100, 2100, ok

(0, 1, 0): 3010, 3010, ok
(1, 1, 0): 4110, 4110, ok

(0, 2, 0): 1020, 1020, ok
(1, 2, 0): 2120, 2120, ok


(0, 0, 1): 3030, 5001, FAIL
(1, 0, 1): 6101, 6101, ok

(0, 1, 1): 7011, 7011, ok
(1, 1, 1): 8111, 8111, ok

(0, 2, 1): 5021, 5021, ok
(1, 2, 1): 6121, 6121, ok


(0, 0, 2): 7031, 1002, FAIL
(1, 0, 2): 2102, 2102, ok

(0, 1, 2): 3012, 3012, ok
(1, 1, 2): 4112, 4112, ok

(0, 2, 2): 1022, 1022, ok
(1, 2, 2): 2122, 2122, ok


(0, 0, 3): 3032, 5003, FAIL
(1, 0, 3): 6103, 6103, ok

(0, 1, 3): 7013, 7013, ok
(1, 1, 3): 8113, 8113, ok

(0, 2, 3): 5023, 5023, ok
(1, 2, 3): 6123, 6123, ok

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta