【问题标题】:CUDA unknown error after cuBLAS callcuBLAS 调用后的 CUDA 未知错误
【发布时间】:2023-03-15 05:40:01
【问题描述】:

在我当前的项目中,我使用 CUDA 和 cublasSgetrfBatched 和 cublasSgetriBatched 来计算矩阵的逆并返回结果。但是,虽然我在调用第一个函数时没有收到错误消息,但对 cudaDeviceSynchronize 的以下调用会导致错误代码 30:未知错误。

奇怪的是,这似乎只发生在较大尺寸的矩阵 (n ~ 1600+) 上,并且适用于较小的矩阵 (n ~ 1400-)。内存使用量仍然相对较小,因此这似乎不是问题。

任何提示或帮助将不胜感激。

可重现的样本

#include <string>
#include <cuda_runtime.h>
#include <cublas_v2.h>
#include <conio.h>

#define CUDA_CALL(res, str) { if (res != cudaSuccess) { printf("CUDA Error : %s : %s %d : ERR %s\n", str, __FILE__, __LINE__, cudaGetErrorName(res)); } }
#define CUBLAS_CALL(res, str) { if (res != CUBLAS_STATUS_SUCCESS) { printf("CUBLAS Error : %s : %s %d : ERR %d\n", str, __FILE__, __LINE__, int(res)); } }

float* d_GetInv(float* L, int n)
{
    cublasHandle_t cu_cublasHandle;
    CUBLAS_CALL(cublasCreate(&cu_cublasHandle), "Failed to initialize cuBLAS!");

    float** adL;
    float** adC;
    float* dL;
    float* dC;
    int* dLUPivots;
    int* dLUInfo;

    size_t szA = n * n * sizeof(float);

    CUDA_CALL(cudaMalloc(&adL, sizeof(float*)), "Failed to allocate adL!");
    CUDA_CALL(cudaMalloc(&adC, sizeof(float*)), "Failed to allocate adC!");
    CUDA_CALL(cudaMalloc(&dL, szA), "Failed to allocate dL!");
    CUDA_CALL(cudaMalloc(&dC, szA), "Failed to allocate dC!");
    CUDA_CALL(cudaMalloc(&dLUPivots, n * sizeof(int)), "Failed to allocate dLUPivots!");
    CUDA_CALL(cudaMalloc(&dLUInfo, sizeof(int)), "Failed to allocate dLUInfo!");

    CUDA_CALL(cudaMemcpy(dL, L, szA, cudaMemcpyHostToDevice), "Failed to copy to dL!");
    CUDA_CALL(cudaMemcpy(adL, &dL, sizeof(float*), cudaMemcpyHostToDevice), "Failed to copy to adL!");
    CUDA_CALL(cudaMemcpy(adC, &dC, sizeof(float*), cudaMemcpyHostToDevice), "Failed to copy to adC!");

    CUBLAS_CALL(cublasSgetrfBatched(cu_cublasHandle, n, adL, n, dLUPivots, dLUInfo, 1), "Failed to perform LU decomp operation!");
    CUDA_CALL(cudaDeviceSynchronize(), "Failed to synchronize after kernel call!");

    CUBLAS_CALL(cublasSgetriBatched(cu_cublasHandle, n, (const float **)adL, n, dLUPivots, adC, n, dLUInfo, 1), "Failed to perform Inverse operation!");
    CUDA_CALL(cudaDeviceSynchronize(), "Failed to synchronize after kernel call!");

    float* res = (float*)malloc(szA);

    CUDA_CALL(cudaMemcpy(res, dC, szA, cudaMemcpyDeviceToHost), "Failed to copy to res!");

    CUDA_CALL(cudaFree(adL), "Failed to free adL!");
    CUDA_CALL(cudaFree(adC), "Failed to free adC!");
    CUDA_CALL(cudaFree(dL), "Failed to free dL!");
    CUDA_CALL(cudaFree(dC), "Failed to free dC!");
    CUDA_CALL(cudaFree(dLUPivots), "Failed to free dLUPivots!");
    CUDA_CALL(cudaFree(dLUInfo), "Failed to free dLUInfo!");

    CUBLAS_CALL(cublasDestroy(cu_cublasHandle), "Failed to destroy cuBLAS!");

    return res;
}

int main()
{
    int n = 1600;
    float* L = (float*)malloc(n * n * sizeof(float));
    for(int i = 0; i < n * n; i++)
        L[i] = ((float)rand()/(float)(RAND_MAX)) * 9.0f;

    float* inv = d_GetInv(L, n);

    printf("done.");
    _getch();

    return 0;
}

代码运行于:

GPU:GTX 780 3GB

CPU:i7-4790S @ 3.20 GHz

【问题讨论】:

  • 在 Windows 上?您可能会遇到 WDDM 超时。
  • @Robert Crovella,感谢您的及时回复!这似乎确实是问题所在,通过提高限制很容易解决。

标签: c++ cuda runtime-error matrix-inverse cublas


【解决方案1】:

该问题确实似乎遇到了 WDDM 超时。对于遇到类似问题的任何人,只需提高超时限制似乎就可以解决问题。

有关如何扩展限制,请参阅下面的链接:http://http.developer.nvidia.com/NsightVisualStudio/2.2/Documentation/UserGuide/HTML/Content/Timeout_Detection_Recovery.htm

【讨论】:

    猜你喜欢
    • 2014-04-11
    • 2014-12-18
    • 1970-01-01
    • 2012-12-11
    • 2021-07-06
    • 1970-01-01
    • 2019-04-28
    • 2014-11-08
    • 2013-06-13
    相关资源
    最近更新 更多