我有一台不支持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.的非常通用的实现。
答案 0 :(得分:1)
您可以尝试这样的事情:
void atomInc64 (__local uint *counter)
{
uint old, carry;
old = atomic_inc (&counter [0]);
carry = old == 0xFFFFFFFF;
atomic_add (&counter [1], carry);
}
其中counter是两个32位整数的数组。虽然两个部分不会在完全相同的时间递增,但程序完成时总数应该是正确的。