2013-10-24 5 views
4

는 최근 연산 쉐이더와 함께 놀았 던 나는 내 [numthreads (X, Y, Z)] 파견 통화 설정에 가장 최적의 방법을 결정하기 위해 노력하고있어. 내 데모 창은 800x600이고 픽셀 당 1 개의 스레드를 시작합니다. 2D 텍스처 수정을 수행 중입니다. 너무 무거워서는 안됩니다.다이렉트 최적의 numthreads 설치

Dispatch(ceil(screenWidth/numThreads.x),ceil(screenHeight/numThreads.y),1) 

그래서 첫 번째 인스턴스에 대한 그

Dispatch(25,19,1) 

이 25에서 실행 될

내 첫 번째 시도는

[numthreads(32,32,1)] 

내 파견()를 호출 항상 지정하는 것이 었습니다 -26 fps. 그런 다음 16fps로 실행되는 [numthreads (4,4,1)]로 축소되었습니다. [numthreads (16,16,1)]로 증가 시키면 약 30fps의 좋은 결과가 나타납니다. Y 스레드 그룹 번호 [numthreads (16,8,1)]로 돌리면 32fps로 푸시됩니다.

내 질문은 그래서 가장 효율적으로 GPU를 활용할 수있는 스레드 수를 결정하는 최적의 방법이 없거나 단지 좋은 똑똑한 '시행 착오인가?

답변

3

꽤 GPU 별입니다하지만 당신은 NVIDIA 하드웨어에 있다면 당신은 CUDA Occupancy Calculator를 사용하여 시도 할 수 있습니다.

은 당신이 다이렉트를 사용하고 알고 있지만, 그들은 같은 기본 하드웨어에 매핑됩니다. FXC의 출력을 보면 어셈블리의 스레드 당 공유 메모리 크기와 레지스터를 볼 수 있습니다. 또한 가지고있는 카드의 컴퓨팅 기능을 추론 할 수 있습니다. 계산 기능은 cs_4_0, cs_4_1, cs_5_0 등과 같은 프로파일의 CUDA와 동일합니다.

목표는 "점유율"또는 다른 말로 점유 비율 = 100 % - 대기 중 HW- 오버 헤드

+0

FXC 어셈블리 출력을 얻으려면 어떤 컴파일 옵션을 설정해야합니까? 나는/Fc를 시도했지만, 출력 된 파일에는 아무것도 나와있는 정보가 없습니다. 참조 용으로 http://msdn.microsoft.com/en-us/library/windows/desktop/bb509709(v=vs.85).aspx를 사용하고 있습니다. – Valentin

+1

그냥 프로필 (/ T)로 컴파일하면 어셈블리 코드를 볼 수 있습니다. dcl_temps는 레지스터 수를 알려주고 dcl_tgsm_ * 문은 공유 메모리 크기를 알려줍니다. – Lucas

2

프로파일은 특정 하드웨어에 최대 성능을 보장 할 수있는 유일한 방법입니다. 하지만 실제 레지스터 수가 16 개 이하이고 공유 메모리를 1 톤 이상 사용하지 않는 한 일반적으로 256 개 스레드의 스레드 그룹은 대부분의 계산 하드웨어를 포화시킬 수 있어야합니다 (' 적어도 8 명 정도의 단체 파견).