Thursday, June 26, 2008

VS2005에서 CUDA 컴파일러 옵션 설정

CUDA에서는 적절한 thread의 갯수를 알아내기 위해 CUDA occupancy calculator라는 excel 파일을 제공한다. 이 파일은 작성한 kernel function이 해당 GPU에서 몇 thread가 동시에 구동되는가를 계산해주는 역할을 한다.

계산을 위해 kernel 함수의 정보를 알려주어야 하는데, 필요한 정보는 사용된 GPU, 블럭당 thread, thread당 레지스터의 갯수, 블럭당 필요한 공유메모리의 크기의 4가지이다. GPU는 고정되어 있을것이므로, 사용된 레지스터수와 공유메모리 크기를 넣으면 최대 몇 thread를 구동할 수 있는지에 대한 정보가 그래프로 표시된다. 또한 MP당 가용 쓰레드나 점유율등도 표시되는 좋은 도구이기도 하다. CUDA의 경우 thread가 한계 이상인 경우에는 전체적으로 구동하지 않고 아무 말없이 넘어가버리므로 thread 갯수를 찾는 것은 매우 중요하다.

결국 사용한 레지스터의 수와 공유메모리 크기를 알아야 하는데, 이는 컴파일러가 어떻게 바이너리 코드를 생성했는가에 달려있다. 이를 위해 CUDA의 컴파일러인 nvcc에서는 --ptxas-options=-v 라는 옵션을 주면 아래의 예와 같이 이들 정보를 준다.

1>ptxas info : Compiling entry function '_Z12copyResidualPfS_iii'
1>ptxas info : 0 bytes lmem, 36 bytes smem, 1242688 bytes cmem, 4 registers
1>ptxas info : Compiling entry function '_Z14threshold_CUDAPfS_iif'
1>ptxas info : 0 bytes lmem, 36 bytes smem, 1242688 bytes cmem, 5 registers
1>ptxas info : Compiling entry function '_Z24eval_cost_and_count_CUDAPfPiiif'
1>ptxas info : 0 bytes lmem, 36 bytes smem, 1242688 bytes cmem, 17 registers
1>ptxas info : Compiling entry function '_Z14eval_cost_CUDAPfii'
1>ptxas info : 0 bytes lmem, 28 bytes smem, 1242688 bytes cmem, 15 registers

이 예에서는 4개의 kernel 함수가 있으며 각각의 함수에서 사용한 지역, 공유, 상수 메모리와 레지스터의 수가 표시된다. (이 예에서는 한 cu파일에 모두 있으므로 상수메모리사용량이 동일)

Visual Studio 2005에서는 이를 얻는 설정을 custom build setting에서 해주어야 한다. --ptxas-options=-v 옵션을 custom build option에 있는 Command Line 항목 맨 뒤에 붙여주자.

(custom build setting은 Solution explorer에서 해당 project이름에 우클릭하면 나타난다.)

No comments: