4

CUFFT エラー処理に次のマクロを使用しています。

#define cufftSafeCall(err)      __cufftSafeCall(err, __FILE__, __LINE__)
inline void __cufftSafeCall(cufftResult err, const char *file, const int line)
{
    if( CUFFT_SUCCESS != err) {
        fprintf(stderr, "cufftSafeCall() CUFFT error in file <%s>, line %i.\n",
                file, line);
        getch(); exit(-1);
    }
}

このマクロは、エラー コードからメッセージ文字列を返しません。本「CUDA プログラミング: GPU を使用した並列計算の開発者ガイド」では、次のマクロの使用が提案されています。

#define CUDA_CALL(call) { const cudaError_t err = (call); \
if(err != cudaSuccess) \
{ \
    fprintf(stderr, "CUDA error in file '%s', line %d\n %s\nerror %d: %s\nterminating!\n",__FILE__, __LINE__,err, \
                            cudaGetErrorString(err)); \
    cudaDeviceReset(); assert(0); \
} }

(注: 機能を変更せずに多少カスタマイズされています)。この本には、「この手法は、カーネルの呼び出しを除くすべての CUDA 呼び出しで機能します」と書かれています。ただし、CUDA_CALLCUFFT ルーチン呼び出しで使用すると、コンパイラは次を返します。

a value of type "cufftResult" cannot be used to initialize an entity of type "const cudaError_t". 

それはそう思われ、すぐには互換性がありませんcufftResultcudaError_t

このNVIDIA CUDA ライブラリリンクからもう少し調査すると、入力タイプcudaGetErrorStringが必要なようです。cudaError_t

私の質問は次のとおりです。

  1. CUFFT ルーチンで使用し、エラー コードからメッセージ文字列を受信できるようにcufftResultcudaError_t互換性を持たせる方法はありますか?CUDA_CALL
  2. CUFFT ライブラリに別のエラーを実装する技術的な理由はありますか? :-)

ありがとう。

ロバート・クロベラの回答に従って編集

CufftSafeCall ルーチンを次のように変更しました。

inline void __cufftSafeCall(cufftResult err, const char *file, const int line)
{
    if( CUFFT_SUCCESS != err) {
    fprintf(stderr, "CUFFT error in file '%s', line %d\n %s\nerror %d: %s\nterminating!\n",__FILE__, __LINE__,err, \
                                _cudaGetErrorEnum(err)); \
    cudaDeviceReset(); assert(0); \
}

}

エラータイプの文字列も返すようにします。

4

2 に答える 2