CUDA内核可以调用cublas函数吗?

问题描述 投票:16回答:3

我知道这听起来很奇怪,但是这是我的情况:

我需要做一个矩阵矩阵乘法(A(n * k)* B(k * n)),但我只需要对角元素进行输出矩阵评估。我搜索了cublas库,但没有找到可以执行此操作的任何2级或3级函数。因此,我决定将A的每一行和B的每一列分配到CUDA线程中。对于每个线程(idx),我需要计算点积“ A [idx,:] * B [:,idx]”并将其保存为相应的对角线输出。现在,由于该点产品也需要一些时间,因此我想知道是否可以通过某种方式在此处调用cublas函数(例如cublasSdot)来实现它。

如果我错过了一些可以直接实现我的目标的cublas函数(仅计算矩阵矩阵乘法的对角线元素,则可以忽略此问题。

cuda gpu cublas
3个回答
11
投票

是的。

“ CUDA C / C ++中可用的语言界面和设备运行时API是主机上可用的CUDA运行时API的子集。为了方便使用,CUDA运行时API的语法和语义已保留在设备上。可在主机或设备环境中运行的API例程的代码重用。内核也可以直接调用GPU库,例如CUBLAS,而无需返回到CPU。” Source

[Here您可以使用cuda和CUBLAS库函数cublasSgemv查看和矩阵向量乘法。


3
投票

请确保您正在使用设备库来调用cublas。您不能使用与从主机调用它相同的库。有关使用cuda设备库的详细信息,请参见cuda工具包:http://docs.nvidia.com/cuda/cublas/index.html#device-api

查看7_CUDALibraries /下的cuda 5个样本。


0
投票

这里有一个针对您问题的代码示例,我认为this code link可以为您提供帮助。感谢Github的作者。

__global__ void invokeDeviceCublasSgemm(cublasStatus_t *returnValue,
                                    int n,
                                    const float *d_alpha,
                                    const float *d_A,
                                    const float *d_B,
                                    const float *d_beta,
                                    float *d_C)
{   
    cublasHandle_t cnpHandle;
    cublasStatus_t status = cublasCreate(&cnpHandle);

    if (status != CUBLAS_STATUS_SUCCESS){
        *returnValue = status;
        return;
    }

    /* Perform operation using cublas */
    status = cublasSgemm(cnpHandle,
                CUBLAS_OP_N, CUBLAS_OP_N,
                n, n, n,
                d_alpha,
                d_A, n,
                d_B, n,
                d_beta,
                d_C, n);
    cublasDestroy(cnpHandle);
    *returnValue = status;
}
© www.soinside.com 2019 - 2024. All rights reserved.