2012-09-11 1 views
0

저는 CUDA 응용 프로그램을 프로파일 링 중이며 비주얼 프로파일 러에있는 "제어 흐름 발산 (Control Flow Divergence)"메트릭에 대해 잘 모릅니다. 사용 설명서에 따르면CUDA - 비주얼 프로파일 러 및 제어 흐름 발산

:

제어 흐름의 차이는 따라서 차이를 일으키는 원인이되는 워프에서 모든 스레드에 의해 실행되지 않은 스레드 지침의 비율을 제공합니다.

다음
int var; 
var = tex2D(texture, x, y); // texture fetch 
if(var < 0) { 
    var *= -1; 
    results[(blockIdx.x*blockDim.x) + threadIdx.x] = var; // global memory array 
} 

이 발생 내용은 다음과 같습니다 :

내 CUDA 커널에 다음 코드를 가지고 있지 단일 스레드 분기 (나는 글로벌 메모리의 값을 확인)에 진입하지만, 프로파일 러 제어 흐름의 발산은 34 %이다. 동일한 브랜치에서 printf를 삽입하면 stdout에서 아무 일도 일어나지 않았지만 값이 43 %로 점프됩니다 (이상하게도 실행 시간이 증가합니다). 이것은 메트릭이 모든 스레드의 실행을 고려하지 않고 모든 커널의 명령어를 고려한다는 것을 의미합니까? (워프 발산을 효과적으로 효과적으로 갖지 않음)

두 경우 모두 발산 분기 메트릭은 0 %입니다.

답변

1

어떤 버전을 사용하고 있습니까? 이전 버전을 사용하고있는 것처럼 들리므로 최신 버전 (예 : 4.2 또는 5.0 - 최신 버전은 현재 출시 후보)으로 업데이트해야 할 수도 있습니다.

비주얼 프로파일 러를 CUDA 5.0으로 업데이트 할 수 있다면 특정 커널을 분석하여 커널에서 디버거가있는 특정 라인을 강조 표시 할 수 있습니다 (비 합체 메모리 액세스). 디버그 (-G) 또는 릴리스 코드를 프로파일 링하려면 라인 정보 (-lineinfo)를 사용하여 코드를 컴파일해야합니다.

+0

4.0을 사용하고 있습니다. 5.0으로 업데이트하려고 노력할 것입니다. –