我想定義設備和主機代碼之間共享的指針類型,並在內部存儲設備和主機指向共享內存。我希望它確定在編譯的時候,它的指針實際回報: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恰好處理的所有內容?或者我需要分離我的代碼?
我想我也可以擁有我自己的宏,它在每個cu文件的開頭定義,並且如果有必要,我可以選擇性地取消定義... – masterxilo