1

代码是将存储在压缩列存储中的稀疏矩阵与列向量相乘。首先是串行代码。其次是打开 cl 内核。让我使用更有意义的名称而不是 inputimage 和 output。

我必须并行化我的代码。串行输出与内核的输出不同。有人可以告诉我我遗漏了什么吗?

序列号是

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

         }
4

1 回答 1

3

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

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

于 2012-09-11T21:40:03.010 回答