2

CUDA の機能をテストするための単純なカーネルを作成しました__syncthreads。カーネルでは、更新された値が他のスレッドに表示されない場合、各スレッドから印刷することができました。理想的には、Not visible to meエラー メッセージを出力するスレッドはありませんが、一部のスレッドはこのメッセージを出力してしまいます。これがカーネルです。

__device__ int a=0;  
__global__ void kernel()  
{  

    isItOK=false;  
    if(threadIdx.x==0 && blockIdx.x==0)  
    {  
        atomicAdd(&a,1);  
        __threadfence();  
    }  
    __syncthreads();  
    if(atomicAdd(&a,0)==0)  
    {  
        cuPrintf("Not Visible to me\n");  
    }  

}  
int main()  
{  
    int *a;  
    cudaPrintfInit();  
    kernel<<<16,16>>>();  
    cudaPrintfDisplay(stdout,true);  
    cudaPrintfEnd();  
}

この非常に単純なテスト プログラムで私を助けてください。設定するコンパイラ フラグが必要ですか。

4

1 に答える 1

7

__syncthreads()同じブロック内のスレッドのみを同期する同期バリア プリミティブです。

CUDA には、スレッド ブロック間で安全に同期するためのメカニズムがありません。

スレッド ブロック間の通信と同期は、さまざまな数のマルチプロセッサを使用する GPU 間での実行のスケーラビリティを損なうため、推奨されません。これがそもそもスレッド ブロックを使用する理由です。

于 2012-08-24T02:34:52.377 に答える