带有 cuda 代码的节点插件模块给出运行时链接错误(使用 docker 容器)

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

我正在尝试用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 文件中定义。

我搜索了很多,尝试了不同的解决方案,但没有任何效果:(

node.js cuda linker-errors nvcc node-addon-api
1个回答
0
投票

仅供参考,原来是链接顺序错误!太疯狂了,Windows 不关心,但 linux 关心!

这解决了我的问题:

"libraries": [
          "/usr/src/app/libgpu.lib",
          "/usr/local/cuda/lib64/libcudart_static.a",
    ],
© www.soinside.com 2019 - 2024. All rights reserved.