2012-07-31 2 views
3

점유 계산기를 이해하는 데 문제가 있습니다. 512 스레드가 잘 작동하는 일부 개발 코드에서 문제가 발생하지만 1024 스레드는 엉뚱한 숫자를 제공합니다.점유 계산기를 이해하십시오

저는 Windows 7에서 Tesla C2050을 실행하고 Matlab (내 잘못이 아니라 Matlab을 사용해야 함) 및 Mexfunction에서 개발 중입니다.

저는 결과 계산에 영향을 미치는 다른 제한 사항을 찾기 위해 점유율 계산기를 가지고 놀았을 것이라고 생각했습니다.

블록 당 1024 개의 스레드를 입력하면 점유가 0 %가됩니다. 512 개의 스레드를 사용하는 경우 점유율은 33 %입니다. 나는 적어도 1024 개의 스레드를 가진 것을 얻을 것이라고 생각했을 것이다. 나는 코드와 점유율 계산기가 최대 704 개의 스레드 (이것은 실제를 나타내지 않는 숫자 임)에 대해 좋은 결과를 제공한다는 것을 알아 챘다.

나는이 영역에 대한 나의 이해 부족이 내가 코드에서보고있는 오류를 바로 잡을 수없는 이유라고 생각한다. 아무도 내가 왜이 결과를 얻고 있는지 설명 할 수 있습니까?

숫자는 :

  • 컴퓨팅 능력 2.0
  • 공유 메모리 크기 블록 당 49,152
  • 스레드 나사 (44) 당 512 개 1024
  • 레지스터
  • 블록 당
  • 공유 메모리 0

ptxas info : 중고 44 레지스터, 232 바이트 cmem [0], 144 바이트 cmem [2], 28 바이트 cmem [16]

답변

4

블록 당 보유한 총 레지스터 수는 32768입니다 (SDK의 deviceQuery를 통해 확인할 수 있습니다). 이제 커널에 따르면 44 개의 레지스터/스레드를 사용합니다. 블럭 당 1024 개의 쓰레드를 가진 커널을 실행하면 합계 44 * 1024 = 45056 레지스터가 한계를 초과하게됩니다. 블록 당 1024 스레드로 실행하려면 스레드 당 32 개 이하의 레지스터를 사용하도록 커널을 최적화해야합니다.

+4

점유율이 0.33이라도 나쁘지는 않지만 메모리 대기 시간을 처리하는 데 충분한 스레드가 있어야합니다. 점유 공간을 늘리려면 블록 크기를 128 스레드로 줄이는 것이 좋습니다. 이렇게하면 각 SM에서 동시에 640 스레드 (128 스레드 당 5 블록)를 실행할 수 있습니다. 기본 대기 시간이 다뤄지면 점유율과 성능 간에는 강한 상관 관계가 없습니다. – njuffa