2013-02-13 4 views
-1

, 우리 모두가 알다시피CUDA : CUDA 커널에 여러 중복 인수를 전달하는 방법 나는 CUDA 커널에서 여러 중복 인수를 전달하는 elegent 방법을 찾고 있어요

, 각각의 커널 인수가 각각의 스택에있는 따라서 CUDA 스레드는 커널이 각 스택에있는 메모리 (각 스택에있는 메모리)로 전달되는 인수 사이에 중복이있을 수 있습니다.

전달되는 중복 된 인수의 수를 최소화하기 위해 나는 그렇게 우아한 방법을 찾고있다.

내 문제를 설명하기 위해 :

kernelFunction<<<gridSize,blockSize>>>(UINT imageWidth, UINT imageWidth, UINT imageStride, UINT numberOfElements,x,y,ect...) 
UINT IMAGEWIDTH, UINT IMAGEWIDTH, UINT imageStride가, UINT의 numberOfElements 인수는 각 스레드 재고에 위치

,

:의 내 코드는 다음과 같습니다 가정 해 봅시다 더 적은 인수를 보내고 다른 소스의 데이터에 액세스하는 트릭을 찾고 있습니다.

상수 메모리를 사용하려고 생각했지만 상수 메모리가 전역에 위치 했으므로 삭제합니다. 말할 필요도없이 메모리 위치가 빠르다.

도움을 주시면 감사하겠습니다.

+3

"각 커널 인수는 각 CUDA 스레드의 스택에 있습니다."- 커널 인수가 블록 범위 공유 메모리 (1.x) 또는 컨텍스트 범위 상수 메모리 (2.x, 3.x 계산). 이 질문의 전체 전제가 잘못되었습니다. – talonmies

답변

5

커널 인수는 상수 메모리 (또는 sm_1x의 공유 메모리)를 통해 전달되므로 사용자가 제안한대로 복제 할 수 없습니다.

c.f. programming guide :

__global__ 함수 매개 장치로 전달되어,

    공유 메모리를 통해
  • 및 컴퓨팅 능력 1.x에서의 장치에서 256 바이트로 제한된다
  • 일정한 메모리 통해
  • 및 컴퓨팅 성능이 2.x 이상인 장치의 경우 4KB로 제한됩니다. 물론

어느 레지스터 또는 이후에 다음 (C 표준에 따라) 로컬 복사본을 수정하고 코드에서 변수 중 하나를 수정 따라서 각 스레드가 자신의 복사본을 가지고한다면 필요한 경우 스택에 저장합니다.

+0

옙, 나는 복제를 피하는 방법을 찾고있다. – TripleS

+0

@TripleS 중복이 있다고 생각하는 곳을 설명해 주시겠습니까? 이 매개 변수를 읽기 전용으로 처리하면 필요할 때 상수 메모리에서 레지스터로로드됩니다. 값을 수정하면 결국 스택에 푸시되거나 레지스터에있을 수 있습니다. 많은 커널 시작에서 일정한 매개 변수가있는 경우 (a) 커널을 템플리트하거나 (b) 값을 __constant__ 변수에 복사하여 실행 매개 변수 전달 오버 헤드를 줄이십시오. –

+5

@TripleS : 존재하지 않는 문제를 해결하려고합니다. – talonmies

관련 문제