2012-12-03 1 views
2

CUDA_EXCEPTION_5, Warp Out-of-Range Address 오류가 발생하며이를 일으킬 수있는 다양한 시나리오를 파악하려고합니다.CUDA_EXCEPTION_5, Warp Out-Of-Range Address 오류의 원인이 레지스터 오버플로입니까?

저는 (다른 누군가가 작성한) C 프로젝트를 CUDA로 포팅하려고합니다. C 코드는 스택에 많은 배열을 인스턴스화하는 매우 레지스터가 많이 걸린다. 레지스터 오버플로가 발생할 가능성이 매우 높고 warp out-of-range 오류를 유발할 수 있다고 가정합니다.

먼저 코드를 실행하고 코드를 최적화하기 시작합니다.

위키 백과에 따르면 "스레드 당 로컬 메모리"가있는 Compute Capable 3.0 하드웨어를 사용하고 있습니다. 다른 곳에서는 SM 당 512KB의 레지스터 공간이 있습니다. 실행중인 스레드 당 512KB의 레지스터 공간을 가질 수 있습니까? 다음과 같이 나는 현재 내 커널 실행하고있어

는 (예 나는 울트라 느린 알고) :

dim3 grid(28800,1); 
cuPlotLRMap<<<grid,1>>>(...) 

일부 세부 사항을 (나는이 얼마나 도움이 모르는) :

내 하드웨어에는 7 개의 SM이 있습니다. 112 개의 실행 블록이 있으므로 각 블록이 512k의 가치가있는 레지스터 공간의 1/16을 차지합니까?

스레드가 전역 메모리로 넘칠 수있는 레지스터 공간을 초과하는지도 이해합니다. 이것이 발생할 때 동시 스레드가 동일한 전역 메모리 공간으로 오버 플로우 할 수 있습니까?

+0

CUDA에는 "레지스터 오버플로"와 같은 것이 없습니다. GPU는 정적 인 컴파일 타임 할당 된 레지스터 할당을 사용합니다. "오버플로"또는 범위를 벗어난 레지스터 액세스는 결코있을 수 없습니다. – talonmies

+0

@talonmies ok 커널에서 거대한 배열을 선언하면 (예 :'int n = 44800; float * s = new float [n];') 매우 느릴 수는 있지만 위의 커널 예외의 원인이되어서는 안됩니다 ? 스택은 무한대입니까? 빨간 청어를 쫓고 있습니까? new 키워드를 사용하여 변수를 작성하면 변수가 전역 메모리에 저장되거나 로컬 메모리에 남아 있습니까? – Sean

+0

@talonmies 조금 뒤로 물러나서 다른 스레드에서 디버거에 대해 질문 할 것입니다. 내가 찾는 것을 오해하고있을 수도 있습니다. – Sean

답변

2

512KB "스레드 당 로컬 메모리". 다른 곳에서는 SM 당 레지스터 공간이 512KB이고 입니다. 실행중인 스레드 당 512KB의 레지스터 공간을 가질 수 있습니까?

CUDA C 프로그래밍 안내서의 Compute Capabilities 표를 참조하십시오. Computable capabilities 2.x 및 그 이상의 장치는 스레드 당 최대 512KB의 로컬 메모리를 지원합니다. cudaDeviceSetLimit (cudaLimitStackSize, bytesPerThread) 함수를 사용하여 값을 설정할 수 있습니다. 기본값은 스레드 당 2KB라고 생각합니다.

내 하드웨어에는 SM이 7 개 있습니다. 112 개의 실행 블록이 있으므로 각 블록이 512k의 가치가있는 레지스터 공간의 1/16을 차지합니까?

Compute Capability 3.x 장치는 다중 프로세서 당 최대 16 개의 블록을 상주시킬 수 있습니다. 이것은 레지스터/스레드, 스레드/블록 또는 공유 메모리/블록이 커널을 장치 최대 값보다 작게 제한하지 않는다고 가정합니다. Visual Profiler와 Nsight VSE CUDA Profiler는 커널에서 사용하는 구성입니다.

현재 스레드/블록을 1 개만 실행 중입니다. 블록 당 WARP_SIZE의 배수를 시작해야합니다 (32).

또한 스레드가 전역 메모리로 넘칠 수있는 레지스터 공간을 초과하는 경우 이해합니다. 이것이 발생할 때 동시 스레드가 동일한 전역 메모리 공간으로 오버 플로우 할 수 있습니까?

컴파일 또는 JIT 시간에 컴파일러는 레지스터 할당을 수행합니다. 스레드 당 레지스터가 부족하면 컴파일러가 로컬 메모리로 유출됩니다.이 조작은 결정적이며 런타임에 결정되지 않습니다.

연산 능력 3.0 장치는 63 레지스터/스레드로 제한됩니다. 연산 능력 3.5 개의 장치는 스레드 당 255 개의 레지스터로 제한됩니다.

+0

설명해 주셔서 감사합니다. 컴파일러가 배열을 로컬 메모리에 저장하기로 결정한 경우 배열의 각 요소가 레지스터 중 하나를 차지합니까 아니면 전체 배열이 63 개의 레지스터 하나를 사용합니까? – Sean

+0

@Sean : 로컬 메모리가 레지스터 파일에 없습니다. 전역 메모리의 스레드 할당에 따라 보호되는 방식으로 저장됩니다. – talonmies

관련 문제