2017-07-01 12 views
0

私は大きな数字のために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は、要素の問題にアクセスするように聞こえるされているが、私は解決する方法がわかりません。

答えて

0

競合状態です。隣接するスレッドは、同時に2つのコード行で+ =とC配列を使用して同じメモリ位置にアクセスしています。これらは特定のパターンに従うので、2つの+ =演算の間にbarrier(CLK_GLOBAL_MEM_FENCE)を使用して、競合状態を取り除くことができます。私はあなたが以下の桁上げコードで何か似ていると思います。 として作業グループ内のすべてのスレッドが障壁に衝突する必要があります。そうしないと、カーネルがハングしたりクラッシュしたりします。

+0

ありがとうございました。私はそこで競​​合状態を認識しましたが、その障壁はほとんど理解できません。この仕事は好きですか? mutex_lockとmutex_unlockは次のようになります。 mutexes間を実行するために バリアとバリアは同じ方法で実行されます。これは私の理論ですが、コンパイラは私のように思っていません。 –

+0

バリアはミーティングポイントのようなものです。ワークグループ内のすべての作業項目がそこに集まり、コードの次の部分に移動します。そこにある最初のものは、他のものと同じように、公園に残っています。この場合、競合状態を取り除くオフセットを実行する前に、最初のC位置のすべての+ =が終了することが保証されます。このツールは便利です(私のものではありません):http://multicore.doc.ic.ac.uk/tools/GPUVerify/ – Dithermaster

+0

ありがとうございました。私はそこにくっついた。 –