我尝试将以列式主格式存储的矩阵[1 2 3 4 ; 5 6 7 8 ; 9 10 11 12 ]
复制为x
,首先使用{{1}将其复制到NVIDIA GPU d_x
中的矩阵然后使用cublasSetMatrix
将d_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。
答案 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
作为快速测试来运行代码。