CUDA 中是否有预处理器宏可以告诉我们是否正在编译设备代码

Is there a preprocessor macro in CUDA that tells whether we are compiling device code?

本文关键字:是否 编译 我们 代码 预处理 处理器 CUDA      更新时间:2023-10-16

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

#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 文件(仅当 cu 文件中的某个函数使用该函数时才定义__CUDACC__(的代码中使用这些指针,就可以正常工作。但是,在 .cu 文件中__host__函数中,我得到了devptr.显然,.cu文件仅由NVCC处理。是否有其他一些预处理器宏仅针对__global____device__函数定义,而不仅仅是 nvcc 碰巧处理的所有内容?还是我需要分离我的代码?

__CUDA_ARCH__实际上

仅适用于设备代码。您可以使用它指定设备代码行为。此宏实际上获取设备代码的计算能力(例如 2.0 的 200(。