2017-12-11 4 views
0

はK20Xm.Hereが私のコードです。私の限られたテストでCUBLAS cublasSgemv cublasSegmv.My GPUを実行しているとき、私はセグメンテーションフォールトを得ている「セグメンテーションフォールト」

float *a, *x, *y; 
int NUM_VEC = 8; 
y = (float*)malloc(sizeof(float) * rows * NUM_VEC); 
a = (float*)malloc(sizeof(float) * rows * cols); 
x = (float*)malloc(sizeof(float) * cols * NUM_VEC); 
get_mat_random(a, rows, cols); 
get_vec_random(x, cols * NUM_VEC); 

float *d_a = 0; 
float *d_x = 0; 
float *d_y = 0; 

cudaMalloc((void **)&d_a, rows * cols * sizeof(float); 
cudaMalloc((void **)&d_x, cols * NUM_VEC * sizeof(float); 
cudaMalloc((void **)&d_y, rows * NUM_VEC * sizeof(float); 
cublasSetVector(rows * cols, sizeof(float), a, 1, d_a, 1); 
cublasSetVector(NUM_VEC * cols, sizeof(float), x, 1, d_x, 1); 
cublasSetVector(NUM_VEC * rows, sizeof(float), y, 1, d_y, 1); 
float alpha = 1.0f; 
for (int i = 0; i < NUM_VEC; i++) { 
    cublasSgemv(handle, CUBLAS_OP_T, cols, rows, &alpha, d_a, rows, d_x + i * cols, 1,0, d_y + i * rows, 1); 
} 
+0

ご協力をお願いいたします – SelakaN

+0

私のすべてのコードを追加しました。 –

答えて

1

、エラーがcublasSgemvのためbetaパラメータであり、 NULLすることはできません。あなたはbetaいずれかの変数ホストまたはデバイス上のメモリを割り当てる必要があります。後、私はエラーを再現し、修正するために使用されるコードである。

#include <cstdio> 
#include <iostream> 
#include <cuda_runtime.h> 
#include <cublas_v2.h> 
#include <cstdlib> 

using namespace std; 

void get_vec_random(float* a, int count) 
{ 
    for(int i=0; i<count; i++) 
     a[i] = rand()/float(RAND_MAX);  
} 

void get_mat_random(float* a, int rows, int cols) 
{ 
    get_vec_random(a, rows * cols); 
} 

int main(int argc, char** argv) 
{ 
    int rows = 10, cols = 10; 

    cublasHandle_t handle; 
    cublasCreate(&handle); 


    float *a, *x, *y; 
    int NUM_VEC = 8; 
    y = (float*)malloc(sizeof(float) * rows * NUM_VEC); 
    a = (float*)malloc(sizeof(float) * rows * cols); 
    x = (float*)malloc(sizeof(float) * cols * NUM_VEC); 
    get_mat_random(a, rows, cols); 
    get_vec_random(x, cols * NUM_VEC); 

    float *d_a = 0; 
    float *d_x = 0; 
    float *d_y = 0; 

    cudaMalloc((void **)&d_a, rows * cols * sizeof(float)); 
    cudaMalloc((void **)&d_x, cols * NUM_VEC * sizeof(float)); 
    cudaMalloc((void **)&d_y, rows * NUM_VEC * sizeof(float)); 


    cublasSetVector(rows * cols, sizeof(float), a, 1, d_a, 1); 
    cublasSetVector(NUM_VEC * cols, sizeof(float), x, 1, d_x, 1); 
    cublasSetVector(NUM_VEC * rows, sizeof(float), y, 1, d_y, 1); 

    float alpha = 1.0f, beta = 1.0f; 

    cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_HOST); 
    for (int i = 0; i < NUM_VEC; i++) 
    { 
     cublasSgemv(handle, 
        CUBLAS_OP_T, 
        cols, 
        rows, 
        &alpha, 
        d_a, 
        rows, 
        d_x + i * cols, 
        1, 
        &beta, 
        d_y + i * rows, 
        1); 
    } 
    return 0; 
} 

これで問題が解決希望。

+0

それは今働きます!ありがとう! –

+1

@ KuiYan ..解決済みとしてマークすることができるように問題を修正した場合、回答を受け入れることを検討することができます:) – sgarizvi

関連する問題