CUDA를 사용하여 벡터 (1 * N)와 행렬 (N * M)을 곱하고 결과를 새 벡터 (1 * M)에 저장할 수있는 방법을 알려주십시오. C++.CUDA를 사용하여 행렬로 벡터 곱하기 C++
4
A
답변
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를 배우는 동안 엄청난 도움이되었습니다. 이것을 제공해 주셔서 감사합니다! –
관련 문제
- 1. Python 3 : NumPy가없는 행렬로 벡터 곱하기
- 2. 벡터 곱하기 곱하기
- 3. CUDA를 사용하여 벡터 요소 최적화하기
- 4. 벡터 배열에 서로 곱하기
- 5. 2D 행렬로 3D 행렬 곱하기
- 6. 곱하기 벡터 요소 상응 C++
- 7. 2D/3D 벡터 곱하기
- 8. 행렬과 벡터 곱하기
- 9. 배열 열에 벡터 곱하기
- 10. 매트릭스별로 벡터 곱하기
- 11. 길이가 다른 R의 벡터 곱하기
- 12. 배열 및 벡터 곱하기 스레드를 사용하여 C 언어
- 13. Z3 파이썬 두 비트 벡터 곱하기
- 14. 숫자를 셀 배열에서 벡터 행렬로 변환
- 15. 수레 곱하기/나누기 곱하기 곱하기? 오브젝티브 C (또는 C)에서
- 16. CUDA를 사용하여 C++ 코드를 가속화하는 방법
- 17. 특수 벡터 및 요소 별 곱하기
- 18. 고유 벡터 행렬로 고유 값 행렬을 정렬
- 19. CUDA를 사용하여 GPU에서 실행하기위한 기존 C++ 코드 수정
- 20. 클래스 벡터 - 비 특정 차원의 두 벡터 곱하기
- 21. GPU에서 CUDA를 사용하여 데카르트 생성하기
- 22. 벡터로 벡터 요소 곱하기 사각형 매트릭스 반환
- 23. 정수로 정수 곱하기 (C++)
- 24. C++/CX - 벡터 벡터?
- 25. Linq를 사용하여 factor로 네이티브 C# 배열 곱하기
- 26. 공분산 행렬로 정규 분포 된 랜덤 벡터 생성
- 27. MPI를 사용하여 행렬을 곱하기
- 28. C# 문자열 곱하기 오류
- 29. C 곱하기 및 나눗셈
- 30. 행렬 곱하기 C++
최근 쿠다 (CUDA) 질문을 검색하거나 빨리 찾아 보면이 주제에 관한 3 가지 질문 (코드 포함)이 표시됩니다. 또한, CUDA SDK/examples에는 행렬 곱셈 예제가, CUBLAS에는 CUDA 배송이 있습니다. 당신이해야 할 일은 그들을 찾는 것입니다 .... – talonmies
[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 행렬 벡터 곱셈입니다. –