我知道这听起来很奇怪,但是这是我的情况:
我需要做一个矩阵矩阵乘法(A(n * k)* B(k * n)),但我只需要对角元素进行输出矩阵评估。我搜索了cublas库,但没有找到可以执行此操作的任何2级或3级函数。因此,我决定将A的每一行和B的每一列分配到CUDA线程中。对于每个线程(idx),我需要计算点积“ A [idx,:] * B [:,idx]”并将其保存为相应的对角线输出。现在,由于该点产品也需要一些时间,因此我想知道是否可以通过某种方式在此处调用cublas函数(例如cublasSdot)来实现它。
如果我错过了一些可以直接实现我的目标的cublas函数(仅计算矩阵矩阵乘法的对角线元素,则可以忽略此问题。
请确保您正在使用设备库来调用cublas。您不能使用与从主机调用它相同的库。有关使用cuda设备库的详细信息,请参见cuda工具包:http://docs.nvidia.com/cuda/cublas/index.html#device-api
查看7_CUDALibraries /下的cuda 5个样本。
这里有一个针对您问题的代码示例,我认为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;
}