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]).
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];
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] ] ]
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.
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.
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.