我正在尝试使用一些c++和CUDA函数编译一些dll文件,以快速处理我在python程序中收到的一些数据(从采集卡进行FFT的160MB/s)。该 DLL 与 CUDA 函数一起工作正常,但每当我从 CUFFT 库添加函数时就会停止工作。
目前我有一个 .cu 文件,其中包含一些简单的 CUDA 函数,如下例所示。
#include <stdint.h>
#include <iostream>
#include <stdio.h>
#include <stdbool.h>
#include <inttypes.h>
#include <cuda.h>
#include <cuFFT.h>
extern "C" void __declspec(dllexport) GPU_copyto(float *array, float *data_p, int offset, int ndata) // offset and ndata are in bytes
{
offset/=2;
ndata/=2;
cudaMemcpy(data_p+offset, array+offset, ndata*sizeof(float), cudaMemcpyHostToDevice);
}
我可以使用以下命令将示例编译为 .dll:
nvcc -lcufft -o cuda_avg.dll -shared cuda_average.cu
然后将其导入到 python 中:
cuda_avg_dll=ctypes.CDLL('./cuda_avg.dll', mode=ctypes.RTLD_GLOBAL)
通过这个简单的流程,我能够在 Python 中使用一些简单的 CUDA 函数在 GPU 上分配内存、传输数据、执行算术并将数据复制回来。
当我想使用 CUFFT 库计算数据的 FFT 时,问题就开始了。 从 CUFFT 包中添加函数(例如 cufftPlan1d())不会从编译器或链接器输出错误。将 DLL 加载到 Python 时出现以下错误。
Traceback (most recent call last):
File "C:\Users\manip.batm\Desktop\shotnoise\20240123_SI_card_test\SI_cudaFFT\SI_cuda_TEST.py", line 21, in <module>
cuda_avg_dll=ctypes.CDLL('./cuda_avg.dll', mode=ctypes.RTLD_GLOBAL)
File "C:\Users\manip.batm\.conda\envs\qcodes\lib\ctypes\__init__.py", line 374, in __init__
self._handle = _dlopen(self._name, mode)
FileNotFoundError: Could not find module 'C:\Users\manip.batm\Desktop\shotnoise\20240123_SI_card_test\SI_cudaFFT\cuda_avg.dll' (or one of its dependencies). Try using the full path with constructor syntax.
我可以使用以下编译器命令生成 .exe 文件而不是 DLL。
nvcc -lcufft -o cuda_avg cuda_average.cu
它执行得很好,我可以轻松地在 GPU 上执行 FFT。
谁能告诉我我做错了什么?
除了 DLL 之外,还有其他方法可以在 Windows 上从 Python 程序快速执行低级函数吗?
我在CUDA文档上看到有动态链接库和静态链接库。知道我不知道有什么区别,我可以生成一个静态库并将其加载到 python 中吗?怎样才能做到这一点?
感谢 Robert Crovella 的建议,我已经解决了这个问题。 事实上,Python 无法找到运行 de CuFFT 库函数所需的 cufft64_11.dll。添加
os.add_dll_directory(r"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.3\bin")
在加载dll之前解决了问题。