2012-05-05 5 views
0

デバイスとホストコード間で共有され、デバイスとホストポインタを共有メモリに内部的に格納するポインタ型を定義したいと思います。デバイスコードをコンパイルするかどうかを示すプリプロセッサマクロがCUDAにありますか?

#define F inline __host__ __device__ 

class SharedMemory; 
/** 
* 
* Can only be set by allocating shared memory. 
*/ 
template<typename T> 
class SharedMemoryPtr { 
public: 
    SharedMemoryPtr() : hptr(0), dptr(0) {} 

    //F ~ SharedMemoryPtr() {cudaFreeHost(hptr);} // Should be freed explicitly (?) 

    // TODO: Don't allow copying/overwriting (at least not without freeing memory...) 

    F T& operator()() { 
#ifdef __CUDACC__ 
     return *dptr; 
#else 
     return *hptr; 
#endif 
    }; 

    F T* operator->() { 
#ifdef __CUDACC__ 
     return dptr; 
#else 
     return hptr; 
#endif 
    }; 

    F T& operator *() { 
#ifdef __CUDACC__ 
     return *dptr; 
#else 
     return *hptr; 
#endif 
    }; 

    F T& operator[] (__int64 i) const { 
#ifdef __CUDACC__ 
     return *(dptr + i); 
#else 
     return *(hptr + i); 
#endif 
    }; 

    friend SharedMemory; 

    // TODO: Make obsolete (possible?) 

    T * getHptr() {return hptr;} 
    T * getDptr() {return dptr;} 

private: 

    T *hptr, *dptr; 
}; 

class SharedMemory { 
public: 
    template<typename T> 
    static SharedMemoryPtr<T> allocate(int count = 1) { 
     assert(count > 0); 

     SharedMemoryPtr<T> sptr; 

     cutilSafeCall(
      cudaHostAlloc(&sptr.hptr, sizeof(T) * count, cudaHostAllocMapped)); 
     assert(sptr.hptr); 
     cutilSafeCall(
      cudaHostGetDevicePointer(&sptr.dptr, sptr.hptr, 0)); 
     assert(sptr.dptr); 

     return sptr; 
    } 
}; 

これは限り私はどちらかのcppファイルに(__CUDACC__が定義されることはありません)されているコードでこれらのポインタを使用すると正常に動作しますか:私はそれはコンパイル時に決定したい、そのポインタが実際に戻ります.hファイル(__CUDACC__は、関数がcuファイル内の一部の関数によって使用されている場合にのみ定義されます)。しかし、__host__ファンクションの.cuファイルには、devptrがあります。明らかに、.cuファイルはnvccによって排他的に処理されます。 __global____device__関数のためだけに定義されている他のプリプロセッサマクロはありますか?それともコードを分ける必要がありますか?

+0

私は自分のマクロを持つこともできると思います。これはすべてのcuファイルの始めに定義され、 ... – masterxilo

答えて

5

__CUDA_ARCH__は実際のデバイスコードです。デバイスコードの動作を指定することができます。 このマクロは実際にはデバイスコードの計算能力を得ます(2.0の場合は200のように)。

+0

ああ、ありがとう、ありがとう。 – masterxilo

関連する問題