转置矩阵

时间:2014-03-21 11:13:21

标签: cuda cublas

我使用以下代码来进行矩阵的转置,但它再次给了我初始矩阵。

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

1 个答案:

答案 0 :(得分:2)

CUBLAS期望在设备上分配输入和输出矩阵。因此,在您的情况下,您应该使用A创建A_CopycudaMalloc的设备副本,并将其传递给函数cublasSgeam

此外,默认情况下,还应在设备上分配alphabeta,但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}}。