簡體   English   中英

如何使用Scikit-cuda FFT調度多個1d FFT?

[英]How to schedule multiple 1d FFTs using Scikit-cuda FFT?

我正在尋找使用CUDA並行化多個1d FFT的方法。 我正在使用CUDA 6.1開發GTX 1050Ti。

例如,在我附帶的代碼中,我有一個3d輸入數組“數據”,並且我想對該數組的第二維進行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))

代碼中的最后一行將NumPy的FFT結果與cuFFT相匹配。 從singleFFT = 1可以看出,結果為True,而對於singleFFT = 0(即許多1d FFT的批次),結果為False。

發表我的嘗試,我想總結一下:

  • 使用skcuda中的cufft庫有點棘手,在開發中,要獲得正確的FFT輸出可能會花費很長時間。 我還注意到,NumPy的FFT和cufft的FFT之間的執行時間沒有數量級的差異(來自skcuda)

  • 使用CuPy並以某種格式排列數據,以便將FFT維度放置在連續的內存中,可以使FFT計算時間提高一個數量級。 就我而言,訂單比10好一點!

  • 如果只想堅持基於Py的開發,則將CuPy用於FFT是一個不錯的選擇。 同樣,在編寫C GPU內核時,從C到Python的往返操作是一個額外的開銷,使用CuPy可以很方便地解決。 盡管CuPy本身要求制定計划並在內部調用FFT exec引擎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM