OpenCL矩阵向量乘法代码从运行到运行给出正确和错误的解决方案

OpenCL矩阵向量乘法代码从运行到运行给出正确和错误的解决方案,opencl,sparse-matrix,matrix-multiplication,Opencl,Sparse Matrix,Matrix Multiplication,我正在为稀疏矩阵操作编写OpenCL代码,我发现当包含内核的代码执行一到两次时,它就可以工作了。但每跑几次,答案就有点偏离了。下面是我正在使用的非常简单的内核: \uuuu内核无效dsmv(int N,\uuuu全局int*IA, __全局整数*JA,uu全局浮点*A, __全局浮点*X,uu全局浮点*Y){ int IBGN、ICOL、IEND、ii; ICOL=获取全局id(0); if(ICOL

我正在为稀疏矩阵操作编写OpenCL代码,我发现当包含内核的代码执行一到两次时,它就可以工作了。但每跑几次,答案就有点偏离了。下面是我正在使用的非常简单的内核:

\uuuu内核无效dsmv(int N,\uuuu全局int*IA,
__全局整数*JA,uu全局浮点*A,
__全局浮点*X,uu全局浮点*Y){
int IBGN、ICOL、IEND、ii;
ICOL=获取全局id(0);
if(ICOL对于(ii=IBGN;ii而言,这条线看起来可疑:

Y[IA[ii]-1] +=  A[ii]*X[ICOL];
似乎两个工作项可能会增加相同的内存位置,因此这里存在潜在的竞争条件,并且由于
+=
不是原子操作,因此这是一个问题


不幸的是,您不能使用内置的
原子加法
,因为它不支持浮点运算,但是
原子加法
支持浮点运算,所以您可以使用它来实现浮点原子加法,或者仅仅是。

您能提供一些关于变量含义的更多信息吗?我没有太多稀疏矩阵乘法经验。特别是我想知道IA和JA矩阵。否则它看起来像一个简单的Y=AX乘法。谢谢!JA矩阵指向IA和a中列的开始。IA是行索引数组。a存储非零值。我意识到有更有效的方法来处理内存和矩阵格式,但我在我进行实验之前,我想让这个版本工作。我看到的唯一可能导致未定义行为的东西是“Y[IA[ii]-1]+=”,你能保证没有两个工作单元会访问Y中的相同元素吗?如果不能,那么很可能存在争用条件。另外,这只是我的拙见,但代码确实可以使用更好的变量名。我想我的问题是,我不能保证没有两个工作单元访问Y中的相同元素。我想我可能需要做些什么我忘了提到IBGN和IEND的额外-1,因为数组在fortran中是从1索引的。