CUDA共享内存原子错误

时间:2012-08-27 22:45:07

标签: c++ c cuda gpu atomic

我正在使用具有1.3计算能力的Tesla C1060和nvcc编译器驱动程序4.0。我试图在线程块本地进行一些计算。每个线程块都提供一个共享数组,首先将其初始化为零值。为了通过线程块的线程同步对共享数据的并发更新(添加),我使用CUDA atomicAdd原语。

一旦每个线程块准备就绪,其结果在共享数据数组中,共享数据数组中的每个条目都会迭代地合并(使用atomicAdd)到全局数据数组中的相应条目。

下面是一个非常类似于我基本上尝试做的代码。

#define DATA_SZ 16
typedef unsigned long long int ULLInt;

__global__ void kernel( ULLInt* data, ULLInt ThreadCount )
{
  ULLInt thid = threadIdx.x + blockIdx.x * blockDim.x;
  __shared__ ULLInt sharedData[DATA_SZ];

  // Initialize the shared data
  if( threadIdx.x == 0 )
  {
    for( int i = 0; i < DATA_SZ; i++ ) { sharedData[i] = 0; }
  }
  __syncthreads();

  //..some code here

  if( thid < ThreadCount )
  {
    //..some code here

    atomicAdd( &sharedData[getIndex(thid), thid );

    //..some code here        

    for(..a loop...)
    { 
      //..some code here

      if(thid % 2 == 0)
      {           
        // getIndex() returns a value in [0, DATA_SZ )
        atomicAdd( &sharedData[getIndex(thid)], thid * thid );
      }
    }
  }
  __syncthreads();

  if( threadIdx.x == 0 )
  {
    // ...
    for( int i = 0; i < DATA_SZ; i++ ) { atomicAdd( &Data[i], sharedData[i] ); }
    //...
  }
}

如果我使用-arch = sm_20编译,我不会收到任何错误。但是当我使用-arch = sm_13选项编译内核时,我得到以下错误:

ptxas /tmp/tmpxft_00004dcf_00000000-2_mycode.ptx, line error   : Global state space expected for instruction 'atom'
ptxas /tmp/tmpxft_00004dcf_00000000-2_mycode.ptx, line error   : Global state space expected for instruction 'atom'
ptxas fatal   : Ptx assembly aborted due to errors

如果我评论以下两行,我不会在-arch = sm_13:

中出现任何错误
atomicAdd( &sharedData[getIndex(thid), thid );
atomicAdd( &sharedData[getIndex(thid)], thid * thid );

有人可以建议我可能做错了吗?

1 个答案:

答案 0 :(得分:1)

在CUDA C编程指南中找到解决方案:在共享内存上运行的原子函数和在64位字上运行的原子函数仅适用于1.2及以上计算能力的设备。在共享内存中以64位字运行的原子功能仅适用于计算能力为2.x及更高的设备。

所以基本上我不能在这里使用ULLInt来共享内存,不知何故我需要使用unsigned int