【问题标题】:Is there a preprocessor macro in CUDA that tells whether we are compiling device code?CUDA 中是否有一个预处理器宏来告诉我们是否正在编译设备代码?
【发布时间】:2012-05-14 12:52:38
【问题描述】:

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

#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 发生的所有处理?还是我需要分开我的代码?

【问题讨论】:

  • 我想我也可以拥有自己的宏,它在每个 cu 文件的开头定义,如果需要我可以选择性地取消定义......

标签: c++ cuda c-preprocessor


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2011-07-05
    • 2016-11-02
    • 2019-09-13
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多