2016-11-22 1 views
0

3x3 행렬과 360x360 행렬간에 행렬 곱셈을 수행하려고합니다. 작은 행렬 (3x3)은 큰 행렬의 첫 번째 (3x3) 블록으로 조작 될 것입니다. 그러므로 나는 더 작은 행렬을 일정하게 유지하고 그것을 더 큰 행렬 위로 밀어 넣고 싶다.cuda : 공유 및 전역을 사용하는 행렬 곱셈

내 작은 행렬을 공유 메모리의 일부로 저장하고 큰 행렬을 전역으로 3x3로 나눌 수 있습니까?

호스트에서 직접 공유하는 작은 매트릭스를 복사하는 방법을 찾지 못했습니다. 쿠다의 시각화가 잘못 되었다면 정정 해주세요.

감사합니다.

+2

당신은 할 수 없습니다 호스트에서 공유 메모리로 복사하십시오. 그건 지원되지 않습니다. – talonmies

답변

1

호스트의 공유 메모리를 채울 수 없습니다.

그러나 예제의 3x3 행렬과 같은 모든 스레드의 상수를 처리하는 가장 좋은 방법은 상수 메모리에 저장하는 것입니다 (크기는 64kB입니다). 상수 메모리를 사용하는 두 가지 방법이 있습니다 :

  • 가장 쉬운 방법은 커널 인수를 사용하는 것입니다. struct 정의 3 × 3 행렬을 포함하여 커널 인수를 포함하고 커널
  • 사용 __constant__ 유형의 규정에 전달하고 호스트에서 그것을 채울 cudaMemcpyToSymbol를 사용

    //In global scope 
    __constant__ float mat_gpu[3][3]; 
    //In the function that you use to populate the data 
    cudaMemcpyToSymbol(mat_gpu, mat_cpu, 9 * sizeof(float)); 
    //In your kernel you just use the mat_gpu variable 
    
+0

대단히 감사합니다. 이 __constant__ 유형 한정자와 cudaMemcpyToSymbol의 사용 예를 제공 할 수 있습니까? 정말 큰 도움이 될 것입니다. 미리 감사드립니다. –

+1

나는 cudaMemcpyToSymbol의 예제 사용법을 추가했다. – ptrendx