본문 바로가기

Programming/Todo's CUDA

스레드 블록 아키텍처(Thread Block Architecture) - 그리드 블록 모델 -3 2.6 매트릭스 곱 이전 글에서 살펴본 매트릭스는 12 X 12 크기로 작상서 GPU가 최대 효율을 발휘하지 않는다. 그러나 CUDA 프로그래밍에 익숙해지고 2차원 스레드의 작업 분할에 대하여 알아보는 것이 목적이므로 작은 매트릭스 크기로 진행하는 것이 이해하기 쉽다. 행렬의 곱 M X N = P 는 다음과 같이 계산된다. P( tx, ty) = M(0, ty) X N(tx, 0) + M(1, ty) X N(tx, 1) + M(2, ty) X N(tx, 2) + M(3, ty) X N(tx, 3) + ..... M(11, ty) X N(tx, 11); 위의 수식을 C코드로 구현하게 되면 12회 계산의 for 루프를 가지게 되고 매트릭스에 12 X 12 개의 연산이 있기 때문에 총 연산은 12 X 12 X.. 더보기
스레드 블록 아키텍처(Thread Block Architecture) - 그리드 블록 모델 -2 2.3 스레드 블록 생성 가이드라인 -CUDA 프로그래밍에서 1개의 블록은 최대 512개의 스레드를 가질 수 있다. -프로그램을 구현할떄 1개 블록이 가지는 스레드의 개수는 32 또는 64의 배수로 지정하는 것이 좋다.(SM이 32배수 단위로 동작하게 되어 있기 때문에 나머지가 발생하지 않는다. NVIDIA의 사양서는 64배수를 권장한다.) -최대 블록의 크기는 65,535 X 65,535 까지 지정할 수 있으므로 CUDA프로그래밍의 스레드와 블록의 수는 작업을 분할하는 기준으로 많은 수를 지정하는 것이 좋다. 그러면 GPU는 SM단위로 블록을 처리하면서 작업을 진행하게 된다. | GPU의 블록 단위 작업 처리 | CUDA 프로그램의 자동 확장성 위의 그림은 SM이 프로그램을 블록 단위로 병렬처리하는 과.. 더보기
스레드 블록 아키텍처(Thread Block Architecture) - 그리드 블록 모델 -1 02. 그리드 블록 모델 CUDA에서 단순하게 스레드 수만 개를 설정했다고 해서 모든 코어가 효율적으로 동작하는 것은 아니다. 스레드의 계층 구조 : 스레드 < 블록 < 그리드 2.1 CUDA 블록과 1차원 스레드 생성 -CUDA의 블록은 스레드가 모인 집합이다. -스레드가 여러 개 모여 하나의 블록을 이루게 된다.-하나의 블록은 1개에서부터 최대 512개 까지 스레드를 가질 수 있다. -블록 안에 있는 스레드는 고유 아이디를 가지게 된다. -블록이 스레드를 512개까지 가지고 있을 수 있기 때문에 0번부터 511번 까지 고유한 인덱스 번호를 지정받게 된다.-블록 안에 스레드를 배치하는 방법은 1차원, 2차원, 3차원으로 지정할 수 있다. | 1차원으로 배치한 스레드 블록 (블록 안에 6개의 스레드를 생.. 더보기
스레드 블록 아키텍처(Thread Block Architecture) - CUDA 스레드 모델 01. CUDA 스레드 모델 1.1 CPU의 스레드, 태스크 분할 CPU환경에서 생성하는 스레드는 생성 즉시 실행 코드가 프로세서에서 실행된다. 생성한 스레드의 개수와 CPU의 코어 수가 동일하면 최적의 효율을 나타내지만, 코어 수보다 많아지면 시분할 스케줄로 동작하게 되어 효율이 떨어진다. 병렬처리에서 효율성을 높이는 방법은 태스크(Task) 분할 방식으로 작업을 처리하는 것이다. | 태스크 분할 처리과정 ① 스레드의 개수를 코어 수와 동일하게 생성한다.② 해야 할 작업을 태스크 단위로 작게 분할하여 태스크 큐에 넣는다.③ 스레드가 작업을 태스크 단위로 가져와서 처리한다.④ 스레드가 하나의 태스크를 완료하면 다음 태스크를 큐에서 가져와서 다시 작업을 수행한다. 태스크란?https://kyulingcom.. 더보기
CUDA 프로그램 준비 - CUDA C언어 CUDA C 언어 CUDA C언어의 목적 : C언어에 가까운 프로그램 언어를 제공하여 기존의 C프로그래머가 사용하기 쉬운 환경을 제공하는 것이다. 3.1 함수의 수식어 | __global__ - 디바이스에서 실행된다. - 호스트에서 실행할 수는 있어도 디바이스에서 호출할 수는 없다. - 디바이스로 실행하는 커널 함수 지정에 사용할 수 있다. 문법 __global__ function(a, b, c){ } 주의사항 - 리턴값은 항상 void 이다.- 을 이용하여 실행 시 블록과 스레드를 지정할 수 있다.- 재귀 호출은 할 수 없다.- 함수 내에 static변수를 가질 수 없다.- 가변형 인수를 가질 수 없다.- __global__로 지정한 함수의 포인터를 이용할 수 있다.- __host__(후술)와 동시에는.. 더보기
CUDA 프로그램 준비 - 설치 https://hiuaa.tistory.com/m/39?category=213773 더보기
CUDA의 기본 - 3(Architecture) 03. CUDA 프로세서 아키텍처 3.1 그래픽 카드 블록 다이어그램 그래픽 카드는 GPU와 보드 , 그래픽 메모리(DRAM), 기타 장치로 구성되어 있는데 프로그래밍에서는 주요하게 GPU와 메모리만을 다루게 된다. 그래픽 카드의 내부에 있는 사각형은 GPU를 나타내는 것으로 그래픽 카드 중심에 장착된 프로세서를 의미한다. PC의 메인보드에 장착된 CPU와 같은 기능을 하며 GPU 내부에 있는 모듈들은 프로세서 안에 있기 때문에 빠르게 동작한다. 3.2 스트리밍 프로세서(SP, Streaming Processor) GPU에서 연산을 하는 코어 유닛이다. 실수를 계산하기 위한 FPU(FP), 정수 계산을 하는 ALU(Int), 데이터를 로드 / 스토어 하기위한 LSU(move, cmp)를 모두 갖추고 있다.. 더보기
CUDA의 기본 - 2 2.3 CUDA 데이터의 병렬처리 CPU의 처리과정에서 여러 개의 코어가 있을 때 데이터를 분할하여 전송하고 이를 처리하기 위해서 워커함수를 스레드로 생성하여 병렬로 처리한다. CUDA프로그램 도 그 과정은 동일하지만 규모가 더 크다. 아래의 그림에서는 36개의 코어를 나타내었고 데이터릐 흐름은 6개만을 표현하였다. 실제로 CUDA 프로그램에서는 128개~ 512개의 코어로 데이터가 입력되어 동작하게 된다. CUDA를 이용한 데이터의 병렬처리 과정 ① 입력과 출력에 사용할 데이터를 PC메모리에 할당한다.② 입력과 출력에 사용할 데이터를 그래픽 메모리에 할당한다.③ 처리하고자 하는 값을 PC 메모리에 입력한다.④ PC 메모리에 있는 입력 데이터를 그래픽 메모리로 복사한다.⑤ 데이터를 분할하여 GPU로 가져.. 더보기