검색결과 리스트
IT/Parallel에 해당되는 글 5건
- 2010/01/08 CUDA 오류 검사 함수
- 2010/01/02 CUDA 개발 환경 설정하기 #2. Visual Studio 환경 설정
- 2009/12/26 CUDA 개발 환경 설정하기 #1. CUDA driver, toolkit, SDK 설치
- 2009/12/22 GPU 프로그래밍의 시작, CUDA
- 2009/12/21 GPGPU ; General-Purpose computing on GPU
글
CUDA 오류 검사 함수
void cuErr(const char *msg){
cudaError_t err = cudaGetLastError();
if(cudaSuccess != err)
printf("*cudaErr(%d) in %s : %s \n",err,msg,cudaGetErrorString(err));
}
아직 확실히 테스트는 안 해봤지만, 이런게 있단다. MPI나 OpenMP를 먼저 공부해야 하는 것인가. 근데, 한글자료는 왜 이리 부족하니.
'IT > Parallel' 카테고리의 다른 글
| CUDA 오류 검사 함수 (0) | 2010/01/08 |
|---|---|
| CUDA 개발 환경 설정하기 #2. Visual Studio 환경 설정 (0) | 2010/01/02 |
| CUDA 개발 환경 설정하기 #1. CUDA driver, toolkit, SDK 설치 (0) | 2009/12/26 |
| GPU 프로그래밍의 시작, CUDA (0) | 2009/12/22 |
| GPGPU ; General-Purpose computing on GPU (0) | 2009/12/21 |
글
CUDA 개발 환경 설정하기 #2. Visual Studio 환경 설정
[CUDA 개발 환경 설정하기 #1. CUDA driver, toolkit, SDK 설치] 에 이어서, 이번에는 Visual Studio(이하 VS)에 CUDA 개발환경을 설정해보자.
1. 파일 확장자 등록 .cu, .cuh
VS의 옵션 메뉴에 들어가서, 텍스트 편집기(Text Editor) > 파일 확장명(File Extension) 부분에 들어가서, cu와 cuh 파일에 대한 확장자를 등록한다.
2. CUDA Syntax 하이라이트 기능 등록
CUDA에서 사용하는 변수명이나 명령어에 하이라이트 기능을 주기 위하여, CUDA SDK에서 제공되어지는 usertype.dat 파일을 VS 폴더로 복사한다.
- 대상 파일 : SDK 폴더 안에서 usertype.dat 파일
(NVIDIA GPU Computing SDK 폴더\C\doc\syntax_highlighting 폴더 안에서 VS 버젼에 따라 선택)
- 대상 폴더 : Microsoft Visual Studio 폴더\Common7\IDE
* Visual Studio AssistX 에서 설정하는 법은 [여기]를 참고.
3. CUDA 소스코드의 컴파일러를 NVCC 컴파일러로 설정
명령표시줄에서 [프로젝트(Project)] 메뉴의 [사용자 지정 빌드 규칙(Custom Build Rules)] 메뉴로 들어간다. 기존 파일 찾기(Finding Exist)를 선택하여, CUDA SDK 폴더(NVIDIA GPU Computing SDK\C\common\)에서 cuda.rules파일을 찾아 추가한다.
추가한 뒤에 꼭 추가 규칙을 체크하여야 한다.
4. 프로젝트에 CUDA Library 폴더 추가, 링커 설정하기
프로젝트 속성에서 링커 부분에서 추가 라이브러리 폴더와, 추가 종속성에서 라이브러리를 등록합니다.
※ CUDA 지원 프로세서가 없는 경우, Emulation 모드 설정하기
필자는 ATI 계열 프로세서이기 때문에, CUDA 프로그램이 불가능하다. CUDA 지원하는 프로세서를 권장하기는 하나, 임시 개발을 위해 프로젝트 속성에서 Emulation 모드로 설정했다.
이것으로 CUDA 개발을 위한 Visual Studio 환경 설정이 다 되었다. 이제 진정한 개발을 시작해보자.
'IT > Parallel' 카테고리의 다른 글
| CUDA 오류 검사 함수 (0) | 2010/01/08 |
|---|---|
| CUDA 개발 환경 설정하기 #2. Visual Studio 환경 설정 (0) | 2010/01/02 |
| CUDA 개발 환경 설정하기 #1. CUDA driver, toolkit, SDK 설치 (0) | 2009/12/26 |
| GPU 프로그래밍의 시작, CUDA (0) | 2009/12/22 |
| GPGPU ; General-Purpose computing on GPU (0) | 2009/12/21 |
글
CUDA 개발 환경 설정하기 #1. CUDA driver, toolkit, SDK 설치
첫째로, CUDA Driver, Toolkit, SDK 코드를 nVidia 홈페이지에서 다운 받는다.
- CUDA 드라이버는 CUDA 지원 GPU 제품만 설치하면 된다고 명시되어 있다. [지원 제품 목록 바로가기] 지원하지 않는 환경에서는 Emulation 모드로 프로그램 할 수 있다.
- CUDA Toolkit에는 컴파일러, 디버거 등의 C 언어에서의 개발 환경을 제공하고 있다.
- CUDA SDK에는 개발자들이 참고할 만한 소스들이 들어있다. 병렬 정렬, 행렬 곱셈 등 다양한 예제 소스가 있으므로 참고하면 좋을 것이다.
드라이버 카드가 ati계열이라서 driver 설치는 생략하였다. toolkit을 설치하고 CUDA 폴더를 보니 doc 폴더가 있었고, 그 안에는 다양한 개발 관련 문서가 있다. (물론 영어)
SDK 설치파일을 실행하면, SDK Browser가 설치되고, 75개의 코드 샘플들을 실행해볼 수 있다. (하지만, nVidia 그래픽 카드가 없어서 인지, Run을 실행해도 반응이 없다!)
필수 파일들을 설치하고, 프로그램을 할 준비가 되었다. 다음 포스팅은 설정하기 2부와 Emulation 모드로 사용하는 법을 알아봐야겠다.
'IT > Parallel' 카테고리의 다른 글
| CUDA 오류 검사 함수 (0) | 2010/01/08 |
|---|---|
| CUDA 개발 환경 설정하기 #2. Visual Studio 환경 설정 (0) | 2010/01/02 |
| CUDA 개발 환경 설정하기 #1. CUDA driver, toolkit, SDK 설치 (0) | 2009/12/26 |
| GPU 프로그래밍의 시작, CUDA (0) | 2009/12/22 |
| GPGPU ; General-Purpose computing on GPU (0) | 2009/12/21 |
글
GPU 프로그래밍의 시작, CUDA
CUDA(an acronym for "Compute Unified Device Architecture", 쿠다)는 GPU에서 수행하는 (병렬 처리) 알고리즘을 C 프로그래밍 언어 등을 사용하여 작성할 수 있도록 하는 GPGPU 기술이다. CUDA는 엔비디아가 개발해오고 있으며 이 아키텍처를 사용하려면 엔비디아 GPU와 특별한 스트림 처리 드라이버가 필요하다. CUDA는 G8X GPU로 구성된 지포스 8 시리즈급 이상에서 동작한다. CUDA는 CUDA GPU 안의 명령셋과 대용량 병렬 처리 메모리를 접근할 수 있도록 해 준다. (그래픽 카드가 없는 경우, Emulation Mode에서 테스트가 가능하다.)
개발자는 패스스케일 오픈64 C 컴파일러로 컴파일 된 '쿠다를 위한 C' (C언어를 엔비디아가 확장한 것) 를 사용하여 GPU 상에서 실행시킬 알고리듬을 작성할 수 있다. 쿠다 구조는 일련의 계산 인터페이스를 지원하며 이에는 OpenCL, DirectX Compute가 포함된다. 3자 개발 래퍼도 있는데, 파이썬, 포트란, 자바와 매트랩 등이 있다.
최신 드라이버는 모두 필요한 쿠다 콤포넌트를 담고 있다. 쿠다는 모든 엔비디아 GPU (G8X 시리즈 이후) 를 지원하며 이 대상에는 지포스, 콰드로, 테슬라 제품군이 포함된다. 엔비디아는 지포스 8 시리즈를 위해 개발된 프로그램들은 수정 없이 모든 미래의 엔비디아 비디오 카드에서 실행될 것이라고 선언하였다. 쿠다를 통해 개발자들은 쿠다 GPU 안 병렬 계산 요소 고유의 명령어 집합과 메모리에 접근할 수 있다. 쿠다를 사용하여 최신 엔비디아 GPU를 효과적으로 개방적으로 사용할 수 있다. 그러나 CPU와는 달리 GPU는 병렬 다수 코어 구조를 가지고 있고, 각 코어는 수천 스레드를 동시에 실행시킬 수 있다. 어떤 응용 프로그램이 이러한 종류의 구조에 적합하면, GPU는 커다란 성능 혜택을 입을 수 있다.
컴퓨터 게임 업계에서는 그래픽 랜더링에 덧붙여, 그래픽 카드를 게임 물리 계산 (파편, 연기, 불, 유체 등 물리 효과)에 사용되며, 예로는 피즈 엑스와 불렛이 있다. 쿠다는 그래픽이 아닌 응용 프로그램, 즉, 계산 생물학, 암호학, 그리고 다른 분야에서 10배 또는 그 이상의 속도 혜택을 가져왔다. 이 한 예는 보닉 분산 계산 클라이언트 이다.
쿠다는 저수준 API와 고수준 API 모두를 제공한다. 최초의 CUDA SDK는 2007년 2월 15일에 공개되었으며 마이크로소프트 윈도우즈와 리눅스를 지원했다. 맥 OS X지원은 2.0 버전에 추가되었다.
<자료출처 : 위키>
'IT > Parallel' 카테고리의 다른 글
| CUDA 오류 검사 함수 (0) | 2010/01/08 |
|---|---|
| CUDA 개발 환경 설정하기 #2. Visual Studio 환경 설정 (0) | 2010/01/02 |
| CUDA 개발 환경 설정하기 #1. CUDA driver, toolkit, SDK 설치 (0) | 2009/12/26 |
| GPU 프로그래밍의 시작, CUDA (0) | 2009/12/22 |
| GPGPU ; General-Purpose computing on GPU (0) | 2009/12/21 |
글
GPGPU ; General-Purpose computing on GPU
범용 GPU(GPGPU, General-Purpose computing on Graphics Processing Units: 그래픽 처리 장치를 통한 일반 목적의 컴퓨팅)는 GPGP 또는 GP2 라고도 불리며, 컴퓨터 그래픽스를 위한 계산만 다루는 GPU를 사용하여 CPU가 전통적으로 취급했던 응용 프로그램들의 계산을 수행하는 기술이다. 이를 가능하게 한 것은 프로그램 가능한 "단"과 고정도 연산을 그래픽 파이프라인에 연결하는 것으로, 이를 통하여 소프트웨어 개발자들이 그래픽이 아닌 데이터에 흐름 처리(Stream Processing)를 사용할 수 있게 된다.
GPU 프로그래밍 개념
GPU는 그래픽에 특화되어 설계되었으며 따라서 연산과 프로그래밍에 있어서 매우 제한적이다. 그 본성에 따라, GPU는 흐름 처리를 이용하여 풀 수 있는 문제에서만 효과적이며 그 하드웨어를 사용하는 방식은 정해져 있다.
흐름 처리(Stream Processing)
GPU는 독립적인 꼭지점들과 프래그먼트만 처리할 수 있지만 다수를 병렬로 처리할 수 있다. 이것은 특히 프로그래머가 같은 방식으로 많은 수의 꼭지점 또는 프래그먼트를 처리하고자 할 때 유용하다. 이런 의미에서, GPU는 흐름 프로세서이다. 즉, 병렬로 한번에 하나의 커널을 흐름 속의 많은 레코드에 실행시키는 것이다.
흐름이란 단순히 유사한 계산을 필요로 하는 레코드의 모음이다. 흐름으로 데이터 병렬성을 구할 수 있다. 커널이란 함수로써 흐름 속의 각 요소에 적용되는 것이다. GPU에서는 꼭지점과 프래그먼트가 흐름 속의 요소이고, 셰이더가 그 위에서 작동하는 커널이다.
GPU가 요소들을 독립적으로 처리하므로 공유되는 또는 정적인 데이터는 없다. 단지 각 요소를 입력으로부터 읽고, 연산을 수행하고, 출력으로 쓸 뿐이다. 다양한 입력과 다양한 출력을 갖는 것은 허용되는 편이나 읽고 쓰기에 모두 사용되는 메모리는 없다.
산술 치열도는 전송되는 메모리 워드 당 연산으로 정의된다. 중요한 것은 GPGPU 응용 프로그램이 높은 산술 치열도를 가지는 것으로 그렇지 않다면 메모리 접근 불확실성이 계산 속도를 제한할 것이다. 이상적인 GPGPU 응용 프로그램의 데이터 집합은 크고, 병렬도는 높고, 데이터 요소간 의존성은 최소이다.
계산 자원(Computational Resources)
GPU가 사용 가능한 계산 자원은 다양하다:
- 프로그램 가능한 프로세서 – 꼭지점, 파이프라인으로 프로그래머는 데이터의 흐름에 커널을 구현할 수 있다.
- 비트맵 변환기(Rasterizer) – 프래그먼트를 만들고 텍스쳐 좌표나 색상등의 상수를 꼭지점에 보간한다.
- 텍스쳐 유닛 – 읽기 전용 메모리 인터페이스
- 프레임 버퍼 – 쓰기 전용 메모리 인터페이스
사실, 프로그래머는 프레임 버퍼 대신 쓰기 전용 인터페이스로 바꿔치기할 수도 있다. 이는 Render-To-Texture(RTT) 또는 Render-To-Backbuffer-Copy-To-Texture(RTBCTT), 아니면 더 최근의 흐름 출력으로 이루어진다.
흐름으로서의 텍스쳐(Textures as Stream)
GPGPU에서 흐름이 취하는 가장 일반적인 형태는 2차원 격자이다. GPU안에 만들어져 있는 랜더링 모델에 알맞기 때문이다. 다수의 계산이 격자 형태로 변환될 수 있다: 행렬 계산, 이미지 처리, 물리 기반 시뮬레이션 등. 텍스쳐가 메모리로 사용되므로 텍스쳐 룩업은 메모리 읽기로 사용된다. 이 덕분으로 어떤 연산은 GPU에 의해 자동으로 이루어진다.
커널(Kernels)
커널은 반복문의 본체라고 생각할 수 있다. 예를 들어 만일 프로그래머가 CPU로 격자행렬을 다룬다면 그 코드는 다음과 비슷할 것이다:
// 입출력 격자는 각각 10000 x 10000 또는 백만 요소를 가지고 있다.
void transform_10k_by_10k_grid(float in[10000][10000], float out[10000][10000])
{
for(int x = 0; x < 10000; x++)
{
for(int y = 0; y < 10000; y++)
{ // 다음 행이 100만번 실행된다
out[x][y] = do_some_hard_work( in[x][y] );
}
}
}
GPU상에서 프로그래머가 지정하는 것은 반복문의 본체 부분(커널)과 반복문이 기하 처리할 데이터 뿐이다.
흐름 제어(Flow control)
순차 코드에서는 if-then-else문과 다양한 반복문으로 흐름을 제어하는 것이 가능하다. 최근에야 비로소 이러한 흐름 제어 구조가 GPU에 추가되었다. 조건부 쓰기는 일련의 더 간단한 명령을 쓰는 것으로 이루어질 수 있었지만, 반복문이나 조건부 분기는 불가능했다. 최근의 GPU는 분기를 허용하지만, 보통 성능상 손실을 감수해야 한다. 분기를 일반적으로 안쪽 반복문에서는 피해야 하는 것은 CPU나 GPU나 마찬가지이고, 다양한 기술, 즉, 정적 분기 해소(static branch resolution), 선계산(pre-computation), Z-cull로 하드웨어 지원이 없을 때 분기할 수 있다.
GPU 기법
변환(Map)
변환 연산은 주어진 함수(커널)를 스트림의 모든 요소에 적용한다. 간단한 예로 스트림의 모든 값에 어떤 상수를 곱하는 것이다. (밝기 조절) 변환 연산은 GPU상에서 간단히 구현된다. 프로그래머는 화면의 각 픽셀의 프래그먼트를 생성하고 각각에 프래그먼트 프로그램을 적용한다. 결과로 얻어지는 같은 크기의 스트림이 출력 버퍼에 저장된다.
감축(Reduce)
어떤 계산은 큰 흐름으로부터 작은 흐름(단 한개의 요소만 남을 수도 있다)을 계산해야 한다. 이를 흐름의 감축이라 부른다. 일반적으로 감축은 여러 단계로 이루어질 수 있다. 이전 단계의 결과가 이번 단계의 입력으로 사용되고, 연산이 적용되는 범위가 흐름 요소 하나만 남을 때 까지 반복된다.
흐름 필터링(Stream Filtering)
흐름 필터링은 본질적으로 불균일 감축이다. 필터링은 어떤 기준에 따라 흐름에서 일부 요소를 제거하는 것이다.
흩뿌리기(Scatter)
흩뿌리기 연산은 꼭지점 처리에서 가장 자연스럽게 정의된다. 꼭지점 처리는 꼭지점의 위치를 조정할 수 있어서 프로그래머가 정보를 격자의 어디에 예치하는지 제어할 수 있게 해 준다. 다른 확장도 가능한데, 예를 들어 꼭지점이 영향을 미치는 영역의 크기를 제어하는 것이다. 프래그먼트 처리기는 직접 뿌리기 연산을 수행할 수 없는데, 그 까닭은 격자상에서 각 프래그먼트의 위치는 프래그먼트가 생성될 때 고정되어 프로그래머가 변경할 수 없기 때문이다. 그러나 논리적 흩뿌리기 연산은 추가적인 수집 단계로 때때로 재투사 또는 구현될 수 있다. 흩뿌리기를 구현하려면 먼저 출력값과 출력 주소 모두를 송출해야 한다. 그 직후의 수집 연산은 주소 비교를 통해 출력 값이 현재의 출력칸에 맞아떨어지는지 확인한다.
수집(Gather)
프래그먼트 처리기는 텍스쳐를 임의 방식으로 읽을 수도 있어서 단수/복수의 어떤 격자 칸으로부터도 원하는 대로 정보를 모을 수 있다.
정렬(Sort)
정렬 연산은 순서 없이 뒤섞인 요소 집합을 순서에 따라 정렬된 요소의 집합으로 변환한다. 가장 일반적은 GPU 구현은 정렬망을 이용하는 것이다.
탐색(Search)
탐색 연산으로 프로그래머는 흐름 안의 특정 요소 또는 특정 요소의 이웃 요소를 찾을 수 있다. GPU는 한 요소를 찾는 속도를 올리기 위해 사용되지는 않지만 대신 여러 탐색을 병렬로 실행하는 데 사용된다.
자료 구조(Data Structure)
다양한 자료 구조가 GPU상에서 표현될 수 있다:
- 고밀도(Dense) 배열
- 저밀도(Sparse) 배열 - 정적, 또는 동적
- 적응(Adaptive) 구조
<자료출처 : 위키>
'IT > Parallel' 카테고리의 다른 글
| CUDA 오류 검사 함수 (0) | 2010/01/08 |
|---|---|
| CUDA 개발 환경 설정하기 #2. Visual Studio 환경 설정 (0) | 2010/01/02 |
| CUDA 개발 환경 설정하기 #1. CUDA driver, toolkit, SDK 설치 (0) | 2009/12/26 |
| GPU 프로그래밍의 시작, CUDA (0) | 2009/12/22 |
| GPGPU ; General-Purpose computing on GPU (0) | 2009/12/21 |
