cuda toolkit 9.0下载_在 cuda-10.0 上编译,在 cuda-10.1 上使用
这里介绍一种用高版本 cuda api 实现兼容函数,绕过 cuda api 符号版本限制,从而可以不需要重编译 sdk,直接在高版本 cuda 环境中使用的方法发现 cuda-10.1 跑 cuda-10.0 程序是可以的,跑 cuda-9.0 也可以,结果也都 ok测试程序:fa_test sdk库:libFaceAlgorithmGPU.so 依赖库:libnvinfer.so sdk依赖环
这里介绍一种用高版本 cuda api 实现兼容函数,绕过 cuda api 符号版本限制,从而可以不需要重编译 sdk,直接在高版本 cuda 环境中使用的方法
发现 cuda-10.1 跑 cuda-10.0 程序是可以的,跑 cuda-9.0 也可以,结果也都 ok
测试程序:fa_test
sdk库:libFaceAlgorithmGPU.so
依赖库:libnvinfer.so
sdk依赖环境:cuda-10.0
你的环境:cuda-10.1
你没有sdk+依赖包的源码,你不能重编译
sdk提供方不提供 cuda-10.1 版本的包
你喜欢清真,你不想装多个版本 cuda,你一定要用 cuda-10.1
你可以强行 link cuda 10.1 的so,于是报错
libnvinfer.so: undefined reference to `__cudaPushCallConfiguration@libcudart.so.10.0'
libnvinfer.so: undefined reference to `cudaGetDeviceCount@libcudart.so.10.0'
libnvinfer.so: undefined reference to `cudaGetErrorString@libcudart.so.10.0'
libnvinfer.so: undefined reference to `__cudaPopCallConfiguration@libcudart.so.10.0'
libnvinfer.so: undefined reference to `__cudaRegisterFunction@libcudart.so.10.0'
libnvinfer.so: undefined reference to `__cudaUnregisterFatBinary@libcudart.so.10.0'
libnvinfer.so: undefined reference to `cublasSetMathMode@libcublas.so.10.0'
libnvinfer.so: undefined reference to `cudaStreamDestroy@libcudart.so.10.0'
libnvinfer.so: undefined reference to `cudaStreamAddCallback@libcudart.so.10.0'
libnvinfer.so: undefined reference to `cudaDestroyTextureObject@libcudart.so.10.0'
libnvinfer.so: undefined reference to `cudaEventCreateWithFlags@libcudart.so.10.0'
去nvidia官网下载支持 cuda-10.1 环境的 tensorRT包替换掉
https://developer.nvidia.com/nvidia-tensorrt-downloaddeveloper.nvidia.com比如 TensorRT-5.1.5.0.Red-Hat.x86_64-gnu.cuda-10.1.cudnn7.5.tar.gz
libnvinfer.so 不抱怨了
然而 libFaceAlgorithmGPU.so 也用到了 cuda-10.0 的函数,并且没有 cuda-10.1的包
libFaceAlgorithmGPU.so: undefined reference to `cudaDeviceReset@libcudart.so.10.0'
libFaceAlgorithmGPU.so: undefined reference to `cudaMemset@libcudart.so.10.0'
libFaceAlgorithmGPU.so: undefined reference to `cudaFree@libcudart.so.10.0'
libFaceAlgorithmGPU.so: undefined reference to `cudaMemcpy@libcudart.so.10.0'
libFaceAlgorithmGPU.so: undefined reference to `cudaMalloc@libcudart.so.10.0'
通常,底层库都是有向后兼容性的,尤其 10.1 10.0 这样的版本升级 但是 nvidia 这里刻意把符号表用版本号修饰了,就是不让你 link 所以,我们只好用 10.1 的函数伪装成 10.0 给 libFaceAlgorithmGPU.so 用起来
创建两个文件 cuda100wrapper.cpp 实现 cuda-10.0 函数 cuda100wrapper.map 定义导出的符号表
比如,我要用 cudaGetDeviceCount@libcudart.so.10.1 伪装成 cudaGetDeviceCount@libcudart.so.10.0
我实现的函数叫 __wrap_cudaGetDeviceCount,__wrap_ 前缀是为了避免重命名问题,内容就是调用当前 cuda 版本的 cudaGetDeviceCount,但是将符号表重新改写为 cudaGetDeviceCount@libcudart.so.10.0
cuda API 的具体定义可以查阅
CUDA Toolkit Documentationdocs.nvidia.comlibFaceAlgorithmGPU.so -> cudaGetDeviceCount@libcudart.so.10.0(即__wrap_cudaGetDeviceCount) -> cudaGetDeviceCount@libcudart.so.10.1
#define CUBLASAPI __host__ __device__
libcudart.so.10.0 {
cudaGetDeviceCount;
};
cmake 里头新建 cuda-10.0 兼容层的库,比如叫 libcuda100wrapper.so,然后 link fa_test 的时候,把原来的 cudnn cudart cublas 换成 cuda100wrapper 只要将 undefined reference 中的所有函数全部用这样的方式实现,编译就能通过
add_library
编译好后,跑程序会报找不到 libcudart.so.10.0 之类的
./fa_test: error while loading shared libraries: libcudart.so.10.0: cannot open shared object file: No such file or directory
就把刚才编译出来的 libcuda100wrapper.so 链接成 libcudart.so.10.0 就可以跑了
ln -s libcuda100wrapper.so libcudart.so.10.0
ln -s libcuda100wrapper.so libcublas.so.10.0
欢迎来到FlagOS开发社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。
更多推荐


所有评论(0)