CMake 无法链接用后缀修饰的共享库(如 somelib.so.1)。有什么办法吗?

问题描述 投票:0回答:1

我正在尝试

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 解决问题吗?

c++ cmake nvcc amd-rocm hip
1个回答
0
投票

您遇到的问题似乎与在 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})
© www.soinside.com 2019 - 2024. All rights reserved.