cuBLAS - cublasSdot和cublasSgemv没有指向GPU内存的问题

时间:2014-11-18 11:37:41

标签: c++ c cuda blas cublas

我正在玩cuBlas,尝试使用dot产品和矩阵矢量产品。在这样做的同时,我遇到了一个问题。首先,代码:

float result_1;
cublasSdot_v2(handle, c_nrSV[0] + 1, d_results[0], 1, d_ones, 1, &result_1);

c_nrSV是一个整数向量,d_results主机内存中包含指向设备内存中cublas向量的指针的数组,d_ones是指向设备内存中cublas向量的指针。对于cublas矢量,我的意思是它的值已经用cublasSetVector()设置。

这没有任何问题。如果我理解正确的话,result_1的值会驻留在主机内存中,并且点积的结果会被复制到那里。由于我想进一步使用点积的结果,我宁愿将它们放在GPU内存中。 cuBLAS文档声明结果可以在主机或设备内存中。所以我尝试以下方法:

float* result_2;
cudaMalloc((void**)&result_2, sizeof(float));
cublasSdot_v2(handle, c_nrSV[0] + 1, d_results[0], 1, d_ones, 1, result_2);

此错误导致错误:“访问冲突写入位置0x0000000701040C00”。我不太清楚发生了什么事。我对cublasSgemv也有同样的问题:

float alpha = 1;
float beta = 0;
cublasSgemv_v2(handle, CUBLAS_OP_N, c_nrSV[i], nrFeatures, &alpha, d_svms[i], c_nrSV[i], d_fvec, 1, &beta, d_results[i], 1)

这没有任何问题。该文档指出alpha和beta可以在GPU内存中。但是,如果我将alpha和beta声明为设备内存并将其初始化为:

float h_alpha = 1;
float h_beta = 0;
float* alpha;
float* beta;
cudaMalloc((void**)&alpha, sizeof(float));
cudaMalloc((void**)&beta, sizeof(float));
cudaMemcpy(alpha, &h_alpha, sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(beta, &h_beta, sizeof(float), cudaMemcpyHostToDevice);
cublasSgemv_v2(handle, CUBLAS_OP_N, c_nrSV[i], nrFeatures, alpha, d_svms[i], c_nrSV[i], d_fvec, 1, beta, d_results[i], 1);

我收到同样的错误:“访问冲突读取位置0x0000000701040E00。”

发生了什么事?我是否必须指定内存在设备中而不在主机上?

0 个答案:

没有答案