2017-05-16 1 views
3

는 모든 GPU 쓰레드는, 예를 들어 동일한 시간 복잡도 O.가 예상 변환 : 불규칙한에서GPGPU : '비정규'변환을 처리하는 효과적인 방법은 무엇입니까? 일반에

for i=0 to 10: c[i] = a[i]*b[i] 

변환, 안 : 같이 배열 결과

for i=0 to len(arr) 
    for k=0 to random()%100 
     arr[i] += 1 

[2,50,32,77,1,5,66, ...] 각 요소는 대략 계산 비용을 나타냅니다.

GPGPU 프로그래밍은 '요소 별 추가', '행렬 곱셈', '컨볼 루션'등과 같은 규칙적인 변환에 매우 적합합니다. 하지만 불규칙한 변환은 어떨까요? 어떻게 '잘'GPU 쓰레드를 배포 할 수 있습니까? '좋은'커널을 디자인하는 방법? 일반적인 방법론이 있습니까?

답변

2

하드웨어가 Vega도 Volta도 아닌 경우 (둘 다 거의 항목별로 명령 실행이 거의 독립적 일 수 있음) 의심스러운 작업을 다시 그룹화하는 것이 가장 좋습니다. 예를 들어, 동일한 그룹에있는 모든 항목이 이웃 작업 항목의 양을 더 많거나 적게 가질 수 있고 1 차원 (스캔 라인) 작업보다 균형이 맞으므로 2D 타일 된 생성을 사용하면 맨델 브로 그림 생성기 (항목 당 작업량이 다름) 세대 (그룹마다 다른 결과). Eirther 마지막 ​​반복에 따라 요소를 재정렬하거나 공간 그룹을 사용해야합니다.

최악의 경우 계산 단위 당 최대 사이클 (각 코어가 8,64,128,192 개)에 따라 결과 성능이 결정되며 더 많은 계산 단위로 더 빠릅니다. 그러나 다른 모든 작업 항목은 여전히 ​​최대주기에 숨어 ​​있으며 CPU보다 효율적입니다.

관련 문제