我正在尝试用cuda代码编写一个node-addon-api模块。
我正在使用 docker 容器:
FROM nvidia/cuda:12.5.0-devel-ubuntu22.04
首先编译cuda文件,制作静态库:
nvcc --compiler-options '-fPIC' -rdc=true -c -o temp.o cuda_lib.cu
nvcc --compiler-options '-fPIC' -dlink -o gpuCode.o temp.o -lcudart
ar cru libgpu.lib gpuCode.o temp.o
ranlib libgpu.lib
然后尝试将其与我的 binding.gyp 中的模块的其余部分链接:
{
"targets": [
{
"target_name": "addon",
"cflags!": [ "-fno-exceptions" ],
"cflags_cc!": [ "-fno-exceptions" ],
"cflags!": [ "-fno-exceptions" ],
"cflags_cc!": [ "-fno-exceptions" ],
"sources": ["addon.cc", "myobject.cc"],
"include_dirs": [
"<!@(node -p \"require('node-addon-api').include\")",
],
"libraries": [
"/usr/local/cuda/lib64/libcudart_static.a",
"/usr/src/app/libgpu.lib",
],
'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ],
"cflags": [
"-std=c++11"
],
}
]
}
一切都可以在我的本地 Windows 计算机上编译和运行,没有任何问题。但是 Docker 版本在运行时出现此错误:
node: symbol lookup error: /usr/src/app/build/Release/addon.node: undefined symbol: __cudaRegisterFatBinary
我很困惑是什么原因,因为 cudart 与我所理解的有联系。
nm ./build/Release/addon.node
我可以看到 __cudaRegisterFatBinary 在我的 .node 文件中定义。
我搜索了很多,尝试了不同的解决方案,但没有任何效果:(
仅供参考,原来是链接顺序错误!太疯狂了,Windows 不关心,但 linux 关心!
这解决了我的问题:
"libraries": [
"/usr/src/app/libgpu.lib",
"/usr/local/cuda/lib64/libcudart_static.a",
],