提问人:aaries 提问时间:4/24/2023 最后编辑:aaries 更新时间:4/24/2023 访问量:102
预处理指令 GPU
Preprocessing directives GPU
问:
我有一个 C/C++ 包,我在其中使用了一些 GPU 加速方法,用于 Nvidia 硬件的 CUDA 和用于非 Nvidia 硬件的 OpenCL。我还有特定于 Intel CPU 的 SIMD 函数和一些特定于 ARM 的函数。我希望能够根据使用 CMake 构建时传入的安装标志安装这些不同的加速方法,但我不确定如何构建我的头文件。
我试图用预处理器指令和 CMake 的可选安装部分解决的两件事是:
- 检查标头是否是从可选的 CMake 标志安装的(这可能吗?
- 检查给定的主机是否与我为其编写代码的兼容平台之一(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 兼容。
答:
检查标头是否是从可选的 CMake 标志安装的(这可能吗?
使用该标头编译示例程序,并检查它是否编译。https://cmake.org/cmake/help/latest/module/CheckIncludeFile.html 或 https://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 等
评论
Is this the proper way to go about creating code to run on multiple platforms?
?是的。你的问题太宽泛了,有多个问题。是的,你必须这样写。 那么你有没有浏览过类似OpenCV的项目的源代码呢?你有没有浏览过OpenCV的源代码就知道答案了?how projects do something similar like OpenCV