블로그 이미지
필요한 정보를 가져가거나 원하실 때는 반드시 흔적을 남겨주세요. SHHyun

카테고리

분류 전체보기 (198)
Private (101)
Intelligence System (32)
Programming (7)
Robot Control (14)
Electronics (2)
Games (20)
Books (3)
Pictures (14)
Food (2)
Scrapped (2)
Total1,862
Today0
Yesterday9

'CUDA'에 해당되는 글 4건

  1. 2010/02/07 nVidia Nexus Beta 되었다고 왔네요
  2. 2010/01/05 GA using CUDA 수정중에...
  3. 2009/12/11 CUDA 의 스레드 개수 제한
  4. 2009/12/04 CUDA Programming
크리에이티브 커먼즈 라이선스
Creative Commons License
CUDA 를 사용한 병렬 프로그래밍을 하면 제일 더러운 것이 디버깅 입니다.
사실 CUDA 뿐 아니라 모든 병렬 프로그래밍이 제일 변태같은게 디버깅이죠 -_-;;

어쨌든 nVidia 에서 Visual Studio 2008 에 내장되는 형태로 Nexus 라는 디버거를 내놓았습니다.

http://www.nvidia.com/object/cuda_get.html 에 보시면 하단부분에
NVIDIA’s “Nexus” (code name) for Visual Studio now in Beta: Sign up today!
라는 부분에 Sign up 을 하면, 약간의 심사(?)를 거친 후에 이메일로 결과가 옵니다.

저는 한 2주정도 걸린것 같은데요

1. Two (2) computers running Windows Vista or Windows 7 on the same network, one to host Visual Studio, and a target for running your application.

2. One (1) G92 or GT200 based GeForce, Quadro or Tesla GPU in the target machine.


현재는 G92 나 GT200 아키텍쳐를 사용한 nVidia 칩셋을 지원 하는군요.
흑... 저는 G98M 아키텍쳐라 다른 PC 로 해봐야 되네요

아래의 동영상은 Nexus 를 사용해 디버깅을 하는 모습입니다.

Video #1: Parallel Nsight debugging CUDA C in Visual Studio 2008
Debugging CUDA C, Memory and Variable Inspection, Thread Focus


저작자 표시 비영리 동일 조건 변경 허락
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by SHHyun
크리에이티브 커먼즈 라이선스
Creative Commons License

어쩌면 대단히 중요한 일

처음 목표는 GA 의 연산과정중 Evaluation 만을 CUDA 로 수정하여 속도를 가속화시키는 것

그러나

이를 실제 코드로 구현하여 수행해 보았더니 생각보다 빠른 속도가 안나온다

그 이유인즉 CPU -> GPU 간 Memory Copy 연산 및 GPU 상의 Memory Allocation 때문인데, 다른 여러 논문에서 GPU 로 GA 를 수행할 때 속도가 증가되었다고 했던 것들을 검토해 보았더니 전부 GPU 상에서 모든 유전 연산을 수행하고 있었다.

분명 단일 연산만을 놓고 보았을 때는 GPU 상에서 Evaluation 을 한번 처리한 것이 가장 빠르지만, 유전 연산을 CPU 상에서 하게되면, 결국 Memory 할당과 복사를 반복하게 되어 속도가 느려지는 것이다. Evaluation 연산을 하기 위해서는 반드시 GPU 상의 메모리에 CPU 의 현재 상태를 복사해야 하니까 결국 이것때문에 반복적인 메모리 복사가 수행될 수 밖에 없는 것.

그렇다면 결론은 GPU 상에서 모든 연산을 처리하는 것인가?

뭐 중요한 요소중에 하나는 내 GPU 가 Geforce G105M 256M 이기 때문에 큰 메모리 할당도 어려울 뿐아니라, Stream Processor 수도 부족해서 제 속도 나오긴 어려울 수 밖에 없다는 건데...

동일한 실험 조건
static const int POPSIZE = 5000;
static const int MAXGENS = 100;
static const int ITERATION = 200;
static const int NVARS = 10;

GPU 상의 실험 결과(Geforce G105M 256MB)
Durations : 14118.000000 ms

CPU 상의 실험 결과(Intel Core2Duo P8600@2.4Ghz, 4 GB ram)
Durations : 10998 ms

