该项目是 python 调用 cuda 接口的 demo。
技术栈:
-
pybind11
https://github.com/pybind/pybind11
安装方式:https://pybind11.readthedocs.io/en/latest/installing.html
- 或者使用 apt / brew (不推荐,可能不是最新版本)
sudo apt install pybind11-dev
-
或者使用 pip / conda
但是 CMake 可能显示找不到,因为 安装的路径不在 CMake 的搜索范围
cmake -B build -Dpybind11_DIR=$(python -m pybind11 --cmakedir)
-
cmake
在 pytorch 中,虽然有很多算子,但是可能性能较差,所以需要 cuda 写的算子,然后 python 调用。
使用pybind11为cuda c++代码开发python调用接口 - 许士芳的文章 - 知乎 https://zhuanlan.zhihu.com/p/1915115953122961094
现象: python_test.py 输出 [0. 0. 0.],没有任何报错。
原因: CMakeLists.txt 中设置了 CMAKE_CUDA_ARCHITECTURES 90(对应 Hopper 架构,sm_90),但实际 GPU 是 RTX 3060 Ti(Ampere 架构,sm_86)。CUDA kernel 被编译为 sm_90 的二进制代码,在 sm_86 的 GPU 上无法启动,但 vector_add.cu 中没有做任何 CUDA 错误检查,导致 kernel 启动失败被静默忽略。cudaMemcpy 也跟着失败,输出数组保持未初始化的默认值(全 0)。
修复:
- 将
CMAKE_CUDA_ARCHITECTURES改为与实际 GPU 匹配的值(例如 RTX 3060 Ti 对应86):set(CMAKE_CUDA_ARCHITECTURES 86) - 在
vector_add.cu中添加CUDA_CHECK宏,对每次 CUDA API 调用和 kernel 启动都做错误检查,让问题能第一时间抛异常而不是静默失败:#define CUDA_CHECK(err) do { ... } while (0) // kernel 启动后必须检查: CUDA_CHECK(cudaGetLastError()); CUDA_CHECK(cudaDeviceSynchronize());