OpenCL 1D Array Big Number Multiply

时间:2017-07-01 08:48:23

标签: c opencl gpgpu

我正在为大数字乘以两个整数数组。我基本上乘以大约20位数字但是对于更多数字它会变得不稳定。我有一些关于CPU和内核的代码用于测试和内核在每次工作后给我不同的数字。问题可能是障碍或类似互斥的东西,但我不是这么多。我怎样才能解决这种不稳定性?这是代码

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;
        }
    }
}

}

代码上的标志物正在转移。这听起来像访问元素问题,但我不知道如何解决。

1 个答案:

答案 0 :(得分:0)

你有竞争条件。相邻的线程同时访问相同的内存位置,在两行代码中使用C数组执行+ =。由于这些遵循特定模式,因此您可以在两个+ =操作之间使用barrier(CLK_GLOBAL_MEM_FENCE)来移除竞争条件。我认为你在下面的进位代码中有类似的东西。请小心,因为工作组中的所有线程必须触及障碍,否则内核将挂起或崩溃。