我使用以下代码来进行矩阵的转置,但它再次给了我初始矩阵。
--- -------- EDITED
现在,我得到了结果矩阵的零。
int main(int argc,char**argv)
{
const int rows=2,cols=2;
//size in bytes
const int ARRAY_BYTES = ( rows * cols ) *sizeof(int);
float *A , *A_Copy;
A = (float *) malloc(ARRAY_BYTES);
A_Copy = (float *) malloc(ARRAY_BYTES);
//initialize
for (int i=0; i<rows; ++i)
for (int j=0; j<cols; ++j)
A_Copy[i+rows*j] = 0;
A[0]=0;
A[1]=1;
A[2]=2;
A[3]=3;
// print matrix
printf("\nA matrix");
for (int i=0; i<rows; ++i) {
for (int j=0; j<cols; ++j)
printf("\nA = %f",A[i+rows*j]);
printf("\n");
}
float *A_dev , *A_Copy_dev;
cudaMalloc((void **) &A_dev, ARRAY_BYTES);
cudaMalloc((void **) &A_Copy_dev, ARRAY_BYTES);
cudaMemcpy(A_dev, A, ARRAY_BYTES, cudaMemcpyHostToDevice);
cudaMemcpy(A_Copy_dev, A_Copy, ARRAY_BYTES, cudaMemcpyHostToDevice);
float const alpha(1.0);
float const beta(0.0);
cublasHandle_t handle;
cublasStatus_t status;
status = cublasCreate(&handle);
cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_HOST);
//status = cublasSgeam(handle,CUBLAS_OP_T, CUBLAS_OP_N, rows, cols , &alpha ,A_Copy ,cols , &beta , A_Copy , rows , A ,rows);
status = cublasSgeam(handle,CUBLAS_OP_T, CUBLAS_OP_N, rows, cols , &alpha ,A_Copy_dev ,rows , &beta ,A_Copy_dev ,rows, A_dev , rows);
cudaMemcpy(A,A_dev, ARRAY_BYTES, cudaMemcpyDeviceToHost);
printf("\nA transposed ");
for (int i=0; i<rows; ++i) {
for (int j=0; j<cols; ++j)
printf("\nA = %f",A[i+rows*j]);
printf("\n");
}
cudaFree(A_dev);
cudaFree(A_Copy_dev);
free(A);
free(A_Copy);
return 0;
}
答案 0 :(得分:2)
CUBLAS期望在设备上分配输入和输出矩阵。因此,在您的情况下,您应该使用A
创建A_Copy
和cudaMalloc
的设备副本,并将其传递给函数cublasSgeam
。
此外,默认情况下,还应在设备上分配alpha
和beta
,但cublas提供了为这些变量使用主机指针的选项。您所要做的就是在调用cublasSgeam
之前更改cublas句柄的指针模式。
cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_HOST);
您正在获得零,因为您正在使用零初始化A_Copy
并将其复制到A_Copy_dev
,该cudaMemcpy
用作cublas函数的 A 输入矩阵。所以基本上,你提供零输入并获得零输出。
在第二次A_Copy
来电中,您应该将A
复制到A_Copy_dev
,而不是cudaMemcpy(A_Copy_dev, A, ARRAY_BYTES, cudaMemcpyHostToDevice);
,而不是A_Copy
。
{{1}}
此代码中不需要{{1}}。