3

我正在研究用于稀疏矩阵运算的 OpenCL 代码,我发现当包括内核的代码被执行一次或两次时它可以工作。但是每隔几次运行,答案就会稍微偏离。这是我正在使用的非常简单的内核:

__kernel void dsmv( int N, __global int * IA,
                    __global int * JA, __global float * A,
                    __global float * X, __global float * Y){

    int IBGN, ICOL, IEND, ii;
    ICOL = get_global_id(0);

    if(ICOL < N)
    {
        IBGN = JA[ICOL]-1;
        IEND = JA[ICOL+1]-1-1;

        for (ii = IBGN; ii <= IEND; ii++)
        {
            Y[IA[ii]-1] +=  A[ii]*X[ICOL];
        }
    }
}

我还可以发布使用此内核的 fortran 代码。我正在使用 FortranCL。

什么可能导致乘法在每次运行时给出不同的答案?

4

1 回答 1

0

这条线看起来很可疑:

Y[IA[ii]-1] +=  A[ii]*X[ICOL];

似乎两个工作项可能会增加相同的内存位置,因此这里存在潜在的竞争条件,并且由于+=不是原子操作,因此这是一个问题。

不幸的是,您不能使用内置函数,atomic_add因为它不支持浮点数,但atomic_cmpxchg确实支持,因此您可以使用它来实现浮点原子加法 - 或者只需查看现有的浮点数加法实现

于 2012-11-06T08:57:03.273 回答