【发布时间】:2022-01-14 23:03:40
【问题描述】:
我正在开发一个在 C 中同时使用 GLib 和 CUDA 的应用程序。在为 .cu 文件同时导入 glib.h 和 cuda_runtime.h 时似乎存在冲突。
7 个月前 GLib 进行了更改以避免与 pixman 的宏发生冲突。他们在 gmacros.h 中的标记 noinline 前后添加了 __:https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2059
鉴于 gcc 声称,这应该有效:
您可以选择在名称前后使用
__指定属性名称。这允许您在头文件中使用它们,而不必担心可能的同名宏。例如,您可以使用属性名称__noreturn__而不是 noreturn。
但是,CUDA 确实在其宏中使用了__,__noinline__ 就是其中之一。他们承认可能的冲突,并添加了一些编译器检查以确保它不会在常规 c 文件中发生冲突,但似乎在 .cu 文件中它仍然适用:
#if defined(__CUDACC__) || defined(__CUDA_ARCH__) || defined(__CUDA_LIBDEVICE__)
/* gcc allows users to define attributes with underscores,
e.g., __attribute__((__noinline__)).
Consider a non-CUDA source file (e.g. .cpp) that has the
above attribute specification, and includes this header file. In that case,
defining __noinline__ as below would cause a gcc compilation error.
Hence, only define __noinline__ when the code is being processed
by a CUDA compiler component.
*/
#define __noinline__ \
__attribute__((noinline))
我对 CUDA 开发很陌生,这显然是他们和 gcc 都知道的一个可能的问题,所以我只是缺少编译器标志或其他东西吗?或者这是 GLib 需要解决的真正冲突?
环境: glib 2.70.2、cuda 10.2.89、gcc 9.4.0
编辑:我提出了一个 GLib 问题 here
这可能不是 GLib 的错,但鉴于迄今为止答案的不同意见,我将把它留给那里的开发人员来决定是否使用 NVidia 提出它。
我现在使用了 nemequ 的解决方法,它可以毫无怨言地编译。
【问题讨论】:
-
CUDA 工具链使用 gcc 编译其大部分代码,并且 NVIDIA 集成遵循 gcc 推荐的用户端宏命名的确切做法,您在问题中引用了该做法。自第一个测试版发布以来,它一直以这种方式工作。不幸的是,glib 开发人员已将冲突集成到他们的标头中,但您不应该期望可以从 CUDA 方面解决任何问题
-
GLib 开发人员没有将冲突集成到他们的头文件中。 GLib 正确使用了
__noinline__属性名称,期望它由编译器提供。 CUDA 在为编译器保留的以下划线为前缀的命名空间中定义宏是错误的(例如,参见stackoverflow.com/a/35243083/2931197)。 -
@Philip:您可能会争辩说 Nvidia 的宏定义是编译器的一部分。 GLib 库绝对不是编译器的一部分,我认为 gcc 对带有双下划线的用户属性的注释可能违反了关于保留标识符的 C++ 标准,或者至少只与 gcc 兼容而与其他编译器不兼容。
-
另一个问题是:如何在 Cuda 设备代码中使用 glib?