私は大きな数字のために2つの整数配列を掛けることに取り組んでいます。私は基本的に約20桁の数字を掛けましたが、数字が増えると不安定になります。私はテストのためのCPUとカーネルにいくつかのコードを持っており、カーネルはそれぞれの作業の後に私に異なる数字を与えます。問題は、バリアやmutexのようなものかもしれませんが、これほど多くはありません。どのように私はこの不安定を解決することができますか?ここでは、コード上のコードOpenCL 1D配列Big Number Multiply
kernel void multiply(global int* A,
const int M,
global int* B,
const int N,
global int* C){
const int globalRow = get_global_id(0); // Row ID of C (0..M)
int globalCol,i;
// Compute a single element (loop over K)
for (globalCol=0; globalCol<N; globalCol++) {
int val=A[globalRow]*B[globalCol];
printf("Row is %d , Col is %d \n",globalRow,globalCol);
//C[globalCol + globalRow +1]+=val/10;
C[globalCol + globalRow]+=val%10;
C[globalCol+1+globalRow]+=val/10;
}
int flag=1;
while (flag) {
flag=0;
for (i=M+N-1 ; i>=0 ; i--) {
if (C[i]>9) {
C[i+1]+=C[i]/10;
C[i]=C[i]%10;
flag=1;
}
}
}
}
フラグ事がshifting.Itは、要素の問題にアクセスするように聞こえるされているが、私は解決する方法がわかりません。
ありがとうございました。私はそこで競合状態を認識しましたが、その障壁はほとんど理解できません。この仕事は好きですか? mutex_lockとmutex_unlockは次のようになります。 mutexes間を実行するために バリアとバリアは同じ方法で実行されます。これは私の理論ですが、コンパイラは私のように思っていません。 –
バリアはミーティングポイントのようなものです。ワークグループ内のすべての作業項目がそこに集まり、コードの次の部分に移動します。そこにある最初のものは、他のものと同じように、公園に残っています。この場合、競合状態を取り除くオフセットを実行する前に、最初のC位置のすべての+ =が終了することが保証されます。このツールは便利です(私のものではありません):http://multicore.doc.ic.ac.uk/tools/GPUVerify/ – Dithermaster
ありがとうございました。私はそこにくっついた。 –