使用 CUDA FFT 包编译 dll 文件时出现问题(Windows 64)

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

我正在尝试使用一些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 中吗?怎样才能做到这一点?

python dll cuda cufft
1个回答
0
投票

感谢 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之前解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.