CUDA cuBlasGetmatrix / cublasSetMatrix失败|参数解释

时间:2015-06-22 14:14:12

标签: cuda gpgpu gpu-programming cublas

我尝试将以列式主格式存储的矩阵[1 2 3 4 ; 5 6 7 8 ; 9 10 11 12 ]复制为x,首先使用{{1}将其复制到NVIDIA GPU d_x中的矩阵然后使用cublasSetMatrixd_x复制到y

cublasGetMatrix()

副本后的输出显示#include<stdio.h> #include"cublas_v2.h" int main() { cublasHandle_t hand; float x[][3] = { {1,5,9} , {2,6,10} , {3,7,11} , {4,8,12} }; float y[4][3] = {}; float *d_x; printf("X\n"); for( int i=0 ; i<4 ; i++ ) { printf("Row %i:",i+1); for( int j = 0 ; j<3 ; j++ ) { printf(" %f",x[i][j]); } putchar('\n'); } printf("Y\n"); for( int i=0 ; i<4 ; i++ ) { printf("Row %i:",i+1); for( int j = 0 ; j<3 ; j++ ) { printf(" %f",y[i][j]); } putchar('\n'); } cublasCreate( &hand ); cudaMalloc( &d_x,sizeof(d_x) ); cublasSetMatrix( 3,4,sizeof(float),x,3,d_x,3 ); cublasGetMatrix( 3,4,sizeof(float),d_x,3,y,3 ); printf("X\n"); for( int i=0 ; i<4 ; i++ ) { printf("Row %i:",i+1); for( int j = 0 ; j<3 ; j++ ) { printf(" %f",x[i][j]); } putchar('\n'); } printf("Y\n"); for( int i=0 ; i<4 ; i++ ) { printf("Row %i:",i+1); for( int j = 0 ; j<3 ; j++ ) { printf(" %f",y[i][j]); } putchar('\n'); } cudaFree( d_x ); cublasDestroy( hand ); return 0; } 填充了y s。

是否有任何0函数调用失败了?

或/和

是否有错误的参数传递给cublas函数?

另外,请解释函数的每个参数的用途。

在Fedora 21 x86_64上使用GeForce GTX 650和CUDA 6.5。

1 个答案:

答案 0 :(得分:3)

代码中唯一的实际问题是:

cudaMalloc( &d_x,sizeof(d_x) );

sizeof(d_x)只是指针的大小。你可以像这样解决它:

cudaMalloc( &d_x,sizeof(x) );

如果你想知道CUBLAS API调用是否失败,那么你应该检查API调用的返回码:

cublasStatus_t res = cublasSetMatrix( 3,4,sizeof(float),x,3,d_x,3 );

关于参数的描述,您将它们全部正确(除了与d_x关联的分配错误之外)。所以不清楚你需要描述哪一个,但它们都在documentation中描述。

CUDA API调用(如cudaMalloc)也会返回错误代码,因此您也应该检查这些错误代码。每当您遇到CUDA代码时遇到问题,最好使用proper cuda error checking。您也可以使用cuda-memcheck作为快速测试来运行代码。