【问题标题】:cuBlas, cuda functions not working, producing no errorscuBlas,cuda 功能不工作,不产生错误
【发布时间】:2012-12-11 15:41:20
【问题描述】:

这是一个说明问题的最小程序。我正在使用具有 128 个 CUDA 内核的 GTS 250,在 Windows 7 上使用 CUDA 5.0。

void cuda_ops_test(int N, float* R)
{
    //Values of input matrix in CPU
    fprintf(stderr, "\nValues of R: \n");
    for (int i=0; i<N; ++i)
        fprintf(stderr, "%f, ", R[i]);
    fprintf(stderr, "\n");

    //Initialize CUDA/CUBLAS
    cublasHandle_t handle;
    cublasStatus_t status;
    status = cublasCreate(&handle);
    if (status == CUBLAS_STATUS_SUCCESS)
        fprintf(stderr, "CUBLAS initialization succeeded.\n");

    //Allocate device memory
    float *dR = 0;
    cudaError_t alloc_status;
    alloc_status = cudaMalloc((void**)&dR, N*sizeof(dR[0]));
    if(alloc_status == cudaSuccess)
        fprintf (stderr, "\nDevice memory allocation succeeded.\n");

    //Load array into memory
    status = cublasSetMatrix(1, N, sizeof(R[0]), R, N, dR, N);
    if(status == CUBLAS_STATUS_SUCCESS)
        fprintf (stderr, "\nDevice write succeeded.\n");

    //First operation: summation
    float ans;
    status = cublasSasum(handle, N, dR, 1, &ans);
    if (status == CUBLAS_STATUS_SUCCESS)
        fprintf(stderr, "\ncublasSasum produced no error. Sum of dR: %d\n", ans);
    else
        fprintf(stderr, "\ncublasSasum error: %d.\n", status);

    //Second operation: y = ax+y
    const float alpha = 2.0;
    status = cublasSaxpy(handle, N,
                 &alpha,
                 dR, 1,
                 dR, 1);
    if (status == CUBLAS_STATUS_SUCCESS)
        fprintf(stderr, "\ncublasSaxpy produced no error.\n");
    else
        fprintf(stderr, "\ncublasSaxpy error: %d.\n", status);

    // transfer device dR to host R
    status = cublasGetMatrix (1, N, sizeof(dR[0]), dR, N, R, N);
    if(status == CUBLAS_STATUS_SUCCESS)
        fprintf (stderr, "\nDevice read succeded\n");

    //Display post-op values of R
    fprintf(stderr, "\nValues of R, after cublasSaxpy: \n");
    for (int i=0; i<N; ++i)
        fprintf(stderr, "%f, ", R[i]);
    fprintf(stderr, "\n");

    //Attempt to zero with cudaMemset
    cudaError_t stat = cudaMemset(dR, 0, N*sizeof(dR[0]));
    if (stat==cudaSuccess)
        fprintf(stderr, "\nZeroing with cudaMemset on R produced no error.\n");

    //Again transfer device dR to host R, after zeroing
    status = cublasGetMatrix (1, N, sizeof(dR[0]), dR, N, R, N);
    if(status == CUBLAS_STATUS_SUCCESS)
        fprintf (stderr, "\nDevice read succeded.\n");

    //Display values of R again
    fprintf(stderr, "\nValues of R, after zeroing with cudaMemset: \n");
    for (int i=0; i<N; ++i)
        fprintf(stderr, "%f, ", R[i]);
    fprintf(stderr, "\n");

    cudaFree(dR);
}

这是输出,表明当数据被加载到 GPU 内存中时,实际上并没有发生任何操作:

R 的值: 0.123020, 0.367809, 0.834681, 0.035096, 0.517014, 0.662984, 0.426221, 0.104678,

CUBLAS 初始化成功。

设备内存分配成功。

cublasSasum 没有产生错误。 dR总和:0

cublasSaxpy 没有产生错误。

在 cublasSaxpy 之后的 R 值: 0.123020, 0.367809, 0.834681, 0.035096, 0.517014, 0.662984, 0.426221, 0.104678,

在 R 上使用 cudaMemset 归零不会产生错误。

使用 cudaMemset 归零后的 R 值: 0.123020、0.367809、0.834681、0.035096、0.517014、0.662984、0.426221、0.104678、

发生了什么事? (和节日快乐。:))

【问题讨论】:

  • 函数输出的一部分不应该是Device write succeeded. 的行吗?该函数失败(cublasSetMatrix),但由于您没有解析返回的错误代码(如果不成功,甚至不会打印警告),因此您没有从中获得任何有用的信息。所以你应该把注意力集中在那里。此外,使用 cublasSetVector 而不是 SetMatrix 会更简单。
  • @RobertCrovella 哈是的,你当然是对的,这是一种非常愚蠢的做法——谈论确认偏差。确实该功能失败了,现在正在研究它。

标签: c cuda nvidia cublas


【解决方案1】:

您的代码有几个错误。正如我在 cmets 中提到的那样,您错过了一个事实,即您的设备读取和设备写入消息都没有被打印出来,因为这些函数(cublasSetMatrix、cublasGetMatrix)实际上失败了。

要修复 cublasSetMatrix 和 cublasGetMatrix 调用,请将 ldaldb 参数更改为 1:

 status = cublasSetMatrix(1, N, sizeof(R[0]), R, 1, dR, 1);    
 ...     
 status = cublasGetMatrix (1, N, sizeof(dR[0]), dR, 1, R, 1);

这些函数的documentation 表示:“源矩阵 A 和目标矩阵 B 的前导维数分别在 lda 和 ldb 中给出。前导维数表示分配矩阵的行数”

在打印 cublasSasum 操作结果的行中,您的 printf 语句错误地使用 int 格式说明符打印出浮点值。这行不通。将 %d 更改为 %f

 fprintf(stderr, "\ncublasSasum produced no error. Sum of dR: %f\n", ans);

通过这些更改,我得到了一个合理的结果:

Values of R:
0.123020, 0.367809, 0.834681, 0.035096, 0.517014, 0.662984, 0.426221, 0.104678,
CUBLAS initialization succeeded.

Device memory allocation succeeded.

Device write succeeded.

cublasSasum produced no error. Sum of dR: 3.071503

cublasSaxpy produced no error.

Device read succeded

Values of R, after cublasSaxpy:
0.369060, 1.103427, 2.504043, 0.105288, 1.551042, 1.988952, 1.278663, 0.314034,

Zeroing with cudaMemset on R produced no error.

Device read succeded.

Values of R, after zeroing with cudaMemset:
0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,

请注意,this SO question/answer 提供了一个有用、方便的 cublas 错误解析器功能的提示。将它构建到 cublas 函数调用的包装器或错误检查宏中并不难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2013-02-19
    • 1970-01-01
    • 2023-03-15
    • 2018-02-13
    • 2015-04-22
    • 2015-04-24
    相关资源
    最近更新 更多