我知道这听起来很奇怪,但这是我的情景:
我需要进行矩阵 - 矩阵乘法(A(n * k)* B(k * n)),但我只需要对输出矩阵求对角元素。我搜索了cublas库,没有找到任何能够做到这一点的2级或3级功能。 所以,我决定将A的每一行和B的每一列分配到CUDA线程中。对于每个线程(idx),我需要计算点积“A [idx,:] * B [:,idx]”并将其保存为相应的对角线输出。既然这个点产品也需要一些时间,我想知道我是否可以在某种程度上调用cublas功能(比如cublasSdot)来实现它。
如果我错过了一些可以直接实现我的目标的cublas函数(只计算矩阵乘法的对角元素),这个问题可能会被丢弃。
答案 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;
}