cufftGetSize * () не должен выделять какую-либо память, и он этого не делает (я проверил доступную память до и после вызова cufftGetSize *). Возвращает ли он CUFFT_ALLOC_FAILED, если последующее выделение не удастся?
Пример кода:
#include <iostream>
#include <stdio.h>
#include <cuda.h>
#include <cufft.h>
int main() {
for (int N=1; N<1800; ++N) {
std::cerr << "N = "<< N << " ";
cufftResult r;
cufftHandle planR2C;
cudaDeviceReset();
r = cufftCreate(&planR2C);
if(r) return 1;
r = cufftSetCompatibilityMode(planR2C, CUFFT_COMPATIBILITY_FFTW_PADDING);
if(r) return 1;
r = cufftSetAutoAllocation(planR2C, 0);
if(r) return 1;
size_t workSize;
r = cufftGetSize3d(planR2C, 1800, 1800, N, CUFFT_R2C, &workSize);
if(r==CUFFT_ALLOC_FAILED) std::cerr << "CUFFT_ALLOC_FAILED\n";
std::cerr << " Estimated workSize: "<< workSize / ( 1024 * 1024 )
<< " MB" << std::endl;
cudaDeviceReset();
}
std::cerr << "****** Done.\n";
return 0;
}
На графическом процессоре с 4693 МБ свободной памяти в начале процесса приведенный выше код выдает следующий вывод:
N = 1 Estimated workSize: 197 MB
N = 2 Estimated workSize: 395 MB
...
N = 15 Estimated workSize: 791 MB
N = 16 Estimated workSize: 197 MB
N = 17 CUFFT_ALLOC_FAILED
N = 18 Estimated workSize: 222 MB
...
С N = 73 на все нечетные N выходят из строя и четные N проходят. Из N = 166 все N терпят неудачу.
Поскольку требуемая память не будет расти линейно с N, я предполагаю (!), Что ответ на мой вопрос действительно таков: «он возвращает [s] CUFFT_ALLOC_FAILED, если последующее распределение завершится неудачно» Хотя доказательство этого утверждения было бы неплохо.
(Моя проблема возникает в CUDA 5.5.22, я не проверял ни одну другую версию)
На этот вопрос ответили:
Уверенность среди читателей высока, что «возвращаемое значение CUFFT_ALLOC_FAILED при вызове cufftGetSize * ()» на самом деле означает «CUFFT_ALLOC_WOULD_FAIL».