Cuda 马里克斯的转置
我使用下面的代码对矩阵进行转置,但它再次给出了初始矩阵 ---编辑-------- 现在,我得到了结果矩阵的零Cuda 马里克斯的转置,cuda,cublas,Cuda,Cublas,我使用下面的代码对矩阵进行转置,但它再次给出了初始矩阵 ---编辑-------- 现在,我得到了结果矩阵的零 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 *) mall
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;
}
int main(int argc,char**argv)
{
const int rows=2,cols=2;
//大小(字节)
常量int数组_字节=(行*列)*sizeof(int);
浮动*A,*A_副本;
A=(浮点*)malloc(数组_字节);
A_Copy=(float*)malloc(数组_字节);
//初始化
对于(int i=0;iCUBLAS期望在设备上分配输入和输出矩阵。因此,在您的情况下,您应该使用Cudamaloc
创建A
和A_Copy
的设备副本,并将它们传递给函数Cubrasgeam
cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_HOST);
此外,默认情况下,设备上也应分配alpha
和beta
,但cublas提供了一个选项,可以为这些变量使用主机指针。您所要做的就是在调用Cublasgeam
之前更改cublas句柄的指针模式
cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_HOST);
更新:
您得到的是零,因为您正在初始化带有零的A_Copy
,并将其复制到A_Copy\u dev
,后者用作cublas函数的A输入矩阵。因此,基本上,您提供零输入并获得零输出
在第二个cudaMemcpy
调用中,您应该像下面这样将A
复制到A\u Copy\u dev
:
cudaMemcpy(A_Copy_dev, A, ARRAY_BYTES, cudaMemcpyHostToDevice);
此代码中不需要副本。:好的,谢谢。我现在得到的结果矩阵是零。我更新了代码。