Как исправить CUBLAS_STATUS_ARCH_MISMATCH?

0

Я пытаюсь использовать CUBLAS для выполнения простого матричного умножения. Я использую следующую функцию

#ifdef CUBLAS_API_H_
// cuBLAS API errors
static const char *_cudaGetErrorEnum(cublasStatus_t error)
{
    switch (error)
    {
        case CUBLAS_STATUS_SUCCESS:
            return "CUBLAS_STATUS_SUCCESS";

        case CUBLAS_STATUS_NOT_INITIALIZED:
            return "CUBLAS_STATUS_NOT_INITIALIZED";

        case CUBLAS_STATUS_ALLOC_FAILED:
            return "CUBLAS_STATUS_ALLOC_FAILED";

        case CUBLAS_STATUS_INVALID_VALUE:
            return "CUBLAS_STATUS_INVALID_VALUE";

        case CUBLAS_STATUS_ARCH_MISMATCH:
            return "CUBLAS_STATUS_ARCH_MISMATCH";

        case CUBLAS_STATUS_MAPPING_ERROR:
            return "CUBLAS_STATUS_MAPPING_ERROR";

        case CUBLAS_STATUS_EXECUTION_FAILED:
            return "CUBLAS_STATUS_EXECUTION_FAILED";

        case CUBLAS_STATUS_INTERNAL_ERROR:
            return "CUBLAS_STATUS_INTERNAL_ERROR";
    }

    return "<unknown>";
}
#endif
void gpu_blas_mmul(cublasHandle_t &handle, cudaStream_t &stream, const real_t *A, const real_t *B, real_t *C, const int m, const int k, const int n) {
    int lda=m,ldb=k,ldc=m;
    const real_t alf = 1;
    const real_t bet = 0;
    const real_t *alpha = &alf;
    const real_t *beta = &bet;

    cublasSetStream(handle, stream);
    // Do the actual multiplication
    cublasStatus_t err = GEMM(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc);
    if(err!=0)
    {
        std::cout<<"CUBLAS err : "<<_cudaGetErrorEnum(err)<<"\n";
    }
}

В файле заголовка GEMM определяется как #define GEMM cublasDgemm #define real_t double

Функция называется так:

gpu_blas_mmul(cublas[i], streams[P/2-i-1], A, B, C, N, N, N);

A, B и C являются ячейками памяти устройства, и я пытаюсь умножить две матрицы NxN (оба сохранены в формате столбца-майор). streams - массив длины P/2 потоков CUDA, а cublas - массив ручек CUBLAS, и я рассчитывает от 0 до P/2-1. Оба массива содержат допустимые дескрипторы и потоки соответственно (при их создании нет ошибок). Я компилирую код для sm2.0. Поэтому двойная точность не должна быть проблемой.

Код работает нормально при вызове из одного файла. Этот раздел имеет свои собственные вызовы cublasCreate и cublasDestroy. Эта же функция при вызове из другого места выдает ошибку "CUBLAS_STATUS_ARCH_MISMATCH".

Что может быть неправильным?

Спасибо,

Томас

  • 0
    Можете ли вы предоставить полный, компилируемый код, который воспроизводит проблему? На каком графическом процессоре вы работаете? Что такое версия CUDA? Это windows или linux?
  • 0
    Ах, хорошо ... Я наконец понял это. Потоки и дескрипторы были фактически недействительными. Что-то простое, например, индекс массива выходит за границы. Ну что ж! Я чувствую себя глупо сейчас! В любом случае спасибо! :)
Показать ещё 1 комментарий
Теги:
cuda
cublas

1 ответ

1
Лучший ответ

Оказывается, я использовал недопустимый поток CUDA и/или CUBLAS. Я преодолел границы массива (массивы, хранящие потоки CUDA и ручки CUBLAS)

Загадочное сообщение об ошибке не давало мне представления о том, что происходит. Однако, начиная с базового примера снова и работа, я заставил меня найти проблему.

Надеюсь, кто-то найдет это полезным! :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню