【问题标题】:CUDA cuBlasGetmatrix / cublasSetMatrix fails | Explanation of argumentsCUDA cuBlasGetmatrix / cublasSetMatrix 失败 |论据的解释
【发布时间】:2015-09-08 00:53:53
【问题描述】:

我尝试将矩阵[1 2 3 4 ; 5 6 7 8 ; 9 10 11 12 ] 以列主要格式存储为x,首先使用cublasSetMatrix 将其复制到NVIDIA GPU d_x 中的矩阵,然后复制d_xy 使用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;
}

复制后的输出显示y0s填充。

是否有任何 cublas 函数调用失败?

或/和

是否将错误的参数传递给cublas 函数?

另外,请解释每个函数参数的用途。

在 Fedora 21 x86_64 上使用 GeForce GTX 650 和 CUDA 6.5。

【问题讨论】:

    标签: cuda gpgpu gpu cublas


    【解决方案1】:

    您的代码中唯一的实际问题在这里:

    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 运行您的代码作为快速测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      相关资源
      最近更新 更多