2014-11-27 3 views
0

저는 기본적인 CUDA Fortran 코드를 작성했습니다. 내 프로그램이 쓰레드 블록 (점유도 계산 용) 당 사용하는 공유 메모리의 양을 결정할 수 있기를 원합니다. 이 정보를 찾기 위해 -Mcuda = ptxinfo를 사용하여 컴파일했습니다. 편집 출력 끝나는CUDA Fortran에서 공유 메모리 사용량 확인

ptxas 정보 : device_procedures_main_kernel_ 432 바이트 기능 속성 프레임 1,128 바이트 유출 점, 604 바이트 유출로드 스택 ptxas 정보 : 중고 63 개 레지스터 96 바이트 smem 320 바이트 cmem [0]

출력에 smem이 언급 된 유일한 장소입니다. 전역 속성 서브 루틴 main_kernel에는 공유 속성이있는 배열이 하나 있습니다. I 공유 특성을 제거하는 경우 그때

ptxas 정보를 얻을 : device_procedures_main_kernel_ 432 바이트 함수 특성 프레임 1124 바이트 유출 점, 532 바이트 유출로드 스택 ptxas 정보 : 중고 63 개 레지스터 320 바이트 cmem [0]

스템이 사라졌습니다. main_kernel의 공유 메모리 만 계산되고있는 것 같습니다 : 내 코드의 장치 서브 루틴은 공유 속성을 사용하는 변수를 사용하지만 출력에 언급되지 않은 것 같습니다. 예를 들어 장치 서브 루틴 evalfuncs에는 공유 변수 선언이 포함되어 있지만 관련 출력은

입니다.

ptxas 정보 : device_procedures_evalfuncs_ 504 바이트의 스택 프레임에 대한 기능 속성, 1140 개 바이트 유출 상점, 508 바이트 유출로드

글로벌 서브 루틴에서 선언 할 필요가 공유 속성을 가진 모든 변수를합니까?

답변

1

공유 속성이있는 모든 변수를 전역 서브 루틴에서 선언해야합니까?

당신은 예를 들어 코드, 당신의 컴파일 명령을 표시하지 않으며, 당신은 당신이 사용하고있는 PGI 컴파일러 도구의 버전을 확인했다

번호. 그러나 PGI 14.x에서 기본 CUDA 컴파일 옵션은 재배치 가능한 장치 코드를 생성하는 것입니다. 이 내용은 the current PGI release notes의 2.2.3 절에 설명되어 있습니다.

2.2.3. 재배치 가능 장치 코드 재배치 가능 장치 코드를 생성하도록 지정하는 -ta = tesla 및 -Mcuda 플래그에 대해 rdc 옵션을 사용할 수 있습니다. Linux의 PGI 14.1과 Windows의 PGI 14.2부터는테슬라 타겟 OpenACC 및 CUDA Fortran의 코드 생성 및 연결 모드는 rdc, 변동 가능 장치 코드입니다. -ta = tesla : nordc, -Mcuda = nordc 중 하나를 지정하거나 임의의 1.x 컴퓨팅 기능 또는 모든 Radeon 대상을 지정하여 기본값을 비활성화하고 이전 동작 및 비 변동 가능 코드를 활성화 할 수 있습니다 .

그래서 (해제)에 특정 옵션이 있습니다 가능 :

–Mcuda=(no)rdc 

(이 옵션을 지정하지 않는 경우, -Mcuda=rdc 기본이다)

CUDA 포트란에는 포트란을 분리 장치 코드의 호스트 코드. 장치 코드의 경우 CUDA Fortran 컴파일러는 CUDA Fortran -> CUDA C 변환을 수행하고 자동 생성 CUDA C 코드를 CUDA C 컴파일러로 전달합니다. 따라서 rdcptxinfo과 같은 스위치의 동작 및 예상은 기본 CUDA 컴파일러 옵션 (각각 -rdc=true-Xptxas -v)의 동작에서 파생됩니다. CUDA 장치 코드는 rdc 옵션없이 컴파일되면

컴파일러는 일반적으로 메인 커널 코드에 인라인 장치 (하위) 커널에서 호출되는 루틴을 시도합니다. 따라서 컴파일러가 ptxinfo을 생성 할 때 커널 코드를 컴파일 (ptx 어셈블리) 할 때 모든 리소스 요구 사항 (예 : 공유 메모리, 레지스터 등)을 결정할 수 있습니다.

그러나 rdc 옵션이 지정되면 컴파일러에서 다른 스위치 및 함수 속성에 따라 장치 진입 점을 자체 진입 점이있는 별도의 호출 가능 루틴 (즉, 인라인되지 않음)으로 둘 수 있습니다. 이 시나리오에서 장치 컴파일러가 커널 코드를 컴파일 할 때 장치 서브 루틴 호출은 호출 명령어처럼 보이고 컴파일러는 그 시점에서 장치 서브 루틴의 리소스 사용 요구 사항에 대한 가시성을 갖지 않습니다. 이것은 컴파일 시퀀스에 근본적인 결함이 있음을 의미하지 않습니다. 이는 단순히 ptxinfo 메커니즘이 커널의 자원 요구 사항을 정확하게 롤업 할 수 없으며 그 시점에서 서브 루틴이라고하는 모든 것을 요구한다는 것을 의미합니다.

ptxinfo 출력도 해당 서브 루틴을 컴파일 할 때 장치 서브 루틴이 rdc 모드에서 사용하는 공유 메모리의 총량을 선언하지 않습니다.

당신은 RDC 모드를 해제 할 경우

–Mcuda=nordc 

난 당신이 커널 플러스의라는 서브 루틴 모두가 사용하는 공유 메모리의 정확한 통계를 볼 것으로 예상, 주어진 몇 가지주의를 하나의 컴파일러가 호출 된 서브 루틴을 성공적으로 인라인 할 수 있다는 것입니다 (꽤 가능합니다. 계정이 작동하지 않아도 계속 작동해야합니다). 다른 파일은 커널과 함께 호출되는 모든 파일과 서브 루틴을 동일한 파일에서 작업하는 것입니다 (즉 번역 단위). 서로 다른 번역 단위에서 호출하는 장치 서브 루틴을 가진 커널을 사용하는 경우 rdc 옵션 만 사용할 수있는 유일한 방법입니다.

공유 메모리는 런타임에 관계없이 (사용 가능한 공유 메모리의 총량을 위반하지 않았다는 가정하에) 코드에 적절하게 할당됩니다. nvvp or nvprof과 같은 프로파일 러를 사용하여 코드를 프로파일 링하여 커널이 사용하는 공유 메모리를 정확하게 읽을 수 있습니다.

이 설명에 표시되는 내용이 설명되어 있지 않은 경우 사용중인 정확한 컴파일 명령과 사용중인 PGI 도구의 버전을 비롯하여 전체 예제 코드를 제공하는 것이 좋습니다. (나는 미래의 질문에 대해서도 좋은 제안이라고 생각한다.)