我有一个不支持 cl_khr_int64_base_atomics 的 ATI Firepro V4800 显卡。我正在尝试将 RadixSort 算法调整为长整数。该算法使用 atomic_inc,它的 64 位是 atom_inc,我不能在内核中使用它。所以,我的问题是,是否有一段代码可以执行与 atomic_inc 相同的功能?内核代码如下:
__kernel void histogram(__global uint* unsortedData,
__global uint* buckets,
uint shiftCount,
__local uint* sharedArray)
{
size_t localId = get_local_id(0);
size_t globalId = get_global_id(0);
size_t groupId = get_group_id(0);
size_t groupSize = get_local_size(0);
uint numGroups = get_global_size(0) / get_local_size(0);
// Initialize shared array to zero //
sharedArray[localId] = 0;
barrier(CLK_LOCAL_MEM_FENCE);
// Calculate thread-histograms //
uint value = unsortedData[globalId];
value = value >> shiftCount & 0xFFU;
atomic_inc(sharedArray+value);
barrier(CLK_LOCAL_MEM_FENCE);
// Copy calculated histogram bin to global memory //
uint bucketPos = groupId * groupSize + localId ;
//uint bucketPos = localId * numGroups + groupId ;
buckets[bucketPos] = sharedArray[localId];
}
有什么建议么?谢谢你。
编辑: 这个博客网站给出了另一种方法:http: //suhorukov.blogspot.in/2011/12/opencl-11-atomic-operations-on-floating.html。这给出了 Atomic Inc. 的一个非常通用的实现。