我正在尝试
hip/ROCm
,并且正在探索跨平台功能。
同时,在 AMD-gpu 上移植 CUDA 实现的受欢迎程度给我留下了深刻的印象。我很难做相反的事情。更具体地说,我无法使用 CMake
和 hipcc
(这里是 nvcc
编译器的包装器)进行编译以在 NVidia 平台上构建 hip 应用程序。
例如,我使用相应的
Sgemm
库编写了一个简单的 hipblas
example。 以下
cmakelists.txt
成功地在 AMD 平台上编译了我的示例,没有太多麻烦:
cmake_minimum_required(VERSION 3.16)
project(myPrototypes VERSION 1.0.0 LANGUAGES CXX)
# Define ROCM_PATH if not defined
if (NOT DEFINED ROCM_PATH)
set(ROCM_PATH "/opt/rocm" CACHE STRING "Default ROCM installation directory.")
endif()
# Search for rocm in common locations
list(APPEND CMAKE_PREFIX_PATH "${ROCM_PATH}/hip" "${ROCM_PATH}")
set(CMAKE_MODULE_PATH "${ROCM_PATH}/hip/cmake")
# Find hip
find_package(HIP MODULE REQUIRED)
find_package(hipblas REQUIRED)
# Generate a compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Set compilation standard
set(CMAKE_CXX_COMPILER ${HIP_HIPCC_EXECUTABLE})
set(CMAKE_CXX_LINKER ${HIP_HIPCC_EXECUTABLE})
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Library:
add_library(hip_sampleLib SHARED hip_sampleLib.hip.cpp hip_sampleLib.h)
target_link_libraries(hip_sampleLib PRIVATE roc::hipblas)
# Executables:
add_executable(test_sampleLib.run test_sampleLib.cpp)
target_link_libraries(test_sampleLib.run hip_sampleLib)
但是,在 NVidia 平台上我得到:
$ cmake ..
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: $HOME/Depots/devlibrary/hip_library/build
$ make
[ 25%] Linking CXX shared library libhip_sampleLib.so
> nvcc fatal : "Don't know what to do with '/opt/rocm-5.5.0/lib/libhipblas.so.2.2'"
make[2]: *** [CMakeFiles/hip_sampleLib.dir/build.make:98: libhip_sampleLib.so] Error 1
make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/hip_sampleLib.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
首先,我确保我的代码片段可以以经典方式编译:
hipcc -o hipblas_sgemm.run hipblas_sgemm.cpp -I/opt/rocm/hipblas/include/ -L/opt/rocm/hipblas/lib -lhipblas
然后,我继续从 CMake 生成
compile_commands.json
。然而,没有任何可疑之处从视线中消失。因此,在我看来,nvcc
编译器根本无法处理libhipblas.so
,因为对于后缀so.2.2。 (我觉得这很奇怪。)
因此我的问题是:
这可能是 nvcc 编译器的弱点吗? 如果是这样,有人可以建议使用 CMake 解决问题吗?
您遇到的问题似乎与在 Nvidia 平台上使用 nvcc 以及为 AMD ROCm 平台编译的库时的链接过程有关。错误信息表明nvcc不知道如何处理libhipblas.so.2.2库文件。
出现此问题的原因是 ROCm 库是为 AMD GPU 构建的,可能不直接与 Nvidia GPU 兼容。此外,Nvidia 的 nvcc 编译器可能无法理解 ROCm 库的格式。
要解决此问题,您有以下几种选择:
使用 Nvidia 的 CUDA 库:由于您是在 Nvidia 平台上进行编译,因此最好使用 Nvidia 的 CUDA 库而不是 ROCm 库。您需要调整 CMakeLists.txt 文件以链接到 CUDA 库而不是 ROCm 库。
针对 AMD 的交叉编译:如果您希望代码与 AMD 和 Nvidia GPU 兼容,则需要对其进行交叉编译。这涉及在 AMD 系统上编译代码或使用 AMD 的 ROCm 工具链生成可以在 AMD GPU 上运行的二进制文件。然后,您也可以分发这些二进制文件以在 Nvidia GPU 上运行。
检查兼容性:确保您的 ROCm 库与 Nvidia GPU 兼容。您使用的 libhipblas 版本可能不适用于 Nvidia GPU。
研究替代方案:如果您无法使 ROCm 库在 Nvidia GPU 上工作,请考虑使用替代库或自行实现功能,而不依赖于 ROCm 或 CUDA 库。
在您的具体情况下,由于您使用的是 Nvidia GPU,因此建议使用 Nvidia 的 CUDA 库以获得兼容性和最佳性能。
你可以尝试使用这个 CMakeLists 文件
cmake_minimum_required(VERSION 3.16)
project(myPrototypes VERSION 1.0.0 LANGUAGES CXX)
# Find CUDA
find_package(CUDA REQUIRED)
# Generate a compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Set compilation standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Library:
add_library(hip_sampleLib SHARED hip_sampleLib.hip.cpp hip_sampleLib.h)
target_include_directories(hip_sampleLib PRIVATE ${CUDA_INCLUDE_DIRS})
target_link_libraries(hip_sampleLib PRIVATE ${CUDA_LIBRARIES})
# Executables:
add_executable(test_sampleLib.run test_sampleLib.cpp)
target_link_libraries(test_sampleLib.run hip_sampleLib ${CUDA_LIBRARIES})