我想定义一个在设备和主机代码之间共享的指针类型,并在内部存储指向共享内存的设备和主机指针。我希望它在编译时确定哪个指针实际返回:
#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 :(得分:6)
__CUDA_ARCH__
仅适用于设备代码。您可以使用它指定设备代码行为。
这个宏实际上获得了设备代码的计算能力(例如200的2.0)。