Обработка ошибок CUFFT

Я использую следующий макрос для обработки ошибок 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 Programming: руководство разработчика по параллельным вычислениям с графическими процессорами" предлагается использовать следующий макрос

#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 Library, кажется, что cudaGetErrorString требуется тип ввода cudaError_t.

Мои вопросы таковы:

  • Есть ли способ сделать cufftResult и cudaError_t совместимыми, чтобы я мог использовать CUDA_CALL в подпрограммах CUFFT и получать строку сообщения из кода ошибки?
  • Есть ли какая-либо техническая причина, по которой возникает другая ошибка для библиотеки 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); \
}

}

чтобы вернуть также строку типа ошибки.

3
28 апр. '13 в 22:53
источник поделиться
2 ответов

cufft не является частью api cuda runtime. cufft - отдельная библиотека функций. Поскольку он является отдельным, имеет смысл не делать перечисления ошибок cufft зависимыми от библиотеки api времени выполнения cuda; такие связи препятствуют самостоятельной разработке модулей, кодов и библиотек.

Поэтому, когда книга упоминает вызовы CUDA, они ссылаются на время выполнения cuda api, а не на библиотеку cufft api.

Так как перечисленные значения возвращаемые из cufft, вызовы библиотеки не зависят от (и в основном ортогонально) перечислимых значений возвращенный из среды выполнения cuda, я не думаю, что это возможно простым способом согласовать два набора в одном макросе. И поскольку вызовы cuda и вызовы cufft могут быть смешаны в любом фрагменте кода, я не могу придумать экологический способ сделать это. Однако кто-то может придумать умный подход.

Если вы хотите перечислить ошибку cufft для синтаксического анализатора, есть один в /usr/local/cuda/samples/common/inc/helper_cuda.h (при условии установки стандартного Linux CUDA 5), который может представлять интерес. Вставьте его здесь для удобства:

#ifdef _CUFFT_H_
// cuFFT API errors
static const char *_cudaGetErrorEnum(cufftResult error)
{
    switch (error)
    {
        case CUFFT_SUCCESS:
            return "CUFFT_SUCCESS";

        case CUFFT_INVALID_PLAN:
            return "CUFFT_INVALID_PLAN";

        case CUFFT_ALLOC_FAILED:
            return "CUFFT_ALLOC_FAILED";

        case CUFFT_INVALID_TYPE:
            return "CUFFT_INVALID_TYPE";

        case CUFFT_INVALID_VALUE:
            return "CUFFT_INVALID_VALUE";

        case CUFFT_INTERNAL_ERROR:
            return "CUFFT_INTERNAL_ERROR";

        case CUFFT_EXEC_FAILED:
            return "CUFFT_EXEC_FAILED";

        case CUFFT_SETUP_FAILED:
            return "CUFFT_SETUP_FAILED";

        case CUFFT_INVALID_SIZE:
            return "CUFFT_INVALID_SIZE";

        case CUFFT_UNALIGNED_DATA:
            return "CUFFT_UNALIGNED_DATA";
    }

    return "<unknown>";
}
#endif
3
28 апр. '13 в 23:42
источник

В моем проекте используется следующий макрос:

// NOTE: include cufft to import '_cudaGetErrorEnum(cufftResult error)'
#include <cufft.h>
#include <helper_cuda.h>

#define CHECK_CUFFT_ERRORS(call) { \
    cufftResult_t err; \
    if ((err = (call)) != CUFFT_SUCCESS) { \
        fprintf(stderr, "cuFFT error %d:%s at %s:%d\n", err, _cudaGetErrorEnum(err), \
                __FILE__, __LINE__); \
        exit(1); \
    } \
}
0
30 авг. '17 в 9:45
источник

Посмотрите другие вопросы по меткам или Задайте вопрос