Что означает возвращаемое значение CUFFT_ALLOC_FAILED при вызове cufftGetSize * ()?

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, я не проверял ни одну другую версию)

0

Решение

На этот вопрос ответили:

Уверенность среди читателей высока, что «возвращаемое значение CUFFT_ALLOC_FAILED при вызове cufftGetSize * ()» на самом деле означает «CUFFT_ALLOC_WOULD_FAIL».

0

Другие решения


По вопросам рекламы [email protected]