我的open cl内核有什么问题?

时间:2012-09-10 13:42:03

标签: opencl

代码是存储在压缩列存储中的稀疏矩阵与列向量的乘法。首先是串行代码。第二个是打开cl kernel.let我使用更有意义的名称而不是inputimage和输出。

我必须并行化我的代码。串行输出与内核的输出不同。有人可以告诉我我遗失的任何内容吗?

序列号是

int result[4]={0,0,0,0};
   for(int col=0;col<4;col++)
     {
         for(int j=rowptr[col];j<rowptr[col+1];j++)
         {

         result[index[j]]+=val[j]*colvector[col];

         }
     }

它的输出与并行代码不同。每个内核的工作单位设置为4 并行代码如下。有人请告诉我我错过了什么。

      int col=get_global_id(0);

  for(int j=rowptr[col];j<rowptr[col+1];j++)
         {

         result[index[j]]+=val[j]*colvector[col];

         }

1 个答案:

答案 0 :(得分:3)

在OpenCL中,4个工作项将并行执行。他们都会尝试同时更新output2[inputImage4[j]]。行为未定义,但您可能会观察到的是4个工作项中只有一个的贡献。

解决此类问题需要修改算法,或者如果您不经常访问该值,则需要使用原子操作(将序列化更新)。