2015-06-22 3 views
1

я попытался скопировать матрицу [1 2 3 4 ; 5 6 7 8 ; 9 10 11 12 ] сохраненной в формате столбцы, как x, сначала скопируйте его в матрицу в качестве NVIDIA GPU d_x с использованием cublasSetMatrix, а затем скопировать d_x в y используя cublasGetMatrix().CUDA cuBlasGetmatrix/cublasSetMatrix не работает | Объяснение аргументов

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

Выход после копирования показывает y заполнены 0 с.

Выполнено ли какое-либо из вызовов функции cublas?

/или

Есть неправильные аргументы были переданы в cublas функции?

Кроме того, пожалуйста, объясните назначение каждого аргумента для функций.

Использование GeForce GTX 650 с CUDA 6.5 на Fedora 21 x86_64.

ответ

3

только актуальная проблема в коде здесь:

cudaMalloc(&d_x,sizeof(d_x)); 

sizeof(d_x) только размер указателя. Вы можете исправить это следующим образом:

cudaMalloc(&d_x,sizeof(x)); 

Если вы хотите узнать, если API вызова CUBLAS терпит неудачу, то вы должны проверить код возврата вызова API:

cublasStatus_t res = cublasSetMatrix(3,4,sizeof(float),x,3,d_x,3); 

Что касается описания из параметров, вы имеете их все правильно (кроме ошибки распределения, связанной с d_x). Поэтому неясно, какой из них вам нужен, но все они описаны в documentation.

Вызов API CUDA (например, cudaMalloc) также возвращает код ошибки, поэтому вы должны также проверить их. Каждый раз, когда у вас возникают проблемы с кодом CUDA, рекомендуется использовать proper cuda error checking. Вы также можете запустить свои коды с cuda-memcheck в качестве быстрого теста.