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);

此代码中不需要
副本

:好的,谢谢。我现在得到的结果矩阵是零。我更新了代码。