Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的OpenCL内核有什么问题?_Opencl - Fatal编程技术网

我的OpenCL内核有什么问题?

我的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++)

代码是存储在压缩列存储中的稀疏矩阵与列向量的乘积。第一个是串行代码。第二个是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++)
         {

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

         }