繁体   English   中英

如何为cpp和h文件创建别名(并忽略编译器__attributes__)

[英]How to create alias for cpp and h files (and ignoring compiler __attributes__)

如何为cpp和h文件创建别名,以便GCC可以编译具有不同命名后缀的文件?

如何使GCC忽略某些编译器属性,而不必将其包装在#ifdef#endif语句中?


阐述:

我正在使用CUDA编写一个库,希望在其中可以在CPU和GPU上创建相同的对象。

如果用户没有NVCC(这是仅标头的库),我希望用户能够使用GCC进行编译。

无论如何,我可以使GCC编译.cu.cuh文件,而忽略__host__ __device____global__编译器属性,而不必简​​单地包装所有内容

#ifdef #endif语句中的__host__ __device____global__


IE:#ifdef NVCC //已将nvcc解释为.cu文件

__host__ __device__ 
struct foo {
    foo() {/*impl*/ }
};

ELSE://具有GCC / Clang / etc这样的.cu文件(以及.h文件):

struct foo {
    foo() {/*impl*/ }
};

您可以在随处可见的头文件中执行以下操作:

#ifdef __CUDACC__ 
#define CUDAHOSTDEV __host__ __device__
#else
#define CUDAHOSTDEV
#endif

然后,无论您在哪里使用

__host__ __device__

你只用

CUDAHOSTDEV

我不知道这是否更容易,但是如果您是从头开始编写的话,键入的内容可能会更少。

您可以在此处看到一些特定于CUDA的nvcc编译器定义。

另外,我非常确定您可以将-x开关传递给gcc / g ++,以告诉它可以识别/使用哪种语言,而与文件后缀无关。

您可能还想看一下现有的“高质量” CUDA模板库,例如推力,以了解它们的作用。

您将需要在某个地方#ifdef / /#endif,但通常可以通过#definable如果未设置该标志,将符号扩展为空值来使这些事情看起来更好:

#if defined(CCOMPILE_WITH_GPU)
#define MY_ATTRIBUTE xxx
#endif

MY_ATTRIBUTE void func();

而不是将#ifdef放在每个函数声明周围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM