みんな。get_global_size(0)はコントローラをクラッシュさせます
私はこのカーネルを得た:
__kernel void FuncionCL(__global char* in, __global char* out, __global int* S2)
{
__private int op1, op2, op3;
__private int C;
__private uint WorkDim, C2;
op1 = 1;
op2 = 2;
WorkDim = get_global_size(0);
__private int ID;
ID = get_global_id(0);
for(C = 0; C < 1000000; C++)
{
for(C2 = ID; C2 < 1000; C2 += WorkDim)
{
op3 = op1 + op2;
}
}
out[0] = 90;
out[1] = 89;
*S2 = (int) WorkDim;
}
それはあまりにアプリケーション、グラフィックコントローラだけでなく、クラッシュします。私は定数値 '16'(get_global_size()関数が返す)のインクリメントを変更すると、コードは正常に実行されます。どうしたの?するのではなく、8行目に
WorkDim = 16;
:私は、コードを実行した場合
は
WorkDim = get_global_size(0);
コードは、それが問題だ、400倍高速に実行されます。値が同じ場合はなぜですか?
** EDIT:**、コードは非常に遅く、乗算理由がある理由さて、今私が知っている:
1.-占有率が。
2.-すべてのスレッドは、最初のループで同じ繰り返しを行うには、右のコードは次のようになります。
__kernel無効FuncionCL(__globalのchar *うち、中__グローバルのchar *、int型__global * S2) { __private int op1、op2、op3; __private int C; __private uint WorkDim、C2; op1 = 1; op2 = 2; WorkDim = get_global_size(0); __private int ID; ID = get_global_id(0); ため {(C = ID; C + = WorkDim; C < 1000000)のための(C2 = ID; C2 < 1000; C2 + = WorkDim) {OP3 = OP1 + OP2。 } } out [0] = 90; out [1] = 89; * S2 =(int)WorkDim; }
私のコードは、CPUよりもGPUで6.1倍速いです。
すぐにクラッシュするのですか、(5〜10秒のように)しばらくしてクラッシュしますか?後者の場合、カーネルが時間がかかりすぎるため、GPUをリセットするのはOS GPUのウォッチドッグタイマーです。理想的には、あなたのカーネルが50ミリ秒未満になるようにするか、システムの応答性に影響を与え始めてください(UI描画などにも使用されるため)。 – Dithermaster
あなたの答えをありがとう。はい、5秒後にクラッシュします。しかし、その理由はなぜですか?それは、WorkDimの値の代わりに定数値のincrmentを使用すると、カーネルは '16'(get_global_size(0)の値を返す)を返します。 –