gpt4 book ai didi

c++ - CUDA 中是否有预处理器宏告诉我们是否正在编译设备代码?

转载 作者:行者123 更新时间:2023-11-30 00:38:32 24 4
gpt4 key购买 nike

我想定义一个在设备和主机代码之间共享的指针类型,并在内部将设备和主机指针存储到共享内存。我希望它在编译时确定实际返回哪个指针:

#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__ 函数定义,而不仅仅是 nvcc 碰巧处理的所有内容?还是我需要分离我的代码?

最佳答案

__CUDA_ARCH__ 仅适用于设备代码。您可以使用它指定设备代码行为。这个宏实际上获得了设备代码的计算能力(比如 2.0 的 200。)

关于c++ - CUDA 中是否有预处理器宏告诉我们是否正在编译设备代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10457951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com