2010-07-12 7 views
1

블록에 512 개의 스레드가 있다는 가정하에 말하자면, 커널에 512 개 이상의 스레드가 필요하다고 가정 할 때 최적의 성능을 위해 스레드 계층을 어떻게 설계해야할까요? (케이스 1)CUDA의 커널 계층 구조 디자인

첫번째 블록 - 512 개 스레드 2 블록 - 나머지 스레드

(케이스 2하는) 소정 블록에 걸쳐 동일한 개수의 스레드를 배포한다.

+0

커널에 600 개의 스레드가 필요한 경우 300 개의 스레드를 2 개의 블록에 할당하는 것이 가장 좋습니다. 또는 첫 번째 블록의 512 스레드를 모두 활용하고 두 번째 블록에 남겨 둘 수있는 옵션이 있습니까? –

+0

나는 그것이 당신이 풀려고하는 문제에 달려 있다고 생각한다. 조금 더 구체적으로 말씀해 주시겠습니까? – KLee1

+0

내 커널이 601 스레드 나 홀수를 필요로하는 경우에도 블록을 어떻게 할당해야합니까? –

답변

1

나는 그것이 정말 중요하다고 생각하지 않지만, 당신이 (병합 메모리 같은) 다른 CUDA 최적화를 사용할 수 있습니다 있도록이

This link이에 몇 가지 통찰력을 제공, 스레드 블록 논리적 그룹에 더 중요하다 CUDA가 당신 스레드를 (가능성있게) 구성하고 정리할 수 있습니다.

요약에서 인용 :

이 요약 방식, 커널 발사 특별한 매개 변수 그리드와 블록의 크기를 정의합니다. 유니크 은 blockId와 threadId 좌표가 이고 그리드의 스레드가 으로 구분됩니다. 커널 에서 이러한 변수를 사용하여 함수를 사용하는 프로그래머의 책임이므로 스레드는 이 처리 할 데이터 부분을 올바르게 식별 할 수 있습니다. 이 변수 들인 은 스레드와 그곳의 데이터를 계층 구조 및 다차원 조직으로 구성하도록 프로그래머에게 강요합니다.

0

계산/메모리 액세스 중첩을 최대화하기 위해 스레드를 똑같이 두 개의 블록으로 나누는 것이 바람직합니다. 예를 들어 블록에 256 개의 스레드가있는 경우에는 모두 동시에 계산하지 않으며 32 개 스레드의 워프로 SM에 예약됩니다. 워프가 글로벌 메모리 데이터를 기다리고있을 때 다른 워프가 스케쥴됩니다. 작은 스레드 블록이있는 경우 전역 메모리 액세스가 훨씬 더 불리합니다.

또한 예제에서 GPU는 사용하지 않습니다. GPU에는 수십 개의 멀티 프로세서 (예 : C1060 Tesla의 경우 30 개)가 있고 블록은 멀티 프로세서에 매핑된다는 점을 기억하십시오. 귀하의 경우에는 2 개의 멀티 프로세서 만 사용하게됩니다.