CUDA Unified Memory 사용시 시스템이 멈춰버리는 현상.

서피스북(1 과 2 모두 해당)에서 CUDA를 돌릴때 디바이스가 완전 정지하는 현상이 있다.
Windows Vista이상이면 드라이버가 크래시하거나 hang되면 OS가 드라이버를 내렸다가 다시 올린다. 그래픽 드라이버라 해도 ring 1에서 돌아가므로 ring 0에서 돌아가는 커널까지는 손상시킬수 없다. 이론상으론 그렇다.
그런데 위 경우에는 그냥 커널까지 멈춰버린다. 이 상태에선 전원버튼을 10초이상 눌러서 완전히 껐다가 다시 켜는 수밖에 없다.
처음엔 서피스북에서만 발생하는 현상이라고 생각했으나 그렇지 않다. 이 현상은 데스크탑에서도 발생한다. 데스크탑의 경우 전원을 처음 켠 후 CUDA를 사용하도록 설정해서 내 게임 프로젝트를 실행하면 퍽 하고 화면이 꺼진다. 커널은 몇 초동안 더 살아있지만 몇 초가 지나면 이마저도 멈춰버린다. 리셋 버튼을 눌러서 리부팅해야한다. 재밌는건 이 상태에서 reset버튼을 눌러서 리부팅을 하면(아마도 GPU에 전원이 인가된 상태인지가 관건인것 같다) 이후로는 문제없이 실행된다.

드라이버에 따라 이 현상이 발생할수도 안할수도 있다. CUDA SDK 9.1에 포함된 드라이버에선 이 현상이 발생하지 않는다. 혹은 이 드라이버로부터 411.xx사이의 드라이버들에선 이 현상이 발생하지 않는다. 대신 이 드라이버들에선 성능이 10배쯤 느려진다.
내 코드에 이상이 있는지 열심히 뒤져봤지만 의심가는 곳은 한군데도 없다.
CUDA로 뭔가 가혹하게 많은 부하를 줘서 그런가 싶었지만 그것도 아니다. 어떤때는 CUDA초기화 하고 메모리 할당하는 시점에서 그대로 멈춰버린다.
이게 항상 발생하는건 아니다. 하지만 반복해서 실행하다 보면 열번에 한번은 나온다.
cudaMallocManaged()로 메모리를 할당하는 경우나 cudaStream을 사용한 경우에 발생하는것 같다. 또한 DirectX로 그래픽 렌더링을 하는 동시에 CUDA를 사용하고 있으므로 이것도 뭔가 트리거가 될것이다. 어차피 엔드유저를 위한 기능은 아니라서 문제를 피해갈수만 있으면 충분하다고 생각하고는 있다. 하지만 이제와서 unified memory에 맞춰서 작성한 코드를 수정할수도 없고 cudaStream을 사용한 코드를 다 들어낼수도 없다.
이거 어디 버그 리포트할 곳도 없고 미치겠네.
cuda프로그래밍하는 인간들이 많지도 않거니와 그 중에 서피스북을 사용하는 인간들이 몇이나 되겠으며 거기서 또 나와 같은 증상을 겪는 인간이 몇이나 될까.
아우 짜증나.

p.s :
하하…CUDA관련 디바이스 멈추는 증상 뭐가 문제인지 알았다.
nvidia샘플중에 UnifiedMemoryStreams이란 샘플이 있는데 이거 돌리면 내 프로젝트에서 나오는 증상 똑같이 재현됨.
이 샘플은 cudaMallocManaged()를 사용하는, 즉 unified memory system을 사용하는 예제이다.
cudaStream아니면 unified memory쪽 문제일거라고 생각했는데 역시나.
아이 띠발놈들아 드라이버 똑바로 만들란 말야.
멀쩡한 드라이버 나올때까지 기다리는것보다 내가 코드 고치는게 차라리 빠르겠다. 아우. 망할놈들.


CUDA Unified Memory 사용시 시스템이 멈춰버리는 현상.”에 대한 답글 1개

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중