如何使用Scikit-cuda FFT调度多个1d FFT?

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

我正在寻求使用CUDA并行化多个1d FFT。我正在使用CUDA 6.1开发GTX 1050Ti。

例如,在附带的代码中,我有一个3d输入数组'data',我想对该数组的第二维进行1d FFT。当然,目的是将执行时间缩短一个数量级。

我能够使用Python的scikit-cuda的cufft包运行一批1 1d FFT,结果与NumPy的FFT匹配。当我达到实​​际的批量大小时,问题就来了。在那里,我无法将NumPy的FFT输出(这是正确的)与cufft的输出(我认为这是不正确的)相匹配的。在附带的代码中,参数“ singleFFT”控制我们是否计划批处理1个或多个。非常感谢帮助纠正输出FFT并进一步加快执行速度(如果可能)。

import numpy as np
from time import process_time
from skcuda import cufft as cf
import pycuda.autoinit
from pycuda import gpuarray


# params
nSamp = 512
nTx = 16
nRx = 16
nChirp = 256
NX = nChirp
# Uncomment the following line to generate same data always
# np.random.seed(seed=1)
data = (np.random.randn(nSamp,nChirp,nTx,nRx) + 1j*np.random.randn(nSamp,nChirp,nTx,nRx)).astype(np.complex64)
data = data.reshape(nSamp,-1,nTx*nRx)
dataShp0 = np.int32(data.shape[0])
dataShp2 = np.int32(data.shape[2])
idx1 = 0
idx2 = 0
idx3 = 0
singleFFT = 0
if (1 == singleFFT):
    data_t      = data[0,:,0]
    fftAxis = 0
    BATCH = np.int32(1)
else:
    data_t      = data
    fftAxis = 1
    BATCH = np.int32(nSamp*nTx*nRx)
# calculate and time NumPy FFT
t1 = process_time()
dataFft     = np.fft.fft(data_t, axis=fftAxis)
t2 = process_time()
print('\nCPU NumPy time is: ',t2-t1)

data_o_gpu  = gpuarray.empty((BATCH*NX),dtype=np.complex64)
# calculate and time GPU FFT
data_t = data_t.reshape((BATCH*NX))
t1 = process_time()
# transfer input data to Device
data_t_gpu  = gpuarray.to_gpu(data_t)
# Make FFT plan
plan = cf.cufftPlan1d(NX, cf.CUFFT_C2C, BATCH)
# Execute FFT plan
res = cf.cufftExecC2C(plan, int(data_t_gpu.gpudata), int(data_o_gpu.gpudata), cf.CUFFT_FORWARD)

dataFft_gpu = data_o_gpu.get()
t2 = process_time()
if (0 == singleFFT):
    dataFft_gpu = dataFft_gpu.reshape((nSamp,-1,nTx*nRx))
print('\nGPU time is: ',t2-t1)
print(np.allclose(dataFft,dataFft_gpu,atol=1e-6))

代码中的最后一行与cuFFT匹配NumPy的FFT结果。可以看出,使用singleFFT = 1时,结果为True,而对于singleFFT = 0(即,一批一维FFT),结果为False。

python numpy gpgpu cufft
1个回答
0
投票

发表我的尝试,我想总结一下:

  • 使用来自skcuda的cufft库有点棘手,在开发中,要获得正确的FFT输出可能会花费很长时间。我还注意到,NumPy的FFT和cufft的FFT(来自skcuda)之间的执行时间没有数量级的差异。

  • 使用CuPy并以某种格式排列数据,以便将FFT维度放置在连续的内存中,从而使FFT计算时间提高了一个数量级。就我而言,订单比10好一点!

  • 如果仅想坚持基于Py的开发,则将CuPy用于FFT是一个不错的选择。同样,在编写C GPU内核时,从C到Python的往返操作是一个额外的开销,使用CuPy可以很方便地解决。尽管CuPy本身要求制定计划并在内部调用FFT执行引擎。

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