次のコードスニペット(単純な2次元行列乗算ルーチン)のインデックスカウントの優先順位を知りたい。OpenClグローバルワークアイテム操作の優先度
kernel void mmul(
const int N,
global float* A,
global float* B,
global float* C)
{
int k;
int i = get_global_id(0);
int j = get_global_id(1);
float tmp;
if ((i < N) && (j < N))
{
tmp = 0.0f;
for (k = 0; k < N; k++)
tmp += A[i*N+k] * B[k*N+j];
C[i*N+j] = tmp;
}
}
'k'カウンタを使用してforループを見ると、グローバルな作業項目 'i'と 'j'が同じ行に表示されます。私はそれらのどれが 'i'と 'j'のインデックス(例えば1,2,3,4、...、n)を数えるという点で優先順位が高いのかを知りたい。私はOpenClの新機能としてどのように動作するのか分かりません。このタイプの操作のために通常のCまたはPythonを使用している場合、入れ子のforループを使用します。
誰かがグローバルワークアイテムの仕組みを説明できますか?
ありがとうございます。
ユーザーに公開されていません。しかし、私はamd gpuでこのようなものを見てきました。連続したワークグループがたくさんあり、いくつかのワークグループが混在していて、再び多くのワークグループが並んでいます。最初の作業項目は、原因不明の理由でどこかについてしまえば、作業項目が限られているため作業項目が限られていると作業が終了せずPCがクラッシュすることがあります。 OpenCL2.0では、作業項目が生成されるので、順序を制御する方がよい場合があります。 –
だから、あなたは、ユーザーは彼らが働く方法を当然受け止めなければならないと言っていますか?これはmatrxi乗算のコーディングの悪い方法ですか? – Redshoe
get_global_id(0)がXでget_global_id(1)がYで、サイズ(10k/3k)のカーネルを起動した場合、Xは10kとYスキャンをスキャンします3k。 –