2012-04-16 1 views
1

CUDA 2.0 (NVIDIA 590)으로 큰 구조의 배열을 처리하려고합니다. 나는 그것을 위해 공유 메모리를 사용하고 싶다. 나는 각 쓰레드가 배열의 전체 요소를 처리 할 수 ​​있도록 쓰레드 당 최대 공유 메모리를 할당하려고 CUDA 점유율 계산기를 실험했다. 그러나 최대 (블록 당 공유 메모리)/(블록 당 스레드 수) 100 % 다중 프로세서로드에서 계산기에서 볼 수있는 32 바이트는 단일 요소에 충분하지 않습니다 (크기 순서대로). (블록 당 공유 메모리)/(블록 당 스레드)의 최대 값은 32 바이트입니까? alter4native가 바람직하다고 말할 수 있습니까? 배열의 일부를 전역 메모리에 할당하거나 언로드 된 다중 프로세서를 사용합니까? 아니면 실험을 통해서만 결정할 수 있습니까? 내가 볼 수있는 또 다른 방법은 여러 단계에서 배열을 처리하는 것이지만 최후의 수단으로 보입니다. 처음으로 CUDA와 매우 복잡한 것을 시도하고 있으므로 다른 옵션을 놓칠 수 있습니다 ...CUDA에서 100 % MP로드가있는 최대 (블록 당 공유 메모리)/(블록 당 스레드)

답변

6

CUDA 커널을 설계 할 때 유의해야 할 하드웨어 제한이 많습니다. 여기에 어떤 제약 조건은 고려할 필요가 있습니다

  • 단일 블록에서 실행할 수있는 스레드의 최대 수
  • 당신이 한 번에
  • 최대 수의 스트리밍 멀티 프로세서에로드 할 수있는 블록의 최대 수 스트리밍 멀티 프로세서 먼저 공격 이러한 제한의

어느 당 공유 메모리의 스트리밍 멀티 프로세서 당 레지스터는

  • 최대 금액은 occu을 제한하는 제약 조건이된다 pancy ("100 % Multiprocessor load"로 참조하는 최대 점유율)? 일단 귀하가 특정 점유 기준에 도달하면, 점유에주의를 기울이는 것이 덜 중요 해집니다. 예를 들어 33 %의 점유율만으로도 GPU의 최대 이론적 성능의 33 % 만 달성 할 수 있다는 의미는 아닙니다. 바실리 볼코프 (Vasily Volkov)는 2010 GPU 기술 컨퍼런스에서 커다란 점유에 ​​대해 걱정하지 않고 커널에서 명시 적 캐싱 트릭 (및 기타 사항)을 사용하여 메모리 트랜잭션을 최소화하려고 권고했다. 여기에서 대화를 볼 수 있습니다 : http://www.gputechconf.com/gtcnew/on-demand-GTC.php?sessionTopic=25&searchByKeyword=occupancy&submit=&select=+&sessionEvent=&sessionYear=&sessionFormat=#193

    최상의 성능을 제공하는 커널 디자인을 사용하고 있는지 확인하는 유일한 방법은 모든 가능성을 테스트하는 것입니다. 또한 모든 유형의 장치에 대해이 성능 테스트를 다시해야합니다. 왜냐하면 모든 유형의 장치가 서로 다른 제약 조건을 가지고 있기 때문입니다. 이것은 분명히 지루할 수 있습니다. 특히 다른 디자인 패턴이 근본적으로 다른 커널을 만들 때 더욱 그렇습니다. 필자는 템플릿 엔진을 사용하여 장치 하드웨어 사양에 따라 런타임에 동적으로 커널을 생성하지만 어느 정도는이 문제를 해결할 수 있습니다.하지만 여전히 약간의 혼란이 있습니다.

  • +0

    감사합니다. 그 강의는 제 정신을 거의 대답했습니다. – mirror2image

    관련 문제