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

Я пытаюсь использовать 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);

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

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

Что может быть не так?

Спасибо,

Томас

0

Решение

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

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

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

1

Другие решения

Других решений пока нет …