[解決済み] cuda atomicAdd のサンプルで正しい出力が得られない
2022-02-09 09:33:10
質問
以下のコードは、100要素のfloatの配列を10回1ずつインクリメントすることを目的に書かれたものです。出力では、各要素に10.0fの値を持つ100要素の配列を期待していました。その代わり、ランダムな値が出力されます。ここで私の誤りを指摘してもらえますか?
__global__ void testAdd(float *a)
{
float temp;
for (int i = 0; i < 100 ; i++)
{
a[i] = atomicAdd(&a[i], 1.0f);
}
}
void cuTestAtomicAdd(float *a)
{
testAdd<<<1, 10>>>(a);
}
アトム演算の仕組みを理解し、他の分野にも応用できるようになることが目標です。
どのように解決するのか?
それは
atomicAdd
演算を行うことができます。
こんな感じでやればいいんです。
atomicAdd(&a[i], 1.0f);
で、当該変数(
a[i]
) が更新されます。
は 戻り値 アトム関数から得られるのは、一般に 古い の値は、変数にあったものです。 以前 アトミックな更新を行います。
ということで、こうすることで
a[i] = atomicAdd(&a[i], 1.0f);
は変数を更新します。
a[i]
を指定し、(解剖学的でない方法で)その後に
古い
の値を変数
a[i]
. これは、ほぼ間違いなく、あなたが望むものではありません。
を読んでみてください。 ドキュメント :
この関数は old を返します。
次の完全なコードは、正しい使い方を示しています。
#include <iostream>
__global__ void testAdd(float *a)
{
for (int i = 0; i < 100 ; i++)
{
atomicAdd(&a[i], 1.0f);
}
}
void cuTestAtomicAdd(float *a)
{
testAdd<<<1, 10>>>(a);
}
int main(){
float *d_data, *h_data;
h_data=(float *) malloc(100*sizeof(float));
cudaMalloc((void **)&d_data, 100*sizeof(float));
cudaMemset(d_data, 0, 100*sizeof(float));
cuTestAtomicAdd(d_data);
cudaMemcpy(h_data, d_data, 100*sizeof(float), cudaMemcpyDeviceToHost);
for (int i = 0; i < 100; i++)
if (h_data[i] != 10.0f) {printf("mismatch at %d, was %f, should be %f\n", i, h_data[i], 10.0f); return 1;}
printf("Success\n");
return 0;
}
関連
-
[解決済み】CUDAドライバのバージョンがCUDAランタイムのバージョンに対して不足しています。
-
[解決済み】コマンドプロンプトからCUDAをコンパイルするとエラーになる。
-
[解決済み] このCUDAカーネルの起動パラメータを理解する
-
[解決済み] ファンネルシフトとは?
-
[解決済み] cudaMemcpyToSymbolとcudaMemcpyの比較 なぜまだ残っているのか (cudaMemcpyToSymbol)
-
[解決済み] nvcc fatal : Visual Studio 12.0 が PATH に追加されているが、コンパイラ 'cl.exe' が PATH に見つからない。
-
[解決済み] OSXでNVIDIA Cudaエラー「すべてのCUDA対応デバイスはビジー状態か使用不可」発生
-
[解決済み] バンクコンフリクトとは何ですか?(Cuda/OpenCLのプログラミングをする)
-
[解決済み] X サーバーを特定の GPU で実行するように xorg.conf ファイルを変更するにはどうすればよいですか?(複数のGPUを使用しています) [クローズド].
-
[解決済み】CUDAランタイムAPIを使用してエラーをチェックする標準的な方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】NVIDIA NVML Driver/library version mismatch [終了しました。]
-
[解決済み】コマンドプロンプトからCUDAをコンパイルするとエラーになる。
-
[解決済み] ジョブを実行するGPUはどのように選択するのですか?
-
[解決済み] Cudamemcpy関数の使用法
-
[解決済み] このCUDAカーネルの起動パラメータを理解する
-
[解決済み] nvcc fatal : Visual Studio 12.0 が PATH に追加されているが、コンパイラ 'cl.exe' が PATH に見つからない。
-
[解決済み] OSXでNVIDIA Cudaエラー「すべてのCUDA対応デバイスはビジー状態か使用不可」発生
-
[解決済み] ハードウェアなしでCUDAプログラミングができるGPUエミュレータ【終了しました
-
[解決済み] GPU上のCUDAアクティビティを監視するためのtopライクなユーティリティ
-
[解決済み] AMD GPU上でCUDAを動作させることは可能ですか?