0

Thrust (cuda api) と openMP テクノロジの両方を使用するビルドとプロジェクトです。私のプログラムの主な目的は、何かを計算するためのインターフェイスを提供することです。そのために、私は STRATEGY デザイン パターンを使用することにしました。これは基本的に、仮想関数を使用して基本クラスを定義し、次にその基本クラスから派生して必要な関数を実装する他のクラスを定義する必要があることを意味します。

私の問題はここから始まります: 1。プロジェクトに複数の .CU ファイルを含めることはできますか? 2. CU ファイルにクラスの宣言を含めることはできますか?

  class foo 
        {
            int m_name;
            void doSomething();
        }

3. これは続きます 2. 、DEVICE カーネルはクラス内で宣言できず、次のように実行する必要があることに気づきました。

//header file
__DEVICE__ void kernel(int x, inty)
{.....
}

class a : foo
{
   void doSomething();
}

//cu file

void a::doSomething()
{
  kernel<<<1,1>>>......();
}

それは正しい方法ですか?4.最後の質問は、私は THRUST を使用していますが、CU ファイルも使用する必要がありますか?

ありがとう、イガル

4

1 に答える 1

2
  1. はい、.cuプロジェクトで複数のファイルを使用できます。
  2. はい、ただし制限があります。*CUDA_C_Programming_Guide* v.4.0、セクション 3.1.5 によると:

    コンパイラのフロントエンドは、C++ 構文規則に従って CUDA ソース ファイルを処理します。ホスト コードでは完全な C++ がサポートされています。ただし、付録 D で説明されているように、C++ のサブセットのみがデバイス コードに対して完全にサポートされています。C++ 構文規則の使用の結果として、void ポインター (たとえば、malloc() によって返される) を非 void ポインターに割り当てることはできません。タイプキャストなし。

  3. あなたはほとんど正しいです。__global__カーネルを宣言するときは、キーワードを使用する必要があります。

    __global__ void kernel(int x, inty)
    {.....
    }
    
  4. はい、そうです。実際、推力ブーストされたデバイス コードは でコンパイルする必要がありますnvcc。詳細についてthrustは、ドキュメントを参照してください。

一般に、次のようにプログラムをコンパイルします。

    $ nvcc -c device.cu
    $ g++  -c host.cpp   -I/usr/local/cuda/include/
    $ nvcc device.o host.o

あるいは、g++ を使用して最終的なリンク手順を実行することもできます。

    $ g++ tester device.o host.o -L/usr/local/cuda/lib64 -lcudart

-IWindows では、との後のパスを変更します-L。また、私の知る限り、clコンパイラ (MS Visual Studio) を使用する必要があります。

注 1: x86/x64 の互換性に注意してください。64 ビットの CUDA Toolkit を使用する場合は、64 ビットのコンパイラも使用してください。(チェック-m32-m64オプションnvccも)

注 2: device.cuカーネルと、カーネルを呼び出す関数が含まれています。この関数には、注釈を付ける必要がありextern "C"ます。クラスを含めることができます (制限が適用されます)。 (カーネルではない) にある関数の宣言host.cppを含む純粋な C++ コードが含まれています。extern "C" device.cu

于 2011-11-04T17:01:38.087 に答える