1

多くのソース ファイル (例: main.cu、a.cu、b.cu、c.cu、d.cu) を含むプロジェクトがあります。それぞれに関数とカーネル呼び出し ( globaldevice ) があります。

ヘッダー (cpu.h) には、ホスト側で使用されるすべての構造と定義があります。別のヘッダー (gpu.h) デバイス側で使用されるすべての構造と定義。

  1. a.cuで宣言されたmain.cuからカーネル関数を呼び出す場合。推奨されていない#include "a.cu"を実行せずに、 a.cuで宣言されたカーネル関数をmain.cuで使用するように#includeするにはどうすればよいですか?

  2. a.cuでカーネル関数の前方宣言を含むヘッダーahを作成しますか? 例: extern void functionA(type);

CUDA カーネル関数はどうですか? 別のソース ファイルから使用されるソース ファイルごとにヘッダー ファイルを作成する必要がありますか?

  • 複数のソース ファイルを含む単純な CUDA の例はどこにありますか?

Nsight Eclipse と複数のソースで多くの問題を抱えているため、Nsight Eclipse について言及します。Ubuntu Linux および Mac OS 環境で CUDA 5.5 ツールキットを使用しています。私の主な開発環境は、Ubuntu Linux マシンに 4 枚の Tesla C1060 カードを使用しています。

4

1 に答える 1

3
  1. カーネルの分離。プロジェクトで、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);
    
  2. 別編編集

    1. プロジェクトを右クリックし、プロパティに移動します。
    2. ビルド/設定。
    3. SM 2.0 以降のセットアップ ビルド。
    4. 「別編集」ラジオを選択。

    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);
    
  3. 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 プロジェクトを作成するだけです。

于 2013-09-30T20:12:30.320 に答える