다음엔 Geforce GTX270 876MB 에서 테스트 해볼 예정.
과연 어느정도 시점에서 Evaluation 작업만을 수행할 때 GPU 사용 작업이 속도가 대폭 상승할 수 있을 것인가?

저작자 표시 비영리 동일 조건 변경 허락
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by SHHyun
크리에이티브 커먼즈 라이선스
Creative Commons License
여러가지 자료를 살펴보다 보니 왜 CUDA 를 많이 쓰는지 잘 알것 같다.

기본적으로 for loop 로 돌던 것들의 index 를 병렬적으로 배치해주는 것이 그 핵심인데,

해당 과정만 거치고 나면, 거의 모든 종류의 계산 알고리즘을 병렬화 해줄 수 있다.

Block 당 512개의 Threads 제한은 조금은 충격.

연구실의 후배가 문제를 발견해서, 해당 문제점에 대해 생각해보니 어라? 이건 좀 이상하네 라는 생각이 들었다.

그리드당 블럭의 개수는 512x512x32 였던가

그런데 레퍼런스 자체에 표현이 좀 혼동되게 되어있는 것이 Block 과 Grid 에 대한 것이다.

레퍼런스 상의 Block 은 Thread 와 같고, Grid 는 Kernel 과 같은데, 위의 그리드당 블럭 개수는 진짜 그리드당 블럭 개수로 해석해야 한다.

이거원...

조금은 더 명확히 정리해야할 필요가 있는 것 같다.
저작자 표시 비영리 동일 조건 변경 허락
Posted by SHHyun

CUDA Programming

Programming / 2009/12/04 02:21
크리에이티브 커먼즈 라이선스
Creative Commons License
병렬처리는 결국 필수 불가결한 요소가 될 것임에는 분명하다. 확실히 단일 코어 발전 대비 성능 비율이 언젠가부터 매우 낮아진다는 것을 확인할 수 있다. CPU 를 듀얼 혹은 쿼드로 쓰는 것도 꽤 매리트가 있지만, 알고리즘을 연구하는 사람으로써 그런 한 두개의 병렬을 가지고 큰 효과를 보기에는 그 한계가 명확하다.

결국 요래저래 살펴보다가 또다시 GPU 쪽으로 눈이 돌아가게 되었는데, 그 당시에는 그렇게 어렵게만 느껴지던 CUDA 라는 것이 그렇게 어려운 녀석이 아니었다.

일련의 흐름에 따라서 프로그래밍을 하면 되는데,

1. 디바이스의 초기화
2. GPU 상의 메모리 할당 ( cudaMalloc )
3. CPU 상에서 GPU 상으로 처리할 내용을 복사 ( cudaMemcpy )
4. 커널을 수행함으로써 원하는 연산 처리 ( function <<< blocks, threads, sharedmem >>> ( parameters ) )
5. GPU 상에서 처리된 내용을 CPU 상으로 재 이동 ( cudaMemcpy )
6. 할당했었던 메모리를 모두 해제 ( cudaFree )
7. 디바이스 종료

이러한 큰 흐름을 순서로 움직이면 된다.
얼마나 쉬운가?

마치 포인터를 처음 볼때의 그런 느낌이었다. 어라? 별거 아니네?
그런데 이놈도 포인터랑 똑같은 놈이더라. 결국 잘 쓰려고 하다보니 메모리 구조에 대한 것을 다시 확인해야 했다. CUDA 의 처리는 Block 단위의 다수의 스레드를 어떻게 관리하느냐, 그리고 이들이 처리될 때의 Shared Memory 를 잘 관리해 줘야 올바른 결과를 얻을 수 있고, 획기적인 병렬처리의 성능을 만끽할 수 있다는 것. 게다가 망할 포인터보다도 하나 더 많은 요소가 있었으니, Block 과 Thread 의 숫자를 결정해주는 것이다.

하지만 확실한 건 포인터와 마찬가지로 이놈도 쉽게 생각하면 될 것 같은 기분이 든다.
다음 번엔 SGA 에 Evaluation 과정을 CUDA 를 이용해 처리한 소스나 올려봐야 겠다. 아직 Thread 동기화에 문제가 있는지, 자꾸 마지막 변수값만 들어가는 현상이 발생하던데 요고만 해결하고 나서 하나씩 또 정리해봐야겠다.

저작자 표시 비영리 동일 조건 변경 허락
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by SHHyun

최근에 달린 댓글

최근에 받은 트랙백

글 보관함