2010-11-23 6 views
0

かなり簡単な質問を使用して、私はそれを動作させることはできません。私の主な機能(他のファイルにあります)でCUDA関数の構造体を使用するには?それらをリンクするには?私は、この構造体を持っている...</p> <p>をVS2008

struct Rand48 
{ 
    // strided iteration constants (48-bit, distributed on 2x 24-bit) 
    uint2 A, C; 
    // CUDA array -- random numbers for all threads 
    uint2 *state; 
    // random number for a single thread (used by CUDA device functions only) 
    uint2 state0; 

    // magic constants for rand48 
    static const unsigned long long a = 0x5DEECE66DLL, c = 0xB; 

    void init(int nThreads, int seed) { 
     uint2* seeds = new uint2[ nThreads ]; 

     cudaMalloc((void**) &state, sizeof(uint2)*nThreads); 

     // calculate strided iteration constants 
     unsigned long long A, C; 
     A = 1LL; C = 0LL; 
     for (unsigned int i = 0; i < (unsigned int)nThreads; ++i) { 
      C += A*c; 
      A *= a; 
     } 
     this->A.x = A & 0xFFFFFFLL; 
     this->A.y = (A >> 24) & 0xFFFFFFLL; 
     this->C.x = C & 0xFFFFFFLL; 
     this->C.y = (C >> 24) & 0xFFFFFFLL; 

     // prepare first nThreads random numbers from seed 
     unsigned long long x = (((unsigned long long)seed) << 16) | 0x330E; 
     for (unsigned int i = 0; i < (unsigned int)nThreads; ++i) { 
      x = a*x + c; 
      seeds[i].x = x & 0xFFFFFFLL; 
      seeds[i].y = (x >> 24) & 0xFFFFFFLL; 
     } 

     cudaMemcpy(state, seeds, sizeof(uint2)*nThreads, cudaMemcpyHostToDevice); 

     delete[] seeds; 
    } 

    void destroy() { 
     cudaFree((void*) state); 
    } 
}; 

それはcudamallocのようないくつかのCUDA機能、およびいくつかの正常な宿主のCコードを持っています。

どうすればこの作品を作成できますか? Like:

このコードを.cuファイルに置くと、VSはnvccを使用してこのコードをコンパイルします。しかし、私はmain.cppファイル(おそらく.cuを含む)の構造体の宣言を持っていないでしょう。 これを.hファイルに置くと、VSはint2と他のすべてのCUDAのことを宣言していないと不平を言うでしょう。

この構造体はどこに置く必要がありますか?これと私のメインをどのようにリンクさせることができますか?

答えて

0

問題を解決する方法は少なくとも3つあります。

main.cppをコンパイルするには、最初にnvccを使用してください。

C++の方法は、ポインタ・インプリメンテーション・パターン(pImpl)を使用することです。基本的には、Rand48クラスを2つの部分に分割します。公開メソッドはRand48に、唯一の非メソッドメンバーはImplへのポインタの前方宣言です。こうすることで、Rand48クラスを.hに入れることができます。Rand48::ImplにCUDA固有のコードを入れて、それをRand48クラス本体自体から切り離すことができます。

ではなく、Rand48クラスを前方に宣言し、Rand48*という非メンバー関数も宣言します。

+0

私のコードがうまく動作するようになった。 'http:// stackoverflow.com/questions/2090974/how-to-separate-cuda-code-into-multiple-files'を使用します。また、私はRand48が使用するすべてを宣言するヘッダーを含め、VSはそれを受け入れました。魅力のように働く。ありがとう。 – hfingler

関連する問題