2012-12-27 3 views
4

CUDA를 사용하여 벡터 (1 * N)와 행렬 (N * M)을 곱하고 결과를 새 벡터 (1 * M)에 저장할 수있는 방법을 알려주십시오. C++.CUDA를 사용하여 행렬로 벡터 곱하기 C++

+1

최근 쿠다 (CUDA) 질문을 검색하거나 빨리 찾아 보면이 주제에 관한 3 가지 질문 (코드 포함)이 표시됩니다. 또한, CUDA SDK/examples에는 행렬 곱셈 예제가, CUBLAS에는 CUDA 배송이 있습니다. 당신이해야 할 일은 그들을 찾는 것입니다 .... – talonmies

+3

[Here] (http://docs.nvidia.com/cuda/cuda-samples/index.html#matrix-multiplication--cuda-runtime-api-version -)는 cuda 행렬 곱셈 표본입니다. [Here] (http://docs.nvidia.com/cuda/cublas/index.html#topic_7_2)는 CUBLAS 행렬 벡터 곱셈입니다. –

답변

11

StackOverflow는 질문을하고 해결책을 설명하는 곳이라고 생각합니다. 이 질문은 많은 사람들에 의해 떨어지게되었지만 나는이 질문에 답했다. 어쩌면 질문자는 사용 가능한 솔루션에 대해 토론 할 필요가있을 것입니다. 그것은 큰 N에 대한 맞게 약간의 수정을 필요로

#include <stdio.h> 
#include <cuda.h> 
#include <time.h> 

__global__ 
void kernel(float *vec, float *mat, float *out, const int N, const int M){ 
    int tid=threadIdx.x+blockIdx.x*blockDim.x; 
     float sum=0; 
    if(tid<M){ 
     for(int i=0; i<N; i++) 
      sum += vec[i]*mat[(i*M)+tid]; 
     out[tid]=sum; 
    } 
} 

// debuging functions 
void init_array(float *a, const int N); 
void init_mat(float *a, const int N, const int M); 
void print_array(float *a, const int N, char *d); 
void print_mat(float *a, const int N, const int M, char *d); 

int main (void) { 
     srand(time(NULL)); 

    float *a, *b, *c; 
     float *dev_a, *dev_b, *dev_c; 

    int N=3; 
    int M=4; 
    a=(float*)malloc(sizeof(float)*N); 
    b=(float*)malloc(sizeof(float)*N*M); 
    c=(float*)malloc(sizeof(float)*M); 
     init_array(a, N); 
     init_mat(b, N, M); 
     init_array(c, M); 

    printf("<<<<<<<<<< initial data:\n"); 
     print_array(a, N, "in-vector"); 
     print_mat(b, N, M, "matrix"); 
     print_array(c, M, "out-vector"); 

     cudaMalloc((void**)&dev_a, sizeof(float)*N); 
     cudaMalloc((void**)&dev_b, sizeof(float)*N*M); 
     cudaMalloc((void**)&dev_c, sizeof(float)*M); 

     cudaMemcpy(dev_a, a, sizeof(float)*N, cudaMemcpyHostToDevice); 
     cudaMemcpy(dev_b, b, sizeof(float)*N*M, cudaMemcpyHostToDevice); 

    printf("\n\nRunning Kernel...\n\n"); 
     kernel<<<M/256+1, 256>>>(dev_a, dev_b, dev_c, N, M); 
     //printf("error code: %s\n",cudaGetErrorString(cudaGetLastError())); 

     cudaMemcpy(c, dev_c, sizeof(float)*M, cudaMemcpyDeviceToHost); 

     cudaFree(dev_a); 
     cudaFree(dev_b); 
     cudaFree(dev_c); 

    printf(">>>>>>>>>> final data:\n"); 
     print_array(c, M, "out-vector"); 

     return 0; 
}; 

void init_array(float *a, const int N) { 
     int i; 
     for(i=0; i<N; i++) 
       a[i] = rand() % 4 + 1; 
} 
void init_mat(float *a, const int N, const int M) { 
     int i, j; 
     for(i=0; i<N; i++) 
      for(j=0; j<M; j++) 
        a[i*M+j] = rand() % 4 + 1; 
} 
void print_array(float *a, const int N, char *d) { 
     int i; 
     for(i=0; i<N; i++) 
       printf("\n%s[%d]: %f",d, i, a[i]); 
    printf("\n"); 
} 
void print_mat(float *a, const int N, const int M, char *d) { 
     int i, j; 
     for(i=0; i<N; i++){ 
     printf("\n%s[%d]:", d, i); 
     for (j=0; j<M; j++) 
        printf("\t%6.4f", a[i*M+j]); 
    } 
    printf("\n"); 
} 

: 여기에 큰 M위한 코드입니다.

+0

이것은 CUDA를 배우는 동안 엄청난 도움이되었습니다. 이것을 제공해 주셔서 감사합니다! –