2012-05-05 44 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文件中的某個函數使用該函數時定義)。但是在.cu文件中的__host__函數中,我得到了devptr。很明顯,.cu文件是由nvcc專門處理的。是否有一些其他的預處理器宏僅爲__global____device__函數定義,而不僅僅是nvcc恰好處理的所有內容?或者我需要分離我的代碼?

+0

我想我也可以擁有我自己的宏,它在每個cu文件的開頭定義,並且如果有必要,我可以選擇性地取消定義... – masterxilo

回答

5

__CUDA_ARCH__僅適用於設備代碼。您可以使用它指定設備代碼行爲。 這個宏實際上得到了設備代碼的計算能力(比如200代表2.0)。

+0

啊,太好了,謝謝。 – masterxilo

相關問題