0

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 MB の空きメモリがある GPU では、上記のコードは次の出力を生成します。

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 に比例して増加しないため、私の質問に対する答えは、「後で割り当てが失敗した場合に CUFFT_ALLOC_FAILED を返す」と仮定します (!)。

(私の問題は CUDA 5.5.22 で発生します。他のバージョンはチェックしていません)

4

1 に答える 1

0

To mark this question answered:

Confidence among readers is high that "CUFFT_ALLOC_FAILED return value when calling cufftGetSize*()" actually means "CUFFT_ALLOC_WOULD_FAIL".

于 2015-08-24T22:05:51.743 に答える