17

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

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

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

4

3 回答 3

11

是的,它可以(直到(不包括)CUDA 10 版本)。

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

在这里,您可以看到使用 cuda 和 CUBLAS 库函数 cublasSgemv 进行矩阵向量乘法。

但是请记住,CUDA 10 中不再有设备 CUBLAS 功能。从 Robert_Crovella 可以引用:

目前的建议是看看CUTLASS 2 是否会有所帮助(它主要关注与 GEMM 相关的活动)。如果没有,请编写您自己的代码来执行该功能,或者从主机代码中调用 cublas。

尽管如此,目前有几种矩阵向量乘法的在线实现,例如12等。

于 2012-11-14T01:32:13.260 回答
4

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

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

于 2013-09-17T15:38:07.713 回答
0

这里有一个针对您的问题的代码示例,我认为此代码链接可以帮助您。感谢 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;
}
于 2019-12-08T12:49:17.950 回答