전체 글(25)
-
Synchronization
Race Condition 경쟁 상태 병렬 프로그램에서 Race condition (경쟁 상태)이 흔히 발생하는데 이는 여러 개의 스레드가 하나의 공유 메모리를 동시에 읽고 쓸 때 발생한다. 덧셈과 뺄셈같이 한 번에 이루어지는 계산은 아토믹 함수를 이용하고 더 넓은 범위의 코드는 크리티컬 섹션을 사용하여 경쟁 상태를 해결한다. 이 두 방법은 손쉬운 방법이지만 불필요하게 많이 사용하게 되면 오히려 프로그램의 효율이 떨어진다. //아래 코드 실행 시 10000*512개의 스레드가 실행되지만 Race condition(경쟁 상태) 발생으로 //결과로 더 적은 수가 출력됨. __global__ void ThreadCountDataRace(int* nThreadCount) { (*nThreadCount)++; }..
2022.12.12 -
Stream
CUDA 프로그램의 구조 1. 호스트에서 디바이스로 입력 데이터 전송 2. 커널 함수에서 데이터 처리 3. 결과 데이터를 디바이스에서 호스트로 전송 위 과정을 차례대로 처리하면 입력 데이터가 전송되는 시간동안 GPU 프로세서는 대기하게 된다. 만일 입력 데이터를 좀 더 작게 나누고 입력 데이터 전송이 완료된 것부터 GPU에서 계산을 하는 동시에 데이터를 전송하면 프로그램의 전체 효율이 좋아진다. 데이터 입력을 받으면서 GPU 프로세서가 함께 계산하며 동시성을 높여 주는 것이 CUDA의 스트림이다. 데이터 처리 과정을 여러 개로 나누어 데이터 입력 과정과 동시에 처리할 수 있도록 하려면 데이터의 의존성(Dependency)이 없어야 한다. 앞서 입력된 데이터의 결과가 뒤에 입력될 데이터에 사용되지 않아야 ..
2022.12.09 -
성능 측정
프로그램의 성능을 측정하기 위해 소요 시간을 계산하는 방법 1. 소요시간 측정 CPU 타이머 활용 (NVCC(CUDA compiler)가 Windows API를 간단하게 사용할 수 있는 환경이 아니므로 비추천) GPU 타이머 활용 //Measure the execution time of a program, unit : msec #include //CUDA utility tools unsigned int timer; cutCreateTimer(&timer); //Create a timer cutStartTimer(timer); //Start ... cutStopTimer(timer); //stop double elapsed_time = cutGetTimerValue(timer); CUDA 타이머 사용 시 ..
2022.12.07 -
CUDA API 함수
CUDA API 아키텍처 CUDA API는 3가지 그룹으로 이루어진다. CUDA Driver API CUDA Runtime API CUDA Libraries CUDA API의 세 그룹은 서로 통신을 하면서 GPU를 제어하여 CUDA 프로그램을 동작시킨다. CUDA API가 다루는 분야는 다음과 같다. 디바이스 관리 문맥 관리 메모리 관리 코드 모듈 관리 실행 제어 텍스처 관리 OpenGL과 Direct3D 상호 운용 CUDA 드라이버 API CUDA 드라이버 API는 가장 낮은 수준에 있는 API로, GPU를 직접 제어한다. 드라이버 API로 프로그램을 구현하면 더 많은 함수 호출과 관리가 필요하다. 드라이버 API는 디바이스를 제어하는 가장 낮은 수준의 명령어이기 때문에 가장 빠르게 OpenGL이나 D..
2022.12.01 -
정수 연산 SIMD 프로그래밍
XMM 레지스터 SIMD는 한 번에 여러개의 데이터를 연산. XMM 레지스터의 크기는 128-bit으로 32-bit 범용 레지스터 크기의 4배. XMM 레지스터의 개수는 총 8개로 XMM0~XMM7 사용 가능. 64-bit 컴퓨터 프로그래밍에서는 XMM15까지 총 16개 사용. 범용 데이터 레지스터 EAX : Accumulator EDX : Data ECX : Count EBX : Base ESI : Source Index Pointer EDI : Destination Index Pointer EBP : Base Pointer ESP : Stack Pointer SIMD에는 정수형, 실수형 두가지 병렬 연산 방식이 존재. P //P :'packed'를 의미하며 정수형 SIMD 명령어. 실수형 SIMD 명..
2022.11.26 -
SIMD Introduction
SIMD : Single Instruction Multiple Data 한번의 연산으로 여러 개의 데이터를 처리 Parallel program model SIMD (명령어 수준 병렬 프로그래밍 모델) Shared Memory Parallel Programming model - 멀티 스레드로 데이터 처리 (Multithreading, pthreads, OpenMP, CUDA...) Message passing Parallel Programming model - 여러개의 PC를 메시지로 통신하여 대용량의 데이터를 처리하는 것. 분산 컴퓨팅, 그리드 컴퓨팅과 같은 의미. (MPI, HPF, PVM...) Hybrid Model - 위 세가지 혼합하여 사용 SIMD 프로그램 구조 메모리 변수 Packing - ..
2022.11.26