カーネルの分離。プロジェクトで、2 つのファイルを作成します (デフォルトのランタイム プロジェクト テンプレートをリファクタリングし、device.cu と host.cu を作成しました)。
device.cu:
__device__ unsigned int bitreverse(unsigned int number) {
number = ((0xf0f0f0f0 & number) >> 4) | ((0x0f0f0f0f & number) << 4);
number = ((0xcccccccc & number) >> 2) | ((0x33333333 & number) << 2);
number = ((0xaaaaaaaa & number) >> 1) | ((0x55555555 & number) << 1);
return number;
}
__global__ void bitreverse(void *data) {
unsigned int *idata = (unsigned int*) data;
idata[threadIdx.x] = bitreverse(idata[threadIdx.x]);
}
host.cu:
extern __global__ void bitreverse(void *data);
...
bitreverse<<<1, WORK_SIZE, WORK_SIZE * sizeof(int)>>>(d);
別編編集
- プロジェクトを右クリックし、プロパティに移動します。
- ビルド/設定。
- SM 2.0 以降のセットアップ ビルド。
- 「別編集」ラジオを選択。
device.cu:
__device__ unsigned int bitreverse(unsigned int number) {
number = ((0xf0f0f0f0 & number) >> 4) | ((0x0f0f0f0f & number) << 4);
number = ((0xcccccccc & number) >> 2) | ((0x33333333 & number) << 2);
number = ((0xaaaaaaaa & number) >> 1) | ((0x55555555 & number) << 1);
return number;
}
host.cu:
extern __device__ unsigned int bitreverse(unsigned int number);
__global__ void bitreverse(void *data) {
unsigned int *idata = (unsigned int*) data;
idata[threadIdx.x] = bitreverse(idata[threadIdx.x]);
}
...
bitreverse<<<1, WORK_SIZE, WORK_SIZE * sizeof(int)>>>(d);
CUDA コードを分離する 一般的なパターンの 1 つは、カーネル呼び出しをラップするホスト関数を含む .cu ファイルに CUDA コードを分離することです。このようにして、そのような .cu ファイルから生成されたオブジェクト ファイルを、.cpp または .c ファイルで記述されたホスト コードにリンクできます。エクスポートされたホスト コード関数はextern "C"
、.c ファイルから使用できるように修飾する必要があることに注意してください。
extern
宣言は .h ファイルに入れることができます。CUDA C 構文 (CUDA C 固有) を持つ .h ファイルは__global__
、.cpp または .c に含めることができないことに注意してください。
プロジェクトへのファイルの追加
通常、ファイルをプロジェクト フォルダーにコピーし、プロジェクトを右クリックして [更新] を実行します。Nsight はそれらにインデックスを付け、ビルドに含めます。
ビルドからのファイルの除外
絶対に必要な場合は、デバイス コードをヘッダーにコピーしてヘッダーを含めることができます (このようなヘッダー ファイルには .cuh 拡張子を付けるのが慣例ですが、.h も同じように機能します)。.cu を含めることができます。問題は、Nsight がそのようなファイルをソース ファイルと見なし、それらをコンパイルしようとすることです。ビルド プロパティのビルド サブツリーのプロパティ ページの上部にある [ビルドからリソースを除外する] チェックボックスをオンにすることで、ビルドから .cu ファイルを除外できます。
CUDA マルチファイル サンプル
ほとんどの重要なサンプルは、複数のファイルに分割されています。たとえば、「Particles」サンプルから Nsight プロジェクトを作成するだけです。