2010/02/07 00:54
크리에이티브 커먼즈 라이선스
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


저작자 표시 비영리 동일 조건 변경 허락
Posted by SHHyun
2009/12/11 01:40
크리에이티브 커먼즈 라이선스
Creative Commons License
여러가지 자료를 살펴보다 보니 왜 CUDA 를 많이 쓰는지 잘 알것 같다.

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

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

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

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

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

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

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

이거원...

조금은 더 명확히 정리해야할 필요가 있는 것 같다.
저작자 표시 비영리 동일 조건 변경 허락
Posted by SHHyun
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 동기화에 문제가 있는지, 자꾸 마지막 변수값만 들어가는 현상이 발생하던데 요고만 해결하고 나서 하나씩 또 정리해봐야겠다.

저작자 표시 비영리 동일 조건 변경 허락
Posted by SHHyun
2009/07/14 12:10
크리에이티브 커먼즈 라이선스
Creative Commons License

#include <windows.h>

#include <math.h>

   

void wait(double sec)

{

unsigned int msec;

   

assert(sec > 0);

msec = (unsigned int) floor(sec * 1e3);

assert(msec >= 10);

Sleep(msec);

}

 

리눅스용 프로그램을 윈도우로 변환하다가 가끔씩 애를 먹었던 부분인데 ( 나만 그런지 모르겠지만…;;

윈도우에서 Sleep 함수는 저런 형태로 사용할 수 있다.

 

리눅스에서는

 

#include <unistd.h>

#include <math.h>

   

void wait(double sec)

{

unsigned int msec;

   

assert(sec > 0);

msec = (unsigned int) floor(sec * 1e3);

assert(msec >= 10);

usleep(msec);

}

 

단지 usleep (리눅스) -> Sleep (윈도우) 로 변경했을 뿐…

서로 호환 안되는 부분은 역시 짜증난다.

 

별 것 아니지만 자꾸 까먹는 관계로 정리를 =ㅠ=

Posted by SHHyun
2009/05/09 02:38
크리에이티브 커먼즈 라이선스
Creative Commons License
http://www.shabdar.org/google-maps-user-control-for-ASP-Net-part1.html

http://www.codeproject.com/KB/custom-controls/LatLaysFlat-Part1.aspx

개인적으로는 위의 것을 더 추천한다.
훨씬 사용하기가 간단하고 수월하다는 이유 하나만으로.
아래쪽의 것은 더 체계적으로 잘 되어 있는 듯 싶지만, 사실 좀 복잡하다.

음...
이걸 찾아서 사용하게 된 이유라면
C# 이 왠지 손에 익숙해지기 시작했고,
작업속도가 C#을 쓰는것과 JAVA 를 쓰는것 중에 C# 을 쓰는것이 월등히 빨라졌기 때문이랄까...
거기에 Dreamspark 덕분에 공짜로 IIS 를 맘놓고 사용하고 있으니...

혹시라도 구글맵을 ASP.NET 으로 제어하기를 원하신다면, 위의 링크들을 따라가시면 도움이 될듯.

P.S. 아차차... 이 내용이 중요한데 빠졌군요. 위의 것의 목적은 말그대로 구글맵 자체의 제어고, 아래것의 목적은 Display 에 해당 하는 부분들 입니다. 즉, 동적으로 입력을 받아 이를 제어하기 위해서는 천상 위의 것이 낫습죠;; 아래 것은 또 수정해야하니;;
Posted by SHHyun
2009/03/31 14:36
크리에이티브 커먼즈 라이선스
Creative Commons License
페도라 10 에서 네트워크 관리자에서 계속 DNS 재설정하는 현상이 발생하는분은 요렇게 해보시면 아마 해결될 것 입니다.

/etc/sysconfig/network-scripts/ifcfg-eth0
혹은 ifcfg-eth1
또는 ifcfg-개인이 지정한 프로파일 이름

위의 파일을 여시면

# Please read /usr/share/doc/initscripts-*/sysconfig.txt
# for the documentation of these parameters.
GATEWAY=XXX.XXX.XXX.XXX
TYPE=Ethernet
DEVICE=eth1
HWADDR=XX:XX:XX:XX:XX:XX
BOOTPROTO=none
NETMASK=255.255.255.0
IPADDR=XXX.XXX.XXX.XXX
ONBOOT=yes
USERCTL=no
PEERDNS=yes
IPV6INIT=no
NM_CONTROLLED=yes

이런식으로 구성이 되어 있을것 입니다.
여기다가 아래와같이 DNS 구성을 추가하신 후에

DNS1=168.126.63.1
DNS2=168.126.63.2
(*) 주소는 평상시에 쓰시는 DNS 를 입력해주시면 됩니다.

저장 하시고 터미널에서

service network restart

그 후부터는 DNS 재지정없이 잘 될 거예요. :)

무...물론 안될수도 있습니다 -_-
저의 경우는 이렇게 해결 했습니다 ^^;

Posted by SHHyun
2008/02/16 21:45
크리에이티브 커먼즈 라이선스
Creative Commons License
일반적으로 getchar() 함수는 하나의 문자 입력을 받을 때 쓰는 함수입니다.

콘솔상태에서 알고리즘 프로그래밍을 하다보면
데이터 입력을 받을때 주로 쓰는 함수가
scanf, getchar 등이 있겠는데요.

오늘 제가 말씀드리고자 하는건 getchar() 함수의 다른 용도 입니다.

디버그에 이용하는 것 입니다.

어떻게 이용하느냐...

예를들면 이런 것 입니다.

엄청나게 복잡한 프로그램이 수행되고 있는데 갑자기 중간에 오류가 생기는거죠
여기서 VS 디버거를 이용하면 그만 아니냐... 라고 말하신다면 그냥 묵념하겠습니다
네.. 여기서 말씀드리고자 하는건
VS 디버거를 편리하게 사용할 수 없는 경우 입니다.
Webot 이나 다른 프로그램에 연동되는 것을 이용할 때
간혹 디버거를 이용할 수 없는 경우가 있습니다.
리눅스에서도 GDB나 이런 디버거를 이용하기 어려운 경우를 이야기 합니다.

이럴때
getchar() 함수와 printf 나 puts 등의 함수를 세트로 곳곳에 배치하는 것
입니다.

이렇게 되면 현재 프로그램의 진행상황을 살펴볼 수 있으니
편리하게 오류를 잡아낼 수 있는 것이죠.
puts 나 printf 로 모든 프로그램의 진행상황을 다 추적해보는 것도 하나의 방법입니다만,
어떤 콘솔 프로그램은 오류가 나는 즉시 중단되어 버리기도 하기 때문에
getchar 함수를 디버그에 이용하면 편리합니다.

많은 분들이 이미 이렇게 쓰시는 분도 계시는지 모르겠지만...
모르시는 분들도 혹시 있을까해서 한번 적어보았습니다.
Posted by SHHyun