cuda 6 좋은것 같네요.

sideattacker의 이미지

IT관련 개발자는 아니고, 대학원에서 자그마한 시뮬레이션 돌리는 학생입니다.
전공이 컴공이 아니라 재료공이다보니 cpu를 이용한 병렬화나 최적화쪽에는 젬병이라 cuda를 배워보고 있는데요, 이번에 cuda 6가 나오면서 통합메모리(unified memory)가 추가되었는데 이거 아주 편리하네요.
예전에는 cudaMalloc으로 gpu에 따로 메모리 할당해주고, cpu쪽에도 Malloc으로 잡아준 메모리랑 memcpy로 왔다갔다 하고 아주 정신이 없었는데, 이젠 그냥 포인터 하나로 관리가 되니까 편하군요.
가장 좋은 점은 기존의 cpu용 함수를 거의 그대로 재사용이 가능하고, 메인에서 호출할때도 동일한 메모리 포인터를 쓸 수 있다는 점이네요.
gpu 함수로 바꾸면서 한 일은 for문을 threadIdx로 병렬화 시켜준 것 뿐이라(심지어 메모리 포인터 이름도 동일하게 사용) 예전에 메모리 포인터 주고받고 아주 헷갈리던게 아주 편해졌어요.
동일한 작업인데 cpu에서 27초 걸리던 일을 gpu에서 하니까 1.75초 걸리는군요. 매 단계마다 자료 저장을 위해서 host쪽에서 메모리를 불러와서 txt파일로 쓰는 부분이 있는데, 이 부분을 빼고 돌린다면 실제 계산에 소요되는 시간은 10배 이상 짧아지는것 같네요.
프로그래밍 고수분들이 보시면 뭐 저정도 일 가지고 호들갑인가 싶으시겠지만 연구실에 cuda는 커녕 C도 돌리는 사람이 없이 혼자 하는지라 이정도 일로도 혼자 감동하게 되네요 ㅠㅠ

+하나 아쉬운점은 엊그제 Ubuntu 14.04가 정식으로 나왔는데 cuda는 아직 14.04용 설치 패키지가 없는것 같더군요.
14.04 나오자 마자 반가운 마음에 깔았는데 cuda가 안깔려서 다시 12.04로 돌아와서 작업중입니다...

goraion의 이미지

저의 경우 점탄성에 대한 시뮬레이션을 하는 편입니다만, 여태까지는 단순히 openmp로 계산시켰다가 현재 인텔 컴파일러와 MKL을 활용하려고 MKL용 인터페이스용 라이브러리를 만들고 있습니다. GPU계산은 경험이 없어서 그런데, 기존의 CPU계산에 비해 어느정도 향상이 되는지 혹시 알 수 있을까요? 차이가 많이 난다면, 이왕 인터페이스용 라이브러리 만드는 김에 GPU 계산에 기본적인 부분도 공부할까 싶어서 궁금합니다.

sideattacker의 이미지

일단 제 작업 환경은 Ubuntu12.04LTS 상에서 Nsight eclipse로 코딩하고 있습니다.
사양은 Xeon x5650@2.67G, GPU는 GTX Titan이고요.
단순히 제 사례를 말씀드리면 CPU 싱글 스레드 환경에서 27초 정도 걸리던 계산이 GPU 사용시 1.75초로 단축되었습니다.
매 cycle마다 계산 결과를 txt로 기록해야 하기 때문에 이 부분을 빼고 생각한다면 실질적인 simulation 계산 시간은 위 보다 더 줄어들었다고 볼 수 있겠네요.
cuda 기술을 사용하여 시뮬레이션 가속시키는 내용은 논문으로도 많이 나오고 있는 것으로 알고 있고요, 병렬화가 효율적으로 가능한 경우에는 5~6배에서 10배 이상 가속되는 경우도 논문으로 많이 보고되고 있습니다.
http://www.nvidia.com/object/tesla-matlab-accelerations.html
cuda를 만든 Nvidia쪽 자료라서 아무래도 결과가 좋은 경우에 해당하기는 하지만, N-body simulation의 경우에 입자 수가 많아질수록 20배 가까운 성능 향상을 봤다고 합니다.

goraion의 이미지

GPU가속이 의외의 성능을 보여주는 군요. 저도 한번 OpenCL쪽을 보아야 할 듯 하네요. 다음 작업환경이 맥 프로가 될것같아서, ATI쪽 그래픽 카드를 활용해야 할 테니.

klara의 이미지

참고로 GPU라는 특성상, 대량의 부동소수점 연산에는 매우 강하지만 CPU와 달리 조건 분기가 존재할 경우 극단적으로 느려질 수'도' 있습니다.
병렬화 가능하더라도 run-time에 결정되는 조건 분기(비 상수 조건에 의존한 if 문, while 문 또는 비 상수 횟수의 for문 루프 등)가 존재한다면 기대한 만큼의 결과가 안나올 수도 있습니다.

goraion의 이미지

조건문에 따른 CPU와 GPU연산의 차이가 얼마나 나는지는 잘 감이 안오나, 한 번 실험을 해 봐야 할 것 같습니다. 일단 GPU연산을 하기 위해 어떤 처리를 해야 하는지를 몰라서 문헌을 좀 찾아봐야겠네요. 감사합니다.