2

OpenCL でフロートのアトミック max 関数が必要です。これは、atomic_xchg を使用した現在の素朴なコードです。

float value = data[index];
if ( value  > *max_value )
{
    atomic_xchg(max_value, value);
}

このコードは、Intel CPU を使用している場合は正しい結果を返しますが、Nvidia GPU を使用している場合は正しくありません。このコードは正しいですか、誰か助けてくれますか?

4

1 に答える 1

5

次のように実行できます。

 //Function to perform the atomic max
 inline void AtomicMax(volatile __global float *source, const float operand) {
    union {
        unsigned int intVal;
        float floatVal;
    } newVal;
    union {
        unsigned int intVal;
        float floatVal;
    } prevVal;
    do {
        prevVal.floatVal = *source;
        newVal.floatVal = max(prevVal.floatVal,operand);
    } while (atomic_cmpxchg((volatile __global unsigned int *)source, prevVal.intVal, newVal.intVal) != prevVal.intVal);
}

__kernel mykern(__global float *data, __global float *max_value){
    unsigned int index = get_global_id(0);

    float value = data[index];
    AtomicMax(max_value, value);
}

LINKに記載されているとおりです。

それが行うことは、float と int の和集合を作成することです。float で計算を実行しますが、atomic xchg を実行するときに整数を比較します。整数が一致する限り、操作は完了します。

ただし、これらの方法の使用による速度の低下は非常に大きくなります。慎重に使用してください。

于 2013-09-23T12:52:30.867 に答える