1

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 );

誰かが私が間違っているかもしれないことを提案できますか?

4

1 に答える 1

1

CUDA C プログラミング ガイドで解決策を見つけました。共有メモリで動作するアトミック関数と 64 ビット ワードで動作するアトミック関数は、計算機能 1.2 以上のデバイスでのみ使用できます。共有メモリ内の 64 ビット ワードで動作するアトミック関数は、計算機能 2.x 以上のデバイスでのみ使用できます。

したがって、基本的にここでは共有メモリから ULLInt を使用できず、どういうわけか unsigned int を使用する必要があります

于 2012-08-27T23:09:49.177 に答える