2011-07-17 3 views
0

나는이 데이터베이스 검색 애플리케이션을 CUDA로 가속화하려고하고 있으며, 핵심 알고리즘을 CUDA와 병렬로 실행하고 있습니다.블록/그리드 및 스레드/블록을 활용하는 방법은 무엇입니까?

하나의 테스트에서 격자 당 500 개의 블록과 블록 당 100 개의 스레드로 5000 개의 디지털 시퀀스에서 병렬로 알고리즘을 실행하고 대략 500 ms의 런트 시간으로 돌아 왔습니다.

그런 다음 디지털 시퀀스의 크기를 그리드 당 128 개의 블록과 블록 당 64 개의 스레드로 8192 개로 늘렸고 알고리즘을 실행하기 위해 350 ms의 결과를 얻었습니다.

이것은 사용 된 블록 및 스레드의 수와 관련성이 성능에 영향을 미친다는 것을 나타냅니다.

내 질문은 어떻게 블록/그리드 및 스레드/블록의 수를 결정하는 것입니다?

나는 표준 장치 조회 프로그램에서 내 GPU 사양이 아래 : enter image description here

답변

2

는 특정 커널에 의존하기 때문에 당신은 그것을 테스트해야합니다. 한 가지해야 할 일은 블록 당 스레드 수를 워프에있는 스레드 수의 배수로 만드는 것입니다. 그 후에는 각 SM의 높은 점유를 목표로 할 수는 있지만 항상 높은 성능과 동의어는 아닙니다. 때로는 더 적은 인원이 더 나은 성능을 제공 할 수있는 것으로 나타났습니다. 메모리 바운드 커널은 일반적으로 메모리 대기 시간을 숨기기 위해 더 많은 인원을 필요로합니다. 바운드 커널을 그렇게 많이 계산하지 마십시오. 다양한 구성을 테스트하는 것이 최선의 방법입니다.

+1

또한 멀티 프로세서 당 균형 잡힌 작업량을 확보하십시오. 따라서 스레드 블록 수를 대략 멀티 프로세서 개수의 배수로 설정하십시오. 이것은 작은 그리드에서 더 중요합니다. 매우 큰 그리드의 경우, 멀티 프로세서 당 하나의 블록 차이가 그다지 중요하지 않습니다. – harrism

+1

@ seljuq70 fp32 작업의 fermi 아키텍처에 적합한 비율은 ECC가 해제 된 경우 4.5, ECC가있는 경우는 – fabrizioM

+0

입니다. 누군가 테스트했거나 NVIDIA가 어딘가에서 그것을 말했지만 놓쳤습니다. 어느쪽으로 든 잘 알고 있습니다. – jmsu

관련 문제