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을 차지합니까?
스레드가 전역 메모리로 넘칠 수있는 레지스터 공간을 초과하는지도 이해합니다. 이것이 발생할 때 동시 스레드가 동일한 전역 메모리 공간으로 오버 플로우 할 수 있습니까?
CUDA에는 "레지스터 오버플로"와 같은 것이 없습니다. GPU는 정적 인 컴파일 타임 할당 된 레지스터 할당을 사용합니다. "오버플로"또는 범위를 벗어난 레지스터 액세스는 결코있을 수 없습니다. – talonmies
@talonmies ok 커널에서 거대한 배열을 선언하면 (예 :'int n = 44800; float * s = new float [n];') 매우 느릴 수는 있지만 위의 커널 예외의 원인이되어서는 안됩니다 ? 스택은 무한대입니까? 빨간 청어를 쫓고 있습니까? new 키워드를 사용하여 변수를 작성하면 변수가 전역 메모리에 저장되거나 로컬 메모리에 남아 있습니까? – Sean
@talonmies 조금 뒤로 물러나서 다른 스레드에서 디버거에 대해 질문 할 것입니다. 내가 찾는 것을 오해하고있을 수도 있습니다. – Sean