1.3 コンピューティング機能と nvcc コンパイラ ドライバ 4.0 を備えた Tesla C1060 を使用しています。スレッドブロックにローカルな計算をしようとしています。各スレッド ブロックには、最初にゼロ値に初期化される共有配列が提供されます。スレッド ブロックのスレッドによる共有データへの同時更新 (追加) の同期には、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
次の 2 行にコメントすると、-arch=sm_13 でエラーは発生しません。
atomicAdd( &sharedData[getIndex(thid), thid );
atomicAdd( &sharedData[getIndex(thid)], thid * thid );
誰かが私が間違っているかもしれないことを提案できますか?