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_CALL
CUFFT ルーチン呼び出しで使用すると、コンパイラは次を返します。
a value of type "cufftResult" cannot be used to initialize an entity of type "const cudaError_t".
それはそう思われ、すぐには互換性がありませんcufftResult
。cudaError_t
このNVIDIA CUDA ライブラリリンクからもう少し調査すると、入力タイプcudaGetErrorString
が必要なようです。cudaError_t
私の質問は次のとおりです。
- CUFFT ルーチンで使用し、エラー コードからメッセージ文字列を受信できるように
cufftResult
、cudaError_t
互換性を持たせる方法はありますか?CUDA_CALL
- 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); \
}
}
エラータイプの文字列も返すようにします。