第 3 章 CUDA の概要
「超並列プロセッサ プログラミングの実践」の学習。他の章ではCUDA Cのコラムに焦点を当てています。
CUDA C プログラミングに適したリンク:
- 第 3 章 CUDA の概要 - CUDA C プログラミング ベクトルの追加
- 第4章 CUDAデータ並列実行モデル
- 第5章 CUDAメモリ
- 第 6 章 CUDA パフォーマンスの最適化 (原書へのリンク付き)
- カーネル関数: CUDA プログラミング入門 (1) - スレッドの構成とイメージ操作によるカーネル関数の使用方法を参照
- 拡張: CUDA 畳み込みの計算と最適化 - 1 次元の畳み込みを例にします
この章では主にベクトル加算のvector addを起点として、c言語のベクトル加算のコードをcuda拡張c言語のベクトル加算に書き換える方法を説明します。
1.1 従来のベクトルの追加
従来のベクトル加算はループで実装されます
1.2 CUDA追加高速化
CUDA ベクトル加算は、マルチスレッド CUDA 加算を通じて並列に実装されます。つまり、n 個のスレッドを同時に開き、各スレッドが 1 つの加算を計算し、長さ n のベクトルが同期的に計算されます。CUDA 拡張機能を使用するプログラムには、次の 3 つの手順が必要です。
- まずデバイス(device、cuda)のメモリ(memory)を申請し、ホスト(host)からデバイス(device)にデータをコピーします。
- デバイス API を使用して、要求されたメモリを操作します。(デバイス上の操作はカーネル関数の形式で実行されます)
- 計算結果をホストにコピーして戻します
加算関数の具体的な実装
マルチスレッド形式でベクトルを操作する場合、複数のスレッドがスレッド ブロックの形式で存在します。スレッド ブロックには blockDim (たとえば 256) スレッドが含まれており、各スレッドは同じコードを実行します。
追加コードは次のとおりです。ここで、threadIdx.x は、このスレッド ブロック内のスレッドのインデックスを示します。つまり、i 番目のブロックでは、スレッドは j 番目、0<=j<=blockDim-1 です。i の計算は、すべてのブロック内のスレッドのインデックスです。つまり、i=このブロック インデックス + ブロック blockDim スレッド * blockIdx スレッド ブロック:
CUDA クロスプログラミング環境では、デフォルトのコードがホスト上で実行されることに注意してください。デバイス上で実行する場合は、次のようなグローバルな変更が必要です。
カーネル関数パラメータ
カーネル関数に戻ります。構成パラメータは <<< >>> の間にあり、
- ceil(n/256.0) には n/256 スレッド ブロックが必要です
- 256 各スレッド ブロックには 256 の子スレッドがあります