2011-03-29 5 views
9

나는 각 차원에 대해 10-20.000까지 다양 할 수있는 알 수없는 크기의 행렬에 여전히 화를 내고 있습니다.CUDA - 블록을 너무 많이 선택하면 어떻게 될까요?

나는 CUDA sdk를보고 궁금해한다. 내가 너무 많은 블록을 선택하면 어떨까?

X 및 Y 차원에서 9999 x 9999 블록의 격자와 같은 것이 있습니다. 하드웨어에 이러한 블록을 모두 수용 할 수없는 SM이 있으면 커널에 문제가 있거나 성능이 저하됩니다.

블록/스레드의 크기가 너무 많이 달라질 수있는 방법을 모르겠다. 내 하드웨어가 지원하는 블록의 최대 개수를 사용하고 그 내부의 스레드를 모든 매트릭스에서 작동시키는 것으로 생각하고있다. 이것이 올바른 방법입니까?

답변

13

스레드 블록에는 코어와 일대일 매핑이 없습니다. 블록은 사용 가능 해지면 코어로 예약되므로 원하는 수만큼 요청할 수 있습니다 (최대 한도까지). 방대한 블록 수를 요청하면 시스템에 스레드 블록을로드하고 언로드 할 때 시스템 속도가 느려집니다.

런타임에 눈금과 블록의 크기를 지정할 수 있습니다.

편집 : 다음은 문서에서 그리드와 블록의 크기 제한입니다. 당신이 너무 큰 블록 크기를 선택하면 "죽은"블록 마이크로 몇 수십 심지어의 최대 격자 크기에 대해 일반적으로 전용 (은퇴다면

enter image description here

2

, 당신은 어떤 사이클을 낭비 "풀 사이즈"페르미 또는 GT200 카드). 거대한 형벌이 아닙니다.

그러나 그리드 차원은 항상 사전 값으로 계산되어야합니다. 일반적으로 데이터 병렬 작업의 수량화 가능한 단위 - 데이터 포인트 당 하나의 스레드 또는 행렬 당 하나의 블록 또는 기타와 같은 - 런타임에서 필요한 그리드 차원을 계산할 수있는 관계가 알려져 있습니다.

대체 전략은 고정 된 수의 블록을 사용하고 (일반적으로 GPU에서 MP 당 4-8 정도만 필요함) 각 블록/스레드 프로세스에 여러 병렬 작업 단위를 할당하여 각 블록이 "지속성 있는". 스레드 당 설정에 고정 된 오버 헤드 비용이 많이있는 경우 스레드 당 더 많은 작업에서 고정 된 오버 헤드를 상환하는 좋은 방법이 될 수 있습니다.

관련 문제