3

CUDA はどのようにcudaMemset()関数を実行しますか? スレッド数 = 要素数を起動してメモリの初期化を実装すると、かなりの時間を節約できることがわかりました。なぜそのような節約が達成されるのでしょうか。

4

1 に答える 1

2

cudaMemset は cuMemsetD8 または cuMemsetD8Aysnc を呼び出します。これは、ツールで簡単に判断できます。ドライバーの実装は、宛先アドレスのアライメント、書き込む値のサイズ、および書き込むバイト数に基づいて実行を最適化しようとします。これは、いくつかのベンチマークを作成することで簡単に判断できます。CUDA 実装は、すべてのケース (8 ビットのアライメント、末尾など) を処理する必要があります。非常に特殊なケース (32 ビット アライン、4 で割り切れる) がある場合は、CPU オーバーヘッドに関してドライバー実装のパフォーマンスを超えるカーネルを作成できるはずです。GPU の実行時間はほぼ同じです。

メモリを効率的に書き込むという点では、いくつかのデバイス制限を考慮する必要があります。

  • 各 SM は、サイクルごとに 1 つの LSU 命令を発行できます。これを実現するには、Fermi では 2 つのワープが必要で、Kepler では 4 つのワープが必要です。
  • 各 SM は、サイクルごとに L2 への書き込みを 1 回実行できます。

要素ごとに 1 つのスレッド (8 ビットまたは 128 ビット) の単純なマッピングは実装が簡単で、サイズが WARP_SIZE の倍数でない場合は条件付きチェックを処理するのがかなり簡単です。

于 2012-09-08T20:04:45.980 に答える