我的OpenCL内核有什么问题?
代码是存储在压缩列存储中的稀疏矩阵与列向量的乘积。第一个是串行代码。第二个是open cl内核。让我使用更有意义的名称,而不是inputimage和output 我不得不并行化我的代码。串行输出与内核的输出不同。有人能告诉我我缺少什么吗 序列号是我的OpenCL内核有什么问题?,opencl,Opencl,代码是存储在压缩列存储中的稀疏矩阵与列向量的乘积。第一个是串行代码。第二个是open 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++)
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];
}
}
int结果[4]={0,0,0};
对于OpenCL中的(int col=0;col,这4个工作项将并行执行。它们都将尝试同时更新output2[inputImage4[j]]
。行为尚未定义,但您可能只会观察到这4个工作项中的一个
解决这类问题需要修改算法,或者使用原子操作(这将序列化更新)如果您不经常访问该值。您如何调用内核?也许您有一个错误,导致执行的线程数与预期的不同。另外,不同的inputImage数组是什么数据类型?所有data类型都是整数。如果仔细观察,您会发现这实际上是串行和并行的lel版本的代码,将压缩列格式的稀疏矩阵与列向量相乘。不,我只需要4个线程来执行。每个线程对循环执行不同的迭代。Eric Bainville的答案是关于竞争条件问题的正确答案。问题是如何使用锁来保持此代码并行,但在两个线程上得到相同的结果串行和并行代码。给你几个Q:rowptr通常有多大?为什么只有4个线程?索引[j]代表什么?这取决于inputImage4[j]的值
,不是吗?在这两种情况下,您对并发读/写问题的看法都是正确的。您能建议对我的kenel进行一些修改吗?我的代码的目的是使稀疏矩阵乘法成为并行乘法。但如果使用锁,它将再次成为串行代码。我该怎么办?
int col=get_global_id(0);
for(int j=rowptr[col];j<rowptr[col+1];j++)
{
result[index[j]]+=val[j]*colvector[col];
}