如何修复cublas_status_arch_mismatch

How to fix CUBLAS_STATUS_ARCH_MISMATCH?

本文关键字:arch mismatch status cublas 何修复      更新时间:2023-10-16

我正在尝试使用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 是cuda流的P/2长度阵列, cublas 是Cublas Handles和 i 从0到p/2-1计数。两个阵列分别包含有效的把手和流(创建它们时没有错误)。我正在编译SM2.0的代码。因此,双重精神不应该是一个问题。

从一个文件调用时,代码正常工作。本节有其自己的CublasCreate和CublasDestroy电话。从另一个位置调用时,相同的函数会引发错误" cublas_status_arch_mismatch"。

可能是什么问题?

谢谢,

托马斯

事实证明,我正在使用无效的CUDA流和/或Cublas手柄。我超越了数组界(存储CUDA流和Cublas手柄的阵列)

隐秘错误消息给我不知道发生了什么。但是,从一个基本的示例开始并努力开始,我找到了这个问题。

希望有人能找到这一点!:)