次のように実行できます。
//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 を実行するときに整数を比較します。整数が一致する限り、操作は完了します。
ただし、これらの方法の使用による速度の低下は非常に大きくなります。慎重に使用してください。