预处理指令 GPU

Preprocessing directives GPU

提问人:aaries 提问时间:4/24/2023 最后编辑:aaries 更新时间:4/24/2023 访问量:102

问:

我有一个 C/C++ 包,我在其中使用了一些 GPU 加速方法,用于 Nvidia 硬件的 CUDA 和用于非 Nvidia 硬件的 OpenCL。我还有特定于 Intel CPU 的 SIMD 函数和一些特定于 ARM 的函数。我希望能够根据使用 CMake 构建时传入的安装标志安装这些不同的加速方法,但我不确定如何构建我的头文件。

我试图用预处理器指令和 CMake 的可选安装部分解决的两件事是:

  1. 检查标头是否是从可选的 CMake 标志安装的(这可能吗?
  2. 检查给定的主机是否与我为其编写代码的兼容平台之一(OpenCL 兼容平台和 CUDA)匹配,并包含基于该平台的可选头文件

我正在考虑这个项目的头文件看起来像这样,但不确定指令本身

#ifdef Intel/Apple... OpenCL compatible GPUs
    // include GPU code that uses OpenCL
#endif

#ifdef Nvidia GPU
    // include GPU code that uses CUDA
#endif

#ifdef Intel CPUs
   // include SIMD code that uses Intel intrinsics 
#endif

#ifdef ARM CPUs
   // include SIMD code that uses ARM intrinsics
#endif

这是创建要在多个平台上运行的代码的正确方法吗?我很好奇项目是如何做类似的事情的,比如 OpenCV 与 CUDA 和 OpenCL 兼容。

C++ C 预处理器指令

评论

2赞 Some programmer dude 4/24/2023
我会将其抽象为单独的源文件,并让构建系统决定要构建哪个源文件(取决于目标)。或者,如果您想在运行时做出决定,则可以创建可以根据当前运行程序的目标实例化的类,并可能动态加载库。
1赞 Aconcagua 4/24/2023
为所有这些实现提供一个通用接口可能很有意义。然后,我会将其打包到包含其所有类型和函数的标头中,并按照@Someprogrammerdude已经建议的那样在单独的源文件中提供不同的实现。如果它们之间仍然共享功能,则将其保存在另一个单独的源文件中,该文件将成为所有这些单独构建的一部分。
0赞 KamilCuk 4/24/2023
Is this the proper way to go about creating code to run on multiple platforms??是的。你的问题太宽泛了,有多个问题。是的,你必须这样写。 那么你有没有浏览过类似OpenCV的项目的源代码呢?你有没有浏览过OpenCV的源代码就知道答案了?how projects do something similar like OpenCV
1赞 Eric Postpischil 4/24/2023
不要为 C++ 问题标记 C。
0赞 aaries 4/24/2023
@EricPostpischil 据我所知,预处理指令是 C 和 C++ 的同义词。

答:

0赞 KamilCuk 4/24/2023 #1

检查标头是否是从可选的 CMake 标志安装的(这可能吗?

使用该标头编译示例程序,并检查它是否编译。https://cmake.org/cmake/help/latest/module/CheckIncludeFile.htmlhttps://cmake.org/cmake/help/latest/command/try_compile.html

检查给定的主机是否与我为其编写代码的兼容平台之一(OpenCL 兼容平台和 CUDA)匹配

如何从预处理器宏中识别平台/编译器?https://github.com/Kitware/CMake/blob/master/Modules/CMakePlatformId.h.in 等。

这是创建代码以在多个平台上运行的正确方法吗?

没有“适当”的方法。这是其中一种方法,很好。

项目如何做类似的事情,比如 OpenCV 与 CUDA 和 OpenCL 兼容。

OpenCV是一个开源项目。https://github.com/opencv/opencv/blob/a4a9f56c8bbb11fd4a017d3c1819b89f43160474/cmake/OpenCVDetectCUDA.cmake#L82 https://github.com/opencv/opencv/blob/a4a9f56c8bbb11fd4a017d3c1819b89f43160474/modules/core/src/matrix_wrap.cpp#L319