代码是存储在压缩列存储中的稀疏矩阵与列向量的乘法。首先是串行代码。第二个是打开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];
}
答案 0 :(得分:3)
在OpenCL中,4个工作项将并行执行。他们都会尝试同时更新output2[inputImage4[j]]
。行为未定义,但您可能会观察到的是4个工作项中只有一个的贡献。
解决此类问题需要修改算法,或者如果您不经常访问该值,则需要使用原子操作(将序列化更新)。