인프런 커뮤니티 질문&답변

oosaprogrammer님의 프로필 이미지
oosaprogrammer

작성한 질문수

GPU 프로그래밍 언어 CUDA(쿠다) 기초

글로벌 함수 실행 및 메모리 해제

메모리 해제 관련 문의

작성

·

286

0

C 언어의 CPU 프로그래밍에서는 프로세스가 종료되기 직전의 메모리 해제는 안해도 상관이 없습니다. 이유는 프로세스가 OS 에 모든 자원을 어차피 회수당하게 되니까요.
 
그래서 예제로 주신 코드를 보며는 free() 함수는 없어도 될 것 같습니다. 그런데 GPU 의 메모리 해제 함수는 어떻게 되는지 궁금해졌습니다. CPU 의 프로그램은 가상 메모리를 부여받고 동작합니다. 프로그램이 종료될 때는 OS 가 그 가상 메모리를 모조리 없애버리죠. 프로그램이 반납 안한다고 뺐기지 않을 수가 없는 것입니다.
 
그럼, 프로그램이 동작할 때 GPU의 메모리는 그 가상메모리에는 포함되지 않는 것이 분명하고, 그럼 CPU 에서 프로세스가 종료될 때 가상메모리는 자의든 타의든 깔끔하게 없어지는데 GPU 의 메모리는 프로세스가 종료되어도 메모리 공간을 차지하고 남아있게 되는 것인가요? 그래서 꼭 프로그램이 종료되는 마당에도 메모리를 꼭 해제해주어야만 할까요?

답변 1

0

제가 방금 cudaFree 없이 코드 돌려봤는데 남아있지는 않네요. 그러나 운영체제나 드라이버가 없다고 생각하면 (예를 들어 임베디드 기기의 GPU NPU등 을 opencl로 한다거나 ) 해제 안하면 큰일나겠죠

C에서도 마찬가지로 운영체제가 free해줘서 안해줘도 상관 없는거지 운영체제 없이 임베디드 개발을 한다고 하면 free가 정말 중요하게 쓰일껍니다. 메모리를 극도로 아껴야 하는 경우에도 free하고 선언하고 여러번 반복하게 될꺼구요

우와 실험까지 해서 결과 알려주시고 ... 감사합니다!

그런데 제가 궁금한 점은 free 를 꼭 해야할까? 같은 단순한 물음이 아니었습니다. free는 꼭 하는게 맞겠죠. 근본적인 것은 GPU 시스템의 메모리 관리가 어떻게 CPU 시스템의 운영체제와 맞물리는가 하는 것입니다. 강의를 들어보면 둘 간에 통신을 한다고 하며 GPU 시스템도 하나의 완전한 시스템이라고 하였습니다. 그러면 CPU 에서 가상메모리 기준으로 동작하는 프로그램의 생애주기와 그 생애주기를 가지는 CPU 시스템의 프로그램이 호출하는 GPU 시스템 내의 어떤 존재... 그 존재가 무엇인지조차 모르겠어요. 그걸 프로그램이라고 불러야 할지... 서브루틴이라 불러야 할지... 그 존재라는 것은 CPU 상의 가상메모리 상에 코드가 올라가지는 않을 거잖아요. 힙메모리도 별도로 가지고 있을건데요, 그 존재는 어떤 생애주기를 가지며 어떻게 CPU 의 함수호출을 듣게 되느냐 하는 것이 물음입니다. 이것들을 알게 되면 free() 할 때 일어나는 일도 알게되겠지요...

이 대화가 있은 뒤에 저도 공부를 더 해보았습니다. nvidia dli 라는 유료온라인 강의가 도움이 됩니다. 무료 강의도 있습니다.

nvidia의 강의에서는 https://developer.nvidia.com/blog/unified-memory-in-cuda-6/ 를 가지고 설명을 하고 있습니다. 인프런의 본 강의에서는 다루지 않는 내용입니다.

UM 이란 것은 nvidia 가 제공하는 가상메모리 기술 같습니다. CPU 와 GPU 의 메모리를 통합하는 새로운 가상메모리입니다. 가상메모리라고 생각하면 프로세스가 종료될 때 혹시 free 하지 않은 메모리들은 모조리 반납될 것으로 유추 할 수 있을 것 같습니다. OS 의 가상메모리가 그렇듯이요... 물론 확인한 것은 아닙니다.

oosaprogrammer님의 프로필 이미지
oosaprogrammer

작성한 질문수

질문하기