2012-10-28 1 views
3

크기 2^18의 두 열 벡터에 대해 SAXPY를 수행하는 간단한 CUDA 커널을 작성했습니다.왜 맥스보다 작은 쓰레드를 사용하면 커널이 더 빨리 돌아갈 수 있습니까?

내 GPU 인 테슬라 C2070은 블록 당 최대 1024 개의 스레드를 실행할 수 있다는 것을 알게되었습니다. 그러므로 나는 블록 크기를 X = 1024, Y = 1, Z = 1로 만들었습니다. 또한 X = 2^18/1024, Y = 1, Z = 1로 그리드 크기를 만들었습니다. 블록 당 모든 단일 스레드를 사용하고있었습니다.

그러나, 나는 일관 = 1024

이유는 무엇입니까 X의 블록 크기의 커널을 실행하는 것보다 빠른 시간에 귀착 = 512 X의 블록 크기와 커널과 X = (128)을 실행하는 것을 발견? 블록 크기가 1024 미만인 경우 스레드를 낭비하지 않습니까?

답변

3

레벨 1 SAXPY와 같은 BLAS 기능은 메모리 대역폭이 제한되어 있습니다. 작업

은 단일 FMAD 만 수행하지만 전역 메모리는 두 개의로드와 저장소가 필요합니다. C2070은 약 37.5Gfloat/s의 전체 메모리 대역폭과 500GFMAD/s의 단 정밀도 산술 처리량을 제공합니다. 따라서 성능은 ALU가 아닌 메모리 컨트롤러에 의해 결정됩니다. 종종 메모리 대역폭 제한된 커널에서 블록 당 스레드 수를 줄이면 메모리 컨트롤러 및 캐시 리소스에 대한 경합이 줄어들고 대역폭 사용률이 높아 지므로 성능이 향상됩니다.

이것은 아마도 SAXPY 커널에서 일어난 일일 것입니다. 벤치마킹을 통해 최적의 블록 크기를 찾을 수 있어야하지만 제 경험상 C2070과 같은 Fermi 장치의 블록 당 128-384 스레드에 저장됩니다.

1

읽기/쓰기/데이터 공유를 캐싱하기 위해 공유 메모리를 사용하는 코드의 경우, 블록 크기가 작을수록 스레드 당 더 큰 공유 메모리 블록을 사용하게되어 메모리 액세스 패턴이 좋을 가능성이 커집니다.

내 경험에 비추어 볼 때, 더 많은 스레드를 실행할 수있는 경우에도 블록 당 128-192 스레드가 거의 항상 내 코드에서 최상의 성능을 발휘한다는 사실에 동의합니다.

관련 문제