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

时间:2012-11-14 00:09:20

标签: cuda gpu cublas

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

我需要进行矩阵 - 矩阵乘法(A(n * k)* B(k * n)),但我只需要对输出矩阵求对角元素。我搜索了cublas库,没有找到任何能够做到这一点的2级或3级功能。 所以,我决定将A的每一行和B的每一列分配到CUDA线程中。对于每个线程(idx),我需要计算点积“A [idx,:] * B [:,idx]”并将其保存为相应的对角线输出。既然这个点产品也需要一些时间,我想知道我是否可以在某种程度上调用cublas功能(比如cublasSdot)来实现它。

如果我错过了一些可以直接实现我的目标的cublas函数(只计算矩阵乘法的对角元素),这个问题可能会被丢弃。

3 个答案:

答案 0 :(得分:10)

是的,它可以。

“CUDA C / C ++中提供的语言界面和设备运行时API是主机上可用的CUDA运行时API的子集。设备上保留了CUDA运行时API的语法和语义,以便于轻松实现可以在主机或设备环境中运行的API例程的代码重用。内核也可以直接调用诸如CUBLAS 之类的GPU库,而无需返回CPU。“ Source

Here您可以使用cuda和CUBLAS库函数cublasSgemv查看和Matrix-Vector Multiplication。

答案 1 :(得分:3)

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

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

答案 2 :(得分: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;
}