cl_khr_int64_base_atomics的替换

时间:2013-05-22 20:07:42

标签: opencl

我有一台不支持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.的非常通用的实现。

1 个答案:

答案 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位整数的数组。虽然两个部分不会在完全相同的时间递增,但程序完成时总数应该是正确的。