如何为cpp和h文件创建别名,以便GCC可以编译不同命名后缀的文件?
如何让GCC忽略某些编译器属性而不必将它们包含在#ifdef
和#endif
语句中?
我正在用CUDA编写一个库,我希望能够在CPU和GPU上创建相同的对象。
如果用户没有NVCC(这是一个只有标题的库),我希望用户能够使用GCC进行编译。
无论如何我可以在忽略.cu
.cuh
和__host__
编译器属性的同时使GCC编译__device__
和__global__
文件,而不必简单地包装所有
的:
__host__
语句中的__device__
__global__
和#ifdef #endif
IE:#ifdef NVCC //将nvcc解释为.cu
文件
__host__ __device__
struct foo {
foo() {/*impl*/ }
};
ELSE://将GCC / Clang / etc解释为.cu
文件(以及.h
文件):
struct foo {
foo() {/*impl*/ }
};
答案 0 :(得分:2)
您可以在随处包含的头文件中执行以下操作:
#ifdef __CUDACC__
#define CUDAHOSTDEV __host__ __device__
#else
#define CUDAHOSTDEV
#endif
然后,无论你在哪里使用
__host__ __device__
你只需使用
CUDAHOSTDEV
我不知道这是否更容易,但如果您从头开始写东西,可能就更少打字了。
您可以看到一些特定于CUDA的nvcc
编译器定义here。
此外,我非常确定您可以将-x
开关传递给gcc / g ++,告诉它识别/使用哪种语言,而不依赖于文件后缀。
您可能还想看一下现有的高品质"像thrust这样的CUDA模板库可以看到它们的作用。
答案 1 :(得分:-1)
你需要#ifdef / /#endif,但是如果没有设置标志,你可以通过#defining扩展为空值的符号来使这些事情看起来更好:
#if defined(CCOMPILE_WITH_GPU)
#define MY_ATTRIBUTE xxx
#endif
MY_ATTRIBUTE void func();
而不是将#ifdef放在每个函数声明周围。