問題タブ [gpu-shared-memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - カーネルが共有メモリの制限を超えないのはなぜですか?
matlabからCUDAカーネルを呼び出しています。
以前、(David Kirkの本)スレッドごとに16kbの共有メモリしか使用できないと言われましたが、それよりはるかに多くを消費することができます。
CUDA Cは、floatが4バイトであることを報告します。これは、アレイの合計サイズが48Kbであり、12Kbより大きいことを意味します。それはうまく動作します、それでこれはどうしてできますか?
また、GPUで共有メモリのサイズが非常に小さいと言われて います-それについて何ができますか? ブロックごとの最大共有メモリが重要であること。カードのブロックあたりの最大共有メモリは49152バイトですが、ブロックあたり1000スレッドで上記のコードを実行できます。
ブロックあたり49Kbを使用するようですが、これは正しくありません。SMは一度に1つのブロックのみを処理し、ドンではスレッドブロックあたり49Kbしか存在できないという条件を維持しているのでしょうか。
ブロックあたり49Kbの共有メモリとスレッドあたり16Kbの共有メモリはどのように調整されますか?
ありがとう
memory-management - 共有/ローカルメモリのCUDA効率的な使用?
CUDAの共有/ローカルメモリに関しては、まだ少しわかりません。現在、私はカーネルを持っています。カーネル内で、各スレッドはリストオブジェクトを割り当てます。このようなもの
私の現在の理解では、各スレッドはdlist
ローカルメモリに保存されますが、これは本当ですか?その場合、カーネルの実行の最後にdlist
(別のカーネルから)各オブジェクトを取得する方法はありますか、それとも__shared__
最初のスレッドによって割り当てられた動的リストの配列を使用する必要がありますか?
少し複雑すぎるかもしれませんが、リストを変更する必要はありません。私が達成しようとしている実行は、次のようになります。
- リストを作成する(GPUでのみ実行)
- 各リストから出力を生成します(GPUで、各スレッドによって実行され、そのスレッドに割り当てられたリストからの情報のみが必要です)。
- リストの変更/交換(GPUで引き続き実行)
- ホストでいくつかのブレーク条件が満たされるまで、2と3を繰り返します
前もって感謝します!
cuda - 共有メモリ経由でカーネル パラメータを渡す価値はありますか?
array があるとしint * data
ます。各スレッドはこの配列の 1 つの要素にアクセスします。この配列はすべてのスレッド間で共有されるため、グローバル メモリ内に保存されます。
テストカーネルを作成しましょう:
data
を使用してこの配列にメモリを割り当てたため、配列がグローバルメモリにあることは確かですcudaMalloc
。他の変数については、メモリを割り当てずに整数をカーネル関数に直接渡す例をいくつか見てきました。私の場合、そのような変数はa
b
とc
です。
私が間違っていなければ、cudaMalloc
3 つの整数ごとに 4 バイトを割り当てるために直接呼び出すことはしませんが、CUDA が自動的にそれを行うため、最終的に変数a
b
とc
グローバル メモリに割り当てられます。
現在、これらの変数は補助的なものにすぎず、スレッドはそれらを読み取るだけで、他には何もありません。
私の質問は、これらの変数を共有メモリに転送した方がよいでしょうか?
たとえば、スレッドを10
含むブロックがある場合、各ブロックの共有メモリに数値を格納するには、バイトの読み取りが必要になると思います。1024
10*3 = 30
4
共有メモリがなく、各スレッドがこれら 3 つの変数すべてを 1 回読み取る必要がある場合、グローバル メモリの読み取りの合計量1024*10*3 = 30720
は非常に非効率的になります。
ここに問題があります。私はCUDAに少し慣れていないので、各スレッドがグローバルメモリからこれらの変数を読み取ってロードすることなく、変数のメモリと各ブロックの共有メモリに転送できるかどうかわかりa
b
ませc
んしたがって、最終的にグローバル メモリ読み取りの合計量は であり1024*10*3 = 30720
、 ではありません10*3 = 30
。
次のWeb サイトに、この例があります。
ここで、各スレッドは共有変数内に異なるデータをロードしますs
。したがって、各スレッドは、そのインデックスに従って、指定されたデータを共有メモリ内にロードします。
私の場合、変数のみを共有メモリにロードしたいと考えてa
b
いc
ます。これらの変数は常に同じで、変更されないため、スレッド自体とは何の関係もありません。これらは補助的なものであり、各スレッドが何らかのアルゴリズムを実行するために使用されています。
この問題にどのようにアプローチすればよいですか?total_amount_of_blocks*3
グローバルメモリの読み取りのみを行うことでこれを達成することは可能ですか?
cuda - グローバル メモリから 2D データをロードするときの CUDA Fortran での共有メモリ バンクの競合
共有メモリにデータをロードするためにグローバル メモリにアクセスしていますが、バンクの競合があるかどうかを知りたいです。セットアップは次のとおりです。
グローバル メモリ内: g_array
. サイズ (256, 64) の 2D 行列
これは、配列データをグローバル メモリから共有メモリにロードする方法です。gridDim (4, 1) と blockDim (16, 16) でカーネルを呼び出しました。
cuda - Fermi 以降での共有メモリ バンクの競合の関連性
CUDA ドキュメントで読んだことによると、共有メモリ バンクの競合は sm_20 以降では無関係です。これは、値が同時に要求されたときにブロードキャストされ、シリアライゼーションの遅延が防止されるためです。
ドキュメント:
コンピュート機能 2.x のデバイスで共有メモリ ハードウェアが改善され、複数のブロードキャスト ワードをサポートし、スレッドあたり 8 ビット、16 ビット、64 ビット、または 128 ビットのアクセスで発生するバンク競合が少なくなりました (セクション G. 4.3)。
誰かが私の主張を確認できますか?
cuda - Nvidia プラットフォームを使用して OpenCL のローカル (共有) メモリを構成する
OpenCL カーネル内でローカル メモリ アクセス パターンを最適化したいと考えています。構成可能なローカルメモリについてどこかで読みました。たとえば、ローカル メモリに使用する量と自動キャッシュに使用する量を構成できる必要があります。
また、最新の (Kepler) Nvidia ハードウェアのバンク サイズを選択できることも読みました: http://www.acceleware.com/blog/maximizing-shared-memory-bandwidth-nvidia-kepler-gpus。この点は、倍精度値をローカル メモリに格納する場合に非常に重要と思われます。
Nvidia は、CUDA ユーザー専用のローカル メモリを設定する機能を提供していますか? OpenCL の同様のメソッドが見つかりません。では、これは別の方法で呼び出されているのでしょうか、それとも実際には存在しないのでしょうか?
cuda - cudaFuncSetCacheConfig - すべてのデバイスまたは現在のデバイスに適用されますか?
関数を呼び出したcudaFuncSetCacheConfig
場合 (Kepler デバイスと Maxwell デバイスで、より多くの L1、より多くの共有メモリ、または同量のいずれを優先するかを選択します) は、システム上のすべてのデバイスでのそのカーネルの起動に適用されますか、それとも現在のデバイスのみに適用されますか? (API リファレンスは実際には言いません)