3

私は疎行列演算用の OpenCL コードに取り組んでおり、カーネルを含むコードが 1 回または 2 回実行されると機能することがわかりました。しかし、数回実行するたびに、答えはわずかにずれています。私が使用している非常に単純なカーネルは次のとおりです。

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

2 つの作業項目が同じメモリ ロケーションをインクリメントする可能性があるため、競合状態が発生する可能性があり+=ます。これはアトミック操作ではないため、問題です。

atomic_add残念ながら、 float をサポートしていないため、代わりに組み込みを使用することはできませんが、サポートatomic_cmpxchgしているため、浮動小数点のアトミック add を実装するために使用できます

于 2012-11-06T08:57:03.273 に答える