CUDA C プログラミング ベクトルの追加 - 第 3 章 CUDA の概要

第 3 章 CUDA の概要

「超並列プロセッサ プログラミングの実践」の学習。他の章ではCUDA Cのコラムに焦点を当てています。

CUDA C プログラミングに適したリンク:

この章では主にベクトル加算のvector addを起点として、c言語のベクトル加算のコードをcuda拡張c言語のベクトル加算に書き換える方法を説明します。

1.1 従来のベクトルの追加

従来のベクトル加算はループで実装されます
ここに画像の説明を挿入

1.2 CUDA追加高速化

CUDA ベクトル加算は、マルチスレッド CUDA 加算を通じて並列に実装されます。つまり、n 個のスレッドを同時に開き、各スレッドが 1 つの加算を計算し、長さ n のベクトルが同期的に計算されます。CUDA 拡張機能を使用するプログラムには、次の 3 つの手順が必要です。

  1. まずデバイス(device、cuda)のメモリ(memory)を申請し、ホスト(host)からデバイス(device)にデータをコピーします。
  2. デバイス API を使用して、要求されたメモリを操作します。(デバイス上の操作はカーネル関数の形式で実行されます)
  3. 計算結果をホストにコピーして戻します
    ここに画像の説明を挿入

加算関数の具体的な実装

マルチスレッド形式でベクトルを操作する場合、複数のスレッドがスレッド ブロックの形式で存在します。スレッド ブロックには blockDim (たとえば 256) スレッドが含まれており、各スレッドは同じコードを実行します。
ここに画像の説明を挿入

追加コードは次のとおりです。ここで、threadIdx.x は、このスレッド ブロック内のスレッドのインデックスを示します。つまり、i 番目のブロックでは、スレッドは j 番目、0<=j<=blockDim-1 です。i の計算は、すべてのブロック内のスレッドのインデックスです。つまり、i=このブロック インデックス + ブロック blockDim スレッド * blockIdx スレッド ブロック:
ここに画像の説明を挿入

CUDA クロスプログラミング環境では、デフォルトのコードがホスト上で実行されることに注意してください。デバイス上で実行する場合は、次のようなグローバル変更が必要です。
ここに画像の説明を挿入

カーネル関数パラメータ

カーネル関数に戻ります。構成パラメータは <<< >>> の間にあり、

  • ceil(n/256.0) には n/256 スレッド ブロックが必要です
  • 256 各スレッド ブロックには 256 の子スレッドがあります
    ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_40491305/article/details/114528176