0

スレッド ID を使用して、グローバル変数として定義されている配列にアクセスしたいと考えていました。しかし、私は1で合計する際に問題に直面しています。以下をご覧ください。

// initial array myU[0..3]={0,0,0,0}, myindex[0..3]={0,1,1,3}
1- tid=0,1,2,3 //tid is threads index
2- id=myindex[tid]; //id=0,1,1,3
3- myU[id]=myU[id]+1; 
4- if (myU[id]>1)
     //print("id"); // it should print '1'

行 3 を実行した後、myU[0]=1、myU[1]=2、myU[3]=1 があると仮定しました。しかし、myU配列には myU[0]=0、myU[1]=1、myU[3]=3 のような奇妙な値があります。どうしてか分かりません。

私の最終的な目標は、ID(4行目)を取得することです。これは、1回以上合計されます)。

4

1 に答える 1

4

2 つの異なるスレッドによって書き込まれた場合myU[1]、結果は未定義であり、atomicAdd取得するために使用する必要がありますmyU[1]==2

CUDA プログラミング ガイドには次のように記載されています。

ワープによって実行される非アトミック命令が、ワープの複数のスレッドのグローバル メモリまたは共有メモリ内の同じ場所に書き込む場合、その場所に対して発生するシリアル化された書き込みの数は、デバイスの計算能力によって異なります。どのスレッドが最終的な書き込みを実行するかは未定義です。

于 2013-09-02T20:54:41.633 に答える