CUDA 中是否有预处理器宏可以告诉我们是否正在编译设备代码
Is there a preprocessor macro in CUDA that tells whether we are compiling device code?
我想定义一个在设备和主机代码之间共享的指针类型,并在内部存储指向共享内存的设备和主机指针。我希望它在编译时确定实际返回哪个指针:
#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(。
相关文章:
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 关于std::move的使用,是否有编译警告
- 标准是否严格定义了该程序应该如何编译?
- 是否可以在编译时限制类的实例数?
- 检查编译时是否存在静态函数
- 是否可以编译 Gtk+ 应用程序以同时在 Gtk 2 和 3 上运行
- std::less是否应该允许在编译时比较不相关的指针?
- 编译时检查特征专用化是否具有唯一 ID
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何确定integer_sequence在编译时是否包含给定的数字?
- 知道模板参数在编译时是否为 const char*?
- 全局变量在 C++ 中是否显着提高了编译速度?
- 检查该类在编译时C++中是否有任何基类
- 如何判断是否在编译时计算了"constexpr"(无需手动检查)
- cMake/cTest:检查代码是否编译
- 我怎么知道编译器是否C++编译时计算表达式
- 在线编译器工具是否执行所有操作,或者它们只是检查是否编译
- constexpr数组成员是否编译时间常量
- 检查表达式是否编译的可移植方法