cuda - cuBLAS argmin -- 如果输出到设备内存会出现段错误吗?

标签 cuda gpu gpgpu blas cublas

在 cuBLAS 中,cublasIsamin()给出单精度数组的 argmin。

这是完整的函数声明:cublasStatus_t cublasIsamin(cublasHandle_t handle, int n, const float *x, int incx, int *result)
cuBLAS 程序员指南提供了有关 cublasIsamin() 的信息。参数:
enter image description here

如果我使用 主持人 (CPU) 内存 result ,然后 cublasIsamin工作正常。下面是一个例子:

void argmin_experiment_hostOutput(){
    float h_A[4] = {1, 2, 3, 4}; int N = 4; 
    float* d_A = 0;
    CHECK_CUDART(cudaMalloc((void**)&d_A, N * sizeof(d_A[0])));
    CHECK_CUBLAS(cublasSetVector(N, sizeof(h_A[0]), h_A, 1, d_A, 1));
    cublasHandle_t handle; CHECK_CUBLAS(cublasCreate(&handle));

    int result; //host memory
    CHECK_CUBLAS(cublasIsamin(handle, N, d_A, 1, &result));
    printf("argmin = %d, min = %f \n", result, h_A[result]);

    CHECK_CUBLAS(cublasDestroy(handle));
}

但是,如果我使用 设备 (GPU) 内存 result ,然后 cublasIsamin段错误。这是一个段错误的例子:
void argmin_experiment_deviceOutput(){
    float h_A[4] = {1, 2, 3, 4}; int N = 4;
    float* d_A = 0;
    CHECK_CUDART(cudaMalloc((void**)&d_A, N * sizeof(d_A[0])));
    CHECK_CUBLAS(cublasSetVector(N, sizeof(h_A[0]), h_A, 1, d_A, 1));
    cublasHandle_t handle; CHECK_CUBLAS(cublasCreate(&handle));

    int* d_result = 0; 
    CHECK_CUDART(cudaMalloc((void**)&d_result, 1 * sizeof(d_result[0]))); //just enough device memory for 1 result
    CHECK_CUDART(cudaMemset(d_result, 0, 1 * sizeof(d_result[0])));
    CHECK_CUBLAS(cublasIsamin(handle, N, d_A, 1, d_result)); //SEGFAULT!

    CHECK_CUBLAS(cublasDestroy(handle));
}

Nvidia 指南说`cublasIsamin()` 可以输出到设备内存。我究竟做错了什么?

动机:我想在多个流中同时计算多个向量的 argmin()。输出到主机内存需要 CPU-GPU 同步,似乎会杀死多内核并发。所以,我想将 argmin 输出到设备内存。

最佳答案

CUBLAS V2 API 不支持将标量结果写入设备内存。但它默认不支持这个。根据文档的第 2.4 节“标量参数”,您需要使用 cublasSetPointerMode()使 API 意识到标量参数指针将驻留在设备内存中。请注意,这也会使这些级别 1 BLAS 函数异步,因此您必须确保在尝试访问结果指针之前 GPU 已完成内核。

this answer一个完整的工作示例。

关于cuda - cuBLAS argmin -- 如果输出到设备内存会出现段错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13718253/

相关文章:

cuda - 是否可以从主机中断 CUDA 内核?

c++ - 示例 cuda 程序崩溃

ffmpeg 进程有 GPU 使用限制

c++ - 在标准 C++ 和 OpenCL 之间共享多线程代码

cuda - CUDA工具包和CUDA sdk有什么区别

c++ - 在运行时根据 CUDA 计算能力切换主机功能

c++ - 给定元素数组、子列表的偏移量和长度的有效部分归约

cuda - 基本cuda共享内存

cuda - 我们如何在每次运行时使用不同的种子在 CUDA C 中生成随机数?

opencv - opencv gpu中的错误处理