Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Unexpected output indexing arrays with array values

オープン
#617 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
1〜2日
初心者へのやさしさ
45/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
停滞
技術スタック
javascript

調査の方向性

Issue にある最小再現可能な createKernel の例から始め、gpu モードと cpu モードの両方で実行して、結果を期待される出力と比較します。GPU カーネルで使用される配列インデックス指定の経路を調査します。この例で gpu モードが cpu モードと同じ値を返せば完了です。

索引モデルが issue の本文から書いたものです。

説明

A GIF or MEME to give some spice of the internet

What is wrong?

As part of a project that I'm trying to integrate GPU.js into to enhance performance, I've encountered some bizarre output when running a kernel. If indexing an array with another, the output appears to have been taken from the values of the inner array. This is best explained with an example.

Where does it happen?

See the following for a minimal reproducible example.

const gpu = new GPU({ mode: 'gpu' });
const arr1 = [0, 1, 3, 4];
const arr2 = [10, 11, 12, 13, 14];

const arrKernel = gpu.createKernel(function(arr1, arr2) {
    return arr2[arr1[this.thread.x]];
}).setOutput([4]);
const result = arrKernel(arr1, arr2);

// Expected output: "10,11,13,14"
// jsfiddle output with mode: 'gpu': "0,1,4,0"
// jsfiddle output with mode: 'cpu': "10,11,13,14" (as expected)
console.log(result.toString());
  1. Create two arrays
  2. Use this.thread.x to index the first, and use the values of that to index the second
  3. Observe unexpected output

I have a JS fiddle that can recreate this issue at jsfiddle.net/TomWyllie/c5khtu9g/. The source of the seemingly arbitrary output seems to be the values in the inner array as I mentioned above. That is, if I had written return arr1[arr1[this.thread.x]]; instead of return arr2[arr1[this.thread.x]]; all would be as expected.

This was tested using:

  • GPU.js 2.9.4
  • GPU: NVIDIA GeForce GTX 1060 3GB
  • Google Chrome Version 83.0.4103.97 (Official Build) (64-bit), but same issue in Firefox
  • Windows 10

I couldn't replicate the issue on my phone (Samsung Galaxy S9) and haven't tried any other devices.

How important is this (1-5)?

Probably a 3 4, it's pretty annoying but is probably possible to work around in my use case. But it'd make things unnecessarily complicated and other people might spend time debugging not suspecting this has happened - it's a very strange result.

Other Comments

I am very new to GPU.js (like, < 1 week) so am not 100% sure if this is a genuine bug, or if I have somehow ventured into unsupported territory, but given that the expected result is returned in mode: cpu, and also in mode: gpu on my phone in the JS Fiddle I thought it'd be worth flagging up. If I've missed something stupid please do let me know!

Finally, although not relevant to this issue in case anybody is wondering about the context, my use-case is traversing a matrix in diagonals, as only the diagonals can be computed in parallel due to the recursive nature of each entry. This is part of a string alignment algorithm. I am using (or trying to) this.thread.x to parameterise the position along each diagonal, the indices of which are computed outside the kernel.

Any comments or thoughts much appreciated! 😊

主要言語
JavaScript
スター
15.5k
フォーク
663
PR マージ指標
30日以内にマージされた PR はありません

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

gpujs/gpu.js のほかの issue

gpujs/gpu.js の issue をすべて見る

似ている issue

JavaScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。