본문 바로가기
Programming/병렬프로그래밍

CUDA와 OpenCL. 그리고 GP GPU.

by 곰네Zip 2023. 9. 27.

AI가 대세가 되면서 학습을 위한 과정에서 CUDA를 이용한 고속화가 큰 혜택을 보았다고 생각한다. 15년전 내가 GP GPU를 연구할때만 해도 이정도까지 대세가 될거라 생각은 솔직히 못했다. 특정 분야에서 주로 사용될 것으로 예상했었지;;

(AI라는 특정분야이긴 하니까 맞긴 한건가? AI가 완전 대세일뿐 ㅎ)

 

GP GPU는 기본적으로 연산을 담당하던 CPU의 부담을 덜어주고자 시작했다. CUDA가 처음 나올 시기에도 GPU는 훌륭한 co-processor로서의 역할을 충분히 감당할 수 있었다. 실수(float, double)연산에 있어서는 특화되어있었다. 그리고 그때에도 GPU코어는 100개 이상씩 달고 나왔다. (엔비디아 기준)

 실수 연산만 가능하다고 하지만 물량빨로 충분히 고성능 컴퓨팅을 할 수 있게 만들어준 CUDA.

 물론 대응하는 녀석으로 OpenCL이 있었다. OpenCL은 CUDA의 유일한 단점(?)이었던 엔비디아 그래픽 카드에서만 동작 가능하다는 점을 해결하여, 그래픽카드에 크게 상관없이 GP GPU를 지원한다!는 장점을 가졌었다.

 근데, 그 범용성이 오히려 단점으로도 작용한 것 같다는 생각을 한다. 아무래도 자기네 그래픽카드에 특화되어 성능을 뽑아내는 CUDA가 효율면에서는 더 우위를 점했다.(당연하지...)

 그래서인지 OpenCL보다는 CUDA를 더 많이 사용하는 듯한 느낌을 받긴 한다.

 그때가 15년 전이니.. 지금은 GPU들도 더 무서운 굇수가 되었을 것이고, 취업하느라 활용하지 못했던 GP GPU를 지금 다시 해보면 깜짝 놀랄지도 모르겠다. (지금이야 CUDA가 일반적이지만.. 15년 전만해도 병렬 컴퓨팅이나 GP GPU는 이게뭐에요? 이거 어디다 써먹어요? 라는 수준이었습니다....)

  

 AI 학습이나 이미지 프로세싱 시에, GP GPU를 활용하면 좀 더 높은 성능을 기대할 수 있다. 그러니까 많이들 사용하는 것이고, 근데.. 내가 논문쓸때 경험으로 좀 더 효율적으로 사용할 수 있는 방법이 있을것 같다. 이 카테고리의 이전 포스팅에서 살짝 언급했지만.... 여기서는 CUDA기준으로만 서술하려고 한다. (논문 쓸때에도 CUDA위주로 했었기도 하고..)

 CUDA를 사용할 때, 블록과 그리드의 크기를 잘 조절하는 것이다.

 처리해야할 데이터가 있을 때, 그것을 분할해서 Graphic Device에 던져주고, 그것을 어느정도 크기의 단위로 쪼개서 GPU들이 일을 하도록 할지 지정해주면 성능차이가 제법 난다.

 우선 GPU들이 얼마나 참여하게 될지에 따라 성능은 차이가 난다. 단순히 생각해도, GPU가 500개가 있는데,

  - 스레드를 100개만 돌린다? 400개는 논다. -> 당연히 효율이 안나온다.

  - 남는거보다는 넉넉히 2000개로 지정한다. -> 500개씩 끊어서 수행하게 될 것이고 (당연히), 스레드들간의 context switching이 일어날 것이고, 알다시피 저 과정은 꽤 비싼 작업이다. 

   -> 가급적 GPU 수에 맞게 돌려주는 것이 제일 좋을 것이다.

 

 그리고 두번째로, Graphic Device에 한번에 얼만큼씩 데이터를 전달해 줄 것인가? 도 중요하다. 당시에는 PCI Expressx8이었나? 그랬다. 근데 PCI Express가 아무리 빨라도, GPU메모리에서 GPU로 전달되는 것 보다 빠르진 않을 것이다. (당연히 물리적 거리가...). CPU <-> RAM도 속도때문에 CPU에 캐시를 만들었다. 그래서 RAM -> Cache -> Processor로 데이터가 넘어간다. GPU에도 비슷한 일이 있다. GPU에 바로 밀어넣기 전에, 그래픽카드의 메모리로 먼저 데이터를 보낸다. 

 여기에 충분한 데이터를 밀어넣어주지 않는다면 연산해야 할 데이터들이 PCI Express등을 통해 disk -> GPU Memory로 더 자주 보내줘야한다 -> 데이터 보내는 시간이 들어가 효율이 좀...

  그렇다고 이번에도 또 한번에 많이 보내버리면? GPU Memory를 어딘가에 페이징 하는 일이 일어난다. 당연히 이 과정은 많은 시간을 요구할 것..

 

 위 두가지만 잘 고민해서 CUDA의 연산 환경을 잘 지정해주면 꽤 효율이 좋다.

 내가 연구할때만 해도 CPU  vs GP-GPU의 속도 경쟁으로 테스트를 해보았는데.

 20%향상 ~ 60배향상까지 다양하더라. (물론 중간에 500배라는 말도안되는 수치가 나오긴했으나 1회성이었어서 제외.ㅋ) 물론 연구실에서 러프하게 조절한거라 그보다 더 뽑아낼 수도 있을 것이다.

 

 모든 GP GPU개발자들 힘내요.

반응형

댓글