inflearn logo
강의

講義

知識共有

GPUプログラミング言語CUDA(クーダ)基礎

グローバル関数の実行とメモリ解放

메모리 해제 관련 문의

396

oosaprogrammer

投稿した質問数 5

0

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

cuda

回答 1

0

harry261

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

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

0

oosaprogrammer

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

그런데 제가 궁금한 점은 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 의 가상메모리가 그렇듯이요... 물론 확인한 것은 아닙니다.

ch .12 grid 설정 관련 질문 드립니다.

0

73

2

memcpy 시간 고려 시 gpu vs. cpu

0

82

2

cudaFree가 자동으로 되는 상황

0

79

2

MSB3721 오류

0

242

2

식별자 threadIdx 정의 되지 않음 오류

0

225

2

cudaGetLastError() 에러 처리

0

133

1

CUDA Samples 없음

0

183

2

24-2 3중 for loop 개선책 이해가 가지 않습니다.

0

124

2

transpose-shared.cu 가 느린 이유에 대해서 질문 있습니다.

0

129

2

pitch값에 따른 alignement boundary(size) 질문

0

173

2

common.cpp의 procArg 함수에 대해 질문이 있습니다.

0

133

2

[30-4] hist-shared.cu 에서 질문있습니다.

0

145

2

[Matrix Addition Problem] 1D를 사용하지 않는 이유가 뭔가요?

0

215

1

Thread Block 개수에 제한이 있나요?

0

399

1

Warp를 동시에 돌린다는 말이 이해가 가지 않습니다.

0

312

1

ppt 자료는 없나요..

0

232

1

계산시간 비교

1

367

2

매크로 함수를 쓴 이유

0

301

1

hello-prrallel.cu 의 병렬처리에 관하여

0

352

1

kernelMatCpy에서는 __syncthreads가 필요없지 않나요

0

222

1

소스 코드 에러 문의 드립니다

0

341

1

deviceQuery.exe

0

252

0

OpenMP가 무엇인가요?

0

557

1

버전 질문입니다.

0

234

1