Я экспериментирую с партией с cuFFT. Но я не думаю, что получаю правильный результат.cuFFT R2C размер выходного пакета не соответствует размеру ввода
int NX = 16; // size of the array
int BATCH = 16; // # of batch
Я выделение двух массивов на GPU:
float *src;
cufftComplex *dst;
cudaMalloc((void**)&src, sizeof(float)*NX*BATCH);
cudaMalloc((void**)&dst, sizeof(cufftComplex)*NX*BATCH);
Я инициализирует массив источника с простым ядром, как это:
__global__ void initFloatArray(float *data, const int size) {
const int i = (blockIdx.x * blockDim.x) + threadIdx.x;
if (i < size) {
data[i] = i % NX;
}
}
так в основном, каждый из массива имеет значения от 0 до 15. И я получаю это 16 раз.
Я создаю мой план, как это:
cufftPlanMany(&plan, 1, &NX, nullptr, 1, NX, nullptr, 1, NX, CUFFT_R2C, BATCH);
, а затем я свой план выполнения:
cufftExecR2C(plan, src, dst);
Наконец, я передаю содержание целевой_адреса обратно к хозяину. Но когда я распечатать значения, я получаю это:
BATCH 0:
<120, 0>.length = 120
<-8, 40.2187>.length = 41.0066
<-8, 19.3137>.length = 20.905
<-8, 11.9728>.length = 14.3996
<-8, 8>.length = 11.3137
<-8, 5.34543>.length = 9.62152
<-8, 3.31371>.length = 8.65914
<-8, 1.5913>.length = 8.15673
<-8, 0>.length = 8
<120, 0>.length = 120
<-8, 40.2187>.length = 41.0066
<-8, 19.3137>.length = 20.905
<-8, 11.9728>.length = 14.3996
<-8, 8>.length = 11.3137
<-8, 5.34543>.length = 9.62152
<-8, 3.31371>.length = 8.65914
BATCH 1:
<-8, 1.5913>.length = 8.15673
<-8, 0>.length = 8
<120, 0>.length = 120
<-8, 40.2187>.length = 41.0066
<-8, 19.3137>.length = 20.905
<-8, 11.9728>.length = 14.3996
...
Я ожидал повторяющийся выхода, но это повторять каждые 9 числа, а не каждые 16, как это должно быть.
Я что-то не так? Или есть что-то, что я не понимаю.
, если быть точнее, это пол (N/2) +1 комплексные значения. Итак, за 15 вы получаете 8 комплексов. – widgg