CUDA 메모리 구조(2)

CUDA 연산의 개념은 아래 그림과 같은 구조로 되어 있습니다.

사용자 삽입 이미지

여기서 Thread라고 되어 있는 것들이 CUDA연산에서 가장 작은 단위인 것입니다.
이 Thread들은 Block의 하위에 있고 Block들은 다시 Grid의 하위에 있습니다.
그래서 프로그래머가 연산을 하려면

'몇번Grid의 몇번Block의 몇번Thread를 사용하여 계산하겠다'

를 지정해 주어야 합니다.

여기서 각 Thread는 자신만의 local memory를 가지게 됩니다.
각 Thread 간에 data 공유를 위한 shared memory는 따로 있습니다.
그리고 Block들의 집합인 Grid간에 data 공유를 위한 Global memory가 있습니다.
구조는 아래와 같습니다.

사용자 삽입 이미지


이 memory들을 어떻게 사용하느냐에 따라서 같은 연산을 하는 CUDA프로그램이라 하더라도 큰 성능차이를 내게 됩니다.
memory간의 data를 이동시키는 비용이 꽤 크기 때문에 적절한 알고리즘을 작성하지 않는다면 계산하는데서 단축한 시간을 data 이동시키는데서 다 까먹을 수 있게 됩니다.
각 memory들의 속도 또한 차이가 있어서 이런 여러가지 요소를 고려하기 시작하면 복잡해지기 시작하는 겁니다.
결국 CUDA 프로그래밍의 핵심은 각 memory들의 특성을 파악해서 최대한 효율적인 알고리즘을 만드는데 있습니다.

아래 그림은 Grid를 이용해 계산한다는 것이 코드로는 어떻게 표현되는지를 나타냅니다.
사용자 삽입 이미지

결국 template project에서 보았던 kernel을 실행시키는 부분이 kernel에 해당하는 Grid를 실행시킨다는 것을 알 수 있습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 아리수

2009/02/11 20:32 2009/02/11 20:32
, ,
Response
No Trackback , 9 Comments
RSS :
http://arisu.mireene.com/rss/response/137

Trackback URL : http://arisu.mireene.com/trackback/137

Comments List

  1. MESL 2009/02/16 03:40 # M/D Reply Permalink

    정말 깔끔하게 잘 정리 해 두셧습니다.

    저도 CUDA에 대해 공부하고있는데...

    사실 logical한 부분만 다루고있고...

    곧있으면 output을 내야 하는 상황이라...;; 걱정이 많네요.ㅠ

    많은 도움 부탁드립니다.ㅠㅠ

    1. 아리수 2009/02/17 09:22 # M/D Permalink

      실제 코딩도 같이 해보시는게 이해하시는데 도움이 많이 되실거예요.
      저도 그리 많이 아는건 아니라서요..^^;

  2. MESL 2009/02/27 13:40 # M/D Reply Permalink

    질문 있습니다.
    제가 하고있는 플젝의 데이터가 float형이 4000*400개를 적분연산 해야하는데,
    커널수행명령어.. 즉

    testkernel <<< >>>
    이부분에서 오류가 나는군요..
    컴파일은 다 되구요.
    invalid configuration argument라는데... 뭘 고쳐야될지-ㅅ-
    조언부탁드립니다.

    1. 아리수 2009/02/27 18:01 # M/D Permalink

      소스가 없어서 무어라 답변드리기 애매하네요. 에러내용만 보면 device에서 사용할 변수를 할당하고 device 메모리에 변수를 할당하는 과정에 원인이 있는 것 같습니다.

  3. MESL 2009/03/02 21:10 # M/D Reply Permalink

    음... 소스를 보내드려볼까요??;
    혹 메일주소가 어떻게 되시는지..ㅠ

    교수님은 아웃풋을 원하시고.. 전 진행이 안되고..
    답답해 죽겟습니다..ㅠ

    1. 아리수 2009/03/02 22:13 # M/D Permalink

      리눅스용인가요? 윈도우용인가요?
      제 메일은 arisu1000@gmail.com 입니다.
      보내주신다고해서 꼭 해결되리라는 확답은 못드리지만 살펴보고 회신 드리겠습니다.

  4. stylidy 2009/03/17 22:59 # M/D Reply Permalink

    정리 해놓으신 포스트들 많은 도움이 되었습니다.
    Visual Studio 2005에서 CUDA를 이용해 새로운 프로젝트를 생성해서 작업을 하려고 합니다. 혹시 release note에 있는 template프로젝트를 이용하는 방법 말고, 새로운 프로젝트를 생성하는 방법을 알고 계시면 도움을 주시면 감사하겠습니다. Visual studio 프로젝트 환경 설정에서 애를 먹고 있어서,,;;;;
    그리고 원래 생성되어 있는 프로젝트를 CUDA환경으로 변환(?)할 수 있는 방법을 알고 계신지,,,;;;;
    코딩에서 에러가 있어서 진행이 안되면 그나마 디버깅이라도 해볼 수 있겠는데,, 프로젝트 환경설정이 안되서 애를 먹고 있으니 너무 답답하네요,,;;;;
    조언좀 해주시면 감사하겠습니다.
    아,, 제 메일 주소는 stylidy@metq.com입니다.
    아리수님 블로그 번창하시길 바랍니다.

    1. 아리수 2009/03/19 20:06 # M/D Permalink

      제가 원래 CUDA프로그래밍을 리눅스에서 많이 했었기 때문에 질문주신 윈도우에서 새로운 프로젝트 환경 설정하는 방법은 해본적이 없습니다.
      그리고 CUDA 디버깅은 Visual Studio 로는 어려운 부분이 있습니다. Visual Studio는 메인보드와 CPU상에서 일어나는 부분만 디버깅 가능하기 때문에 GPU상에서 어떻게 연산이 진행되는지에 관한 정보는 알기가 어렵습니다.

  5. stylidy 2009/03/20 16:02 # M/D Reply Permalink

    그렇군요,, 답답하네요,,,;;;;;
    이놈의 링크에러,,, 어흑
    답변해주셔서 감사합니다~

Leave a comment
« Previous : 1 : ... 6 : 7 : 8 : 9 : 10 : 11 : 12 : 13 : 14 : ... 144 : Next »