構造体と配列にある非常に大量の変数を管理するカーネルを作成しています。(グローバル メモリを介して割り当てられた変数を使用している場合cudaMalloc
) 計算が非常に遅くなることはわかっています (試してみたところ、アルゴリズムの順次バージョンよりも結果が遅くなります)。
データの配列をカーネルの変数にコピーすると、パフォーマンスが向上しますか?
カーネル メモリ (「ローカル メモリ」と呼ぶべきですよね?) は、グローバル メモリよりも高速である必要があります。
構造体と配列にある非常に大量の変数を管理するカーネルを作成しています。(グローバル メモリを介して割り当てられた変数を使用している場合cudaMalloc
) 計算が非常に遅くなることはわかっています (試してみたところ、アルゴリズムの順次バージョンよりも結果が遅くなります)。
データの配列をカーネルの変数にコピーすると、パフォーマンスが向上しますか?
カーネル メモリ (「ローカル メモリ」と呼ぶべきですよね?) は、グローバル メモリよりも高速である必要があります。
ローカルメモリはグローバルメモリと同じくらい遅いです。データが大きすぎてレジスタまたは共有メモリに格納できず、書き込み操作が必要ない場合は、テクスチャメモリまたは定数メモリを使用してみてください。これらはキャッシュされるため、グローバルメモリよりも高速です。
CUDAの仕組みについて少し混乱していると思います。できる限りお役に立てるよう努めますが、CUDA プログラミング ガイドと CUDA に含まれるサンプルを参照することを強くお勧めします。構造体に関する作業については、Black Scholes の例をお勧めします。
cudaMalloc(グローバルメモリ...右?)を介して割り当てられた変数を使用している場合、計算が非常に遅くなることはわかっています(試してみましたが、結果はアルゴリズムの順次バージョンよりも遅くなります)
はい、cudaMalloc を使用して GPU デバイスにグローバル メモリを割り当てます。正しいです。計算は必ずしも遅くなる必要はありませんが、低速の定義によっては、大量のデータをデバイス (GPU) メモリにコピーするプロセスが遅くなる場合があります。CUDA でデバイスへのメモリのコピーを制限することは常に良いことです。
データの配列をカーネルの変数にコピーすると、パフォーマンスが向上しますか? カーネル メモリ (「ローカル メモリ」と呼ぶべきですよね?) は、グローバル メモリよりも高速である必要がありますか?
このステートメントは意味がありません。デバイスのメモリがどのように機能するかを理解していないと思います。
さらに進むまで、メモリの最適化について心配する必要はありません。特に、すべての CUDA 呼び出しでエラー、特に CudaMalloc と CudaMemcpy をチェックする必要があります。そうしないと、重大な問題が発生します。
GPU プログラミングを実際に学習することを計画している場合は、それについて多くのことを読み、サンプル プログラムをチェックすることをお勧めします。そうでない場合は、プログラマーでなくても GPU を使用するための既存のソフトウェアを確認する必要があります。特に、Thrustはこの目的、特に Map/Reduce スタイルのタスクに非常に優れています。