2017-12-06 15 views
0

次のコードスニペット(単純な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ループを使用します。

誰かがグローバルワークアイテムの仕組みを説明できますか?

ありがとうございます。

+0

ユーザーに公開されていません。しかし、私はamd gpuでこのようなものを見てきました。連続したワークグループがたくさんあり、いくつかのワークグループが混在していて、再び多くのワークグループが並んでいます。最初の作業項目は、原因不明の理由でどこかについてしまえば、作業項目が限られているため作業項目が限られていると作業が終了せずPCがクラッシュすることがあります。 OpenCL2.0では、作業項目が生成されるので、順序を制御する方がよい場合があります。 –

+0

だから、あなたは、ユーザーは彼らが働く方法を当然受け止めなければならないと言っていますか?これはmatrxi乗算のコーディングの悪い方法ですか? – Redshoe

+0

get_global_id(0)がXでget_global_id(1)がYで、サイズ(10k/3k)のカーネルを起動した場合、Xは10kとYスキャンをスキャンします3k。 –

答えて

0

作業の優先順位を発行するよりも、メモリの読み書き優先度に焦点を当てる必要があります。メモリ操作の優先順位/順序を強制するには、mem_fence(in-workitem)、バリア(workgroup内)、さらにはカーネル(すべての作業項目の同期点)を使用します。故意に空のfor-loopsやアトミック関数を使用しても、メモリの書き込み/読み取りの優先順位を保証することはできません。メモリフェンス/バリア/カーネルのみが可能です。

作業項目(開始/終了実行)は優先されませんが、それらをグループ化して実行するスレッドが多い計算単位で実行されます。 workitem i、jがi + 1、j + 1の前に実行される保証はありませんが、同じワークグループ(サイズが16の場合)で同じ計算単位(L1キャッシュを共有するコア)で実行されるという保証があります、16など)をNvidiaとAmd gpusで使用しています。

同じコンピューティングユニットで実行すると同時に発行される可能性が高くなりますが、L1キャッシュなどの共有リソースは高性能を意味します。

同じワークグループであっても、ローカル作業項目が他の作業項目の前に発行されているが、それらが同じSIMDユニットにあると同時に発生する可能性が高い(つまり、Amd gpu )。

+0

ありがとうございます。それで、たとえ彼らが優先順位を持たなくても、私は順序付けられたインデックス(0,1,2,3、...、N)を期待するので、結果は同じになるでしょうか? – Redshoe

+0

作業項目が別の作業項目と同じアドレスに書き込む場合は競合状態であり、フェンスとカーネルの追加などの手段で解決する必要があります。一意のアドレスに書き込む限り、フェンスなしで同じ作業項目で複数の書き込みを行う場合を除いて、常に同じになるはずです。アトミックを使用してもメモリアクセスの順序を強制することはできませんが、フェンスは可能です。フェンス/障壁の全ポイントはこれです。並列アルゴリズムの場合、実行順序を持つことは重要ではありません。 –

+0

申し訳ありませんが、フェンスの意味は?簡単な例を教えていただけますか?ありがとうございました。 – Redshoe