NVIDIA GPU 상에서의 난수 생성을 위한 CUDA...

7
ISSN 2383-630X(Print) / ISSN 2383-6296(Online) Journal of KIISE, Vol. 42, No. 12, pp. 1467-1473, 2015. 12 http://dx.doi.org/10.5626/JOK.2015.42.12.1467 †† 정 회 원 학생회원 : : 강릉원주대학교 컴퓨터공학과 교수 (Gangneung-Wonju Nat'l Univ.) [email protected] (Corresponding author) 강릉원주대학교 컴퓨터공학과 [email protected] 논문접수 : 201576(Received 6 July 2015) 논문수정 : 2015913(Revised 13 September 2015) 심사완료 : 2015917(Accepted 17 September 2015) Copyright2015 한국정보과학회ː개인 목적이나 교육 목적인 경우, 이 저 작물의 전체 또는 일부에 대한 복사본 혹은 디지털 사본의 제작을 허가합니다. 이 때, 사본은 상업적 수단으로 사용할 수 없으며 첫 페이지에 본 문구와 출처 를 반드시 명시해야 합니다. 이 외의 목적으로 복제, 배포, 출판, 전송 등 모든 유형의 사용행위를 하는 경우에 대하여는 사전에 허가를 얻고 비용을 지불해 야 합니다. 정보과학회논문지 제42권 제12(2015. 12) NVIDIA GPU 상에서의 난수 생성을 위한 CUDA 병렬프로그램 (Efficient Parallel CUDA Random Number Generator on NVIDIA GPUs) 김영태 황규현 †† (Youngtae Kim) (Gyuhyeon Hwang) 본 논문에서는 고성능 병렬 계산 장치로 주목받고 있는 GPU에서의 선형 합동 방식(linear congruential)의 병렬 난수 생성 프로그램을 구현하였다. 난수는 임의성을 필요로 하는 모든 분야에서 중요 하게 사용되며, 선형 합동 난수 방식은 컴퓨터 계산을 통하여 생성되는 의사 난수(pseudo random numbers) 생성 방식 중에 가장 많이 사용되는 방식이다. 본 논문에서는 NVIDIA CUDA 프로그래밍 모델을 사용하여 구현된 프로그램 및 MPI를 사용한 다중 GPU를 구동하는 병렬프로그램을 설명하고, 생성된 난수들의 임의 성과 성능을 알아보았다. 또한 원주율( )을 계산하기 위한 몬테카를로 알고리즘을 사용하여 CUDA 라이브 러리 함수인 cuRAND와 성능을 비교하였으며, 다수의 GPU를 동시에 계산한 성능의 변화도 알아보았다. 키워드: 난수, 선형 합동 생성, CUDA, GPU, MPI Abstract In this paper, we implemented a parallel random number generation program on GPU's, which are known for high performance computing, using LCG (Linear Congruential Generator). Random numbers are important in all fields requiring the use of randomness, and LCG is one of the most widely used methods for the generation of pseudo-random numbers. We explained the parallel program using the NVIDIA CUDA model and MPI(Message Passing Interface) and showed uniform distribution and performance results. We also used a Monte Carlo algorithm to calculate pi( ) com- paring the parallel random number generator with cuRAND, which is a CUDA library function, and showed that our program is much more efficient. Finally we compared performance results using multi-GPU’s with those of ideal speedups. Keywords: random number, linear congruential generator, CUDA, GPU, MPI 1. 서 론 난수(random numbers)는 규칙 없이 임의로 선택된 숫자를 말하며, 확률적 알고리즘에 바탕을 두는 수학적 계산 등에 많이 사용된다. 컴퓨터에서의 계산에 의하여 만들어지는 난수를 의사 난수(pseudo-random numbers) 라 부르며, 의사 난수의 생성은 특정한 공식과 값을 사 용하여 난수와 유사하게 만들어낸다. 이러한 의사 난수 는 계산된 수열이기 때문에 계산식에 따라 특정한 주기 를 가진다. 특히 주기가 길면 의사 난수는 예측하기 어 렵게 되어 실질적인 난수라 가정할 수 있다. 또한 의사 난수는 주기 내에서 연속적으로 발생하는 난수의 확률 분포가 균일한 특징을 가지고 있다[1]. 의사 난수(이하 난수) 생성 프로그램에서는 초기값 (seed)과 특정한 공식을 사용하여 난수를 계산하며 계

Transcript of NVIDIA GPU 상에서의 난수 생성을 위한 CUDA...

Page 1: NVIDIA GPU 상에서의 난수 생성을 위한 CUDA 병렬프로그램kiise.or.kr/e_journal/2015/12/JOK/pdf/01.pdf · 등의 대표적인 병렬프로그래밍 방식으로 구현이

ISSN 2383-630X(Print) / ISSN 2383-6296(Online)

Journal of KIISE, Vol. 42, No. 12, pp. 1467-1473, 2015. 12

http://dx.doi.org/10.5626/JOK.2015.42.12.1467

††

정 회 원

학생회원

:

:

강릉원주 학교 컴퓨터공학과 교수

(Gangneung-Wonju Nat'l Univ.)

[email protected]

(Corresponding author임)

강릉원주 학교 컴퓨터공학과

[email protected]

논문 수 : 2015년 7월 6일

(Received 6 July 2015)

논문수정 : 2015년 9월 13일

(Revised 13 September 2015)

심사완료 : 2015년 9월 17일

(Accepted 17 September 2015)

CopyrightⒸ2015 한국정보과학회ː개인 목 이나 교육 목 인 경우, 이

작물의 체 는 일부에 한 복사본 혹은 디지털 사본의 제작을 허가합니다.

이 때, 사본은 상업 수단으로 사용할 수 없으며 첫 페이지에 본 문구와 출처

를 반드시 명시해야 합니다. 이 외의 목 으로 복제, 배포, 출 , 송 등 모든

유형의 사용행 를 하는 경우에 하여는 사 에 허가를 얻고 비용을 지불해

야 합니다.

정보과학회논문지 제42권 제12호(2015. 12)

NVIDIA GPU 상에서의 난수 생성을 한 CUDA 병렬 로그램

(Efficient Parallel CUDA Random Number

Generator on NVIDIA GPUs)

김 태† 황 규

††

(Youngtae Kim) (Gyuhyeon Hwang)

요 약 본 논문에서는 고성능 병렬 계산 장치로 주목받고 있는 GPU에서의 선형 합동 방식(linear

congruential)의 병렬 난수 생성 로그램을 구 하 다. 난수는 임의성을 필요로 하는 모든 분야에서 요

하게 사용되며, 선형 합동 난수 방식은 컴퓨터 계산을 통하여 생성되는 의사 난수(pseudo random numbers)

생성 방식 에 가장 많이 사용되는 방식이다. 본 논문에서는 NVIDIA CUDA 로그래 모델을 사용하여

구 된 로그램 MPI를 사용한 다 GPU를 구동하는 병렬 로그램을 설명하고, 생성된 난수들의 임의

성과 성능을 알아보았다. 한 원주율()을 계산하기 한 몬테카를로 알고리즘을 사용하여 CUDA 라이

러리 함수인 cuRAND와 성능을 비교하 으며, 다수의 GPU를 동시에 계산한 성능의 변화도 알아보았다.

키워드: 난수, 선형 합동 생성, CUDA, GPU, MPI

Abstract In this paper, we implemented a parallel random number generation program on GPU's,

which are known for high performance computing, using LCG (Linear Congruential Generator).

Random numbers are important in all fields requiring the use of randomness, and LCG is one of the

most widely used methods for the generation of pseudo-random numbers. We explained the parallel

program using the NVIDIA CUDA model and MPI(Message Passing Interface) and showed uniform

distribution and performance results. We also used a Monte Carlo algorithm to calculate pi() com-

paring the parallel random number generator with cuRAND, which is a CUDA library function, and

showed that our program is much more efficient. Finally we compared performance results using

multi-GPU’s with those of ideal speedups.

Keywords: random number, linear congruential generator, CUDA, GPU, MPI

1. 서 론

난수(random numbers)는 규칙 없이 임의로 선택된

숫자를 말하며, 확률 알고리즘에 바탕을 두는 수학

계산 등에 많이 사용된다. 컴퓨터에서의 계산에 의하여

만들어지는 난수를 의사 난수(pseudo-random numbers)

라 부르며, 의사 난수의 생성은 특정한 공식과 값을 사

용하여 난수와 유사하게 만들어낸다. 이러한 의사 난수

는 계산된 수열이기 때문에 계산식에 따라 특정한 주기

를 가진다. 특히 주기가 길면 의사 난수는 측하기 어

렵게 되어 실질 인 난수라 가정할 수 있다. 한 의사

난수는 주기 내에서 연속 으로 발생하는 난수의 확률

분포가 균일한 특징을 가지고 있다[1].

의사 난수(이하 난수) 생성 로그램에서는 기값

(seed)과 특정한 공식을 사용하여 난수를 계산하며 계

Page 2: NVIDIA GPU 상에서의 난수 생성을 위한 CUDA 병렬프로그램kiise.or.kr/e_journal/2015/12/JOK/pdf/01.pdf · 등의 대표적인 병렬프로그래밍 방식으로 구현이

1468 정보과학회논문지 제42권 제12호(2015. 12)

산된 난수를 다시 seed로 사용하여 다음 난수를 순차

으로 계산한다. 이러한 난수 생성 로그램에서 일반

으로 많이 사용되는 알고리즘으로는 선형 합동 생성기

(Linear Congruential Generator)가 있으며, 이 외에도

Mersenne Twister, Linear Feedback Shift Register

방식 등이 있다[2,3]. 난수를 계산하는 난수 생성 로그

램은 분포가 균일한 많은 수의 난수를 발생할수록 결과

가 정확해진다. 따라서 보다 정확한 계산 결과를 얻기

해서는 빠른 시간에 많은 난수를 발생시킬 수 있는

효율 인 병렬 로그램이 필요하게 된다.

GPU(Graphic Processing Unit)는 원래 그래픽 화면

을 제어하기 한 장치로서 CPU와 다르게 수십 는 수

백 개의 계산 유닛을 가지고 있으며 유닛들은 2차원의

배열 구조를 가지고 있다[4]. 계산 용 GPU를 GP-GPU

(General Purposed GPU)라고도 부르며 GPU 내 각각

의 계산 유닛들은 계산 단 인 쓰 드로 사용되기 때문

에 로그램에서 유닛을 병렬로 동시에 사용하면 CPU

로그램에 비해 뛰어난 계산 성능을 낼 수 있다.

GPU를 사용하여 난수를 생성하는 로그램의 연구는

활발히 진행되고 있다. [3]에서는 Linear Feedback Shift

Register 방식을 변형하여 구 하 고, [4]에서는 CUDA

SDK를 사용하여 각 쓰 드에서 난수를 발생하 으며,

[5]에서는 여러 방식으로 난수 발생 로그램을 구 하

다. 본 논문에서는 선형 합동 난수 생성 로그램을

NVIDIA GPU 상에서 계산하기 한 로그램을 NVIDIA

CUDA(Computer Unified Device Architecture)[6]를

사용하여 구 하 으며 MPI(Message Passing Inter-

face)[7]를 사용하여 다 GPU를 구동할 수 있는 병렬

로그램을 구 하 다. 본 논문에서는 병렬 난수 생성

로그램을 통하여 생성된 난수의 임의성과 로그램의

성능을 알아보았으며 몬테카를로 알고리즘을 사용하여

CUDA 라이 러리 함수인 cuRAND의 성능과 비교하

다. 한 한 개 이상의 GPU를 사용하는 병렬 로그램을

사용하여 다 GPU에서의 성능을 분석하 다.

본 논문의 2장에서는 GPU에서 난수를 생성하는 병렬

로그램을 설명하고 3장에서는 난수의 임의성과 로

그램의 성능을 분석하 다. 마지막으로 4장에서는 결론

으로 맺는다.

2. 병렬 난수 발생 로그램의 구

이 장에서는 NVIDIA GPU의 CUDA 계산 환경에서

난수를 병렬로 계산하는 방식 다 GPU용 병렬 로

그램에 하여 설명한다.

2.1 GPU와 CUDA 계산 환경

NVIDIA GPU 계산을 한 CUDA 환경은 여러 쓰

드가 하나의 명령어를 통하여 동시에 병렬로 데이터를

그림 1 그리드(도메인)과 쓰 드 블록(서 도메인)

Fig. 1 Grid(domain) and thread blocks(sub-domain)

처리하는 SIMT(Single Instruction Multiple Threads)

방식이다[8]. GPU는 계산 도메인(그리드)을 기본 계산

장치인 쓰 드들의 격자(쓰 드 블록)로 나 고, 나 어

진 그리드의 해당 부분을 하나의 쓰 드 블록이 동시에

병렬로 계산하는 형태이다. 그림 1은 그리드와 쓰 드

블록의 계의 를 보여 주는데 체 도메인(16×16)

음 으로 표 된 서 도메인을 쓰 드로 이루어진

4×4 블록이 동시에 물리 으로 병렬 계산하며, 체 도

메인은 이러한 블록들이 순차 으로 반복하여 계산하지

만 반복문이 없는 논리 병렬 계산 방식이다. 따라서

이 경우에는 체 계산 성능은 쓰 드 하나의 계산 시

간 비 쓰 드 블록의 크기인 16배의 계산 성능을 보

이게 된다.

CUDA는 선언된 도메인의 크기, 쓰 드 블록의 크기

와 인덱스, 그리고 쓰 드의 인덱스 값 등을 시스템 변

수로서 제공한다. 따라서 이 변수들을 선언하여 체 데

이터 도메인의 크기 병렬로 동시에 계산하는 서 도

메인을 한 쓰 드 블록의 크기를 정한다. 다음 로그

램은 2차원 구조의 쓰 드 블록을 사용한 GPU 호출 함

수의 기본 인 형태이다. 호출 함수에서 쓰 드 블록의

크기와 그리드의 크기를 변수 dimBlock와 dimGrid를

사용하여 정하고 CUDA 함수를 호출하면 CUDA에서

제공하는 시스템 변수인 blockDim, blockIdx와 thread-

Idx를 통하여 함수에 값이 달된다. 로그램에서

blockDim은 P×Q이고 blockIdx는 (0,0), (0,1), (0,2), ...,

((M-1)/(P-1)),((N-1)/(Q-1)), threadIdx는 (0,0), (0,1),

(0,2), ..., ((P-1),(Q-1))를 나타낸다(여기에서 M은 P로,

N은 Q로 각각 나 어진다고 가정한다). 그러므로 로

그램에서 이 변수들을 사용하여 계산되는 인덱스 i와 j

는 (0,0), (0,1), (0,2), ..., ((M-1),(N-1))로서 도메인에서

의 각 격자의 치를 나타내게 된다. 여기에서 쓰 드

계산을 한 반복문은 논리 인 병렬 계산으로 진행되

기 때문에 순차 으로 계산됨에도 불구하고 로그램에

Page 3: NVIDIA GPU 상에서의 난수 생성을 위한 CUDA 병렬프로그램kiise.or.kr/e_journal/2015/12/JOK/pdf/01.pdf · 등의 대표적인 병렬프로그래밍 방식으로 구현이

NVIDIA GPU 상에서의 난수 생성을 한 CUDA 병렬 로그램 1469

(a) mod (b) × mod

그림 2 난수 도메인의 계산 순서

Fig. 2 Calculation sequence of data domain for random numbers

서는 존재하지 않게 된다.

호출함수:

dim3 dimBlock(P, Q);

dim3 dimGrid((M, N);

...

srand_gpu<<<dimGrid, dimBlock>>>(..);

피호출 CUDA 함수:

__global__ void srand_gpu(...)

{

int i = blockDim.x*blockIdx.x+threadIdx.x;

int j = blockDim.y*blockIdx.y+threadIdx.y;

...

2.2 난수의 병렬 계산

난수의 계산에 사용한 알고리즘은 선형 합동 생성 방

식을 사용하 으며 다음과 같이 seed를 사용하여 최

의 값을 계산하고, 이후에는 이 의 값을 사용하여 다음

난수 값을 계산하는 형 인 순차 계산 방식이다[9].

× mod

mod ( ≥ , a, c, m은 난수 생

성을 한 임의의 상수)

GPU에서는 병렬 계산의 효율을 높이기 하여 난수

의 데이터 도메인을 사용하여 동시에 계산하여야 한다.

이를 하여 본 논문에서는 다음과 같이 a와 c를 사용

하여 해당 난수로부터 (M×N)번째 다음 난수 계산을

한 상수인 A와 C를 계산한 후 이를 사용하여 병렬

로 난수 데이터 도메인을 계산한다[10].

× mod (× 은 데이터 도메인의 크기)

× mod

× mod ( ≥ )

난수 계산을 순차 으로 하기 한 상수 a와 c, 병렬

로 하기 한 상수 A와 C의 계는 그림 2와 같다.

그림 2의 (a) 도메인에서 화살표는 난수를 계산하기 한

순차 인 순서를 나타내며 (b)에서는 데이터 도메인을

병렬로 동시에 계산하는 순서를 나타낸다.

구 한 알고리즘은 다음과 같다. (i)와 (ii)는 최 에

한 번 계산이 필요하며 (iii)은 필요한 만큼 반복하면 된

다. 상수 a와 c는 [11,12]에서의 상수를 사용하 다.

(i) seed를 사용한 최 의 난수 도메인 계산

(ii) a와 c를 사용하여 도메인의 크기만큼의 다음 난

수를 계산하기 한 새로운 A와 C 계산

(iii) 필요한 난수 도메인의 동시 계산

각 단계의 CUDA 로그램은 다음과 같이 구 된다.

ran(M,N)(=RAN)은 병렬로 계산하는 하는 난수 데이터

도메인이다. (i)과 (ii)는 순차 으로 계산되기 때문에 기

도메인 ran(M,N)과 해당 변수 A, C를 CPU에서 계산

하여 GPU 메모리로 복사해서 사용하면 성능이 더 효율

일 수도 있다.

(i) ran(0,0) = seed;

a = 1103515245; c = 12345;

next = ran(0,0);

for (j=0; j<=N; j++)

for (ii=0; i<=M; i++) {

ran(i,j) = next;

next = a * next + c;

}

(ii) A = 1; C = 0;

for (k=0; k<M*N; k++) {

C = (a * C + c);

A = (a * A);

}

(iii) RAN = A * RAN + C; // 병렬 계산

Page 4: NVIDIA GPU 상에서의 난수 생성을 위한 CUDA 병렬프로그램kiise.or.kr/e_journal/2015/12/JOK/pdf/01.pdf · 등의 대표적인 병렬프로그래밍 방식으로 구현이

1470 정보과학회논문지 제42권 제12호(2015. 12)

그림 3 병렬 로그램에서 다 GPU의 쓰 드 블록

Fig. 3 Thread blocks of multiple GPU’s for parallel algorithm

2.3 다 GPU를 한 병렬 로그램

한 개 이상의 GPU는 컴퓨터에서 독립 인 로세서

혹은 쓰 드에 의하여 제어가 된다. 따라서 MPI와 OpenMP

등의 표 인 병렬 로그래 방식으로 구 이 될 수

있다. 본 논문에서는 다른 각각 컴퓨터에 설치되어 있는

GPU에서 동시에 계산하기 하여 MPI 방식을 사용하

여 병렬 로그램을 구 하 다.

구 된 로그램에서의 쓰 드 블록의 구성은 그림 3

과 같다. 그림의 경우에는 4개의 GPU가 MPI의 다른

로세스에 의하여 제어가 된다. GPU0은 알고리즘에

서의 (i)과 같이 기 도메인을 계산하고 선 화살표와

같이 GPU1은 GPU0 쓰 드 블록에서의 가장 마지막 쓰

드값(ran(M-1,N-1))을 ran(0,0)에 달받아서 난수의

기 도메인을 계산하고 GPU2과 GPU3도 같은 방식으

로 계산한다. 이 때 MPI 통신을 사용하여 값은 달 받

는 신에 각 도메인이 기 도메인을 계산할 수

도 있다. 모든 GPU에서 난수 기 도메인을 계산하면

그림에서의 굵은 화살표와 같이 병렬로 동시에 난수를

계산한다.

3. 성능 평가

이 장에서는 GPU를 사용한 병렬 난수 계산의 임의성

과 성능에 하여 분석하고 CUDA 라이 러리 함수인

cuRAND와 성능을 비교하 다. 한 다 GPU에서의

성능도 알아보았다.

3.1 난수의 분포 성능

난수 분포의 임의성은 가장 요한 요소이며 이를 테

스트하기 한 여러 기법들이 있다[13]. 본 논문에서는

GPU에서 병렬로 생성한 난수의 임의성을 보이기 하

여 생성된 난수들을 x-축과 y-축에 -1과 1사이의 좌표

로 변환하여 확률변수의 분포를 나타내는 확률 도로

나타내었다[3]. 그림 4의 (a)는 아래 식과 같은 2차 가

우시안 함수를 이용하여 나타낸 3차원 정규분포이고, 오

른쪽 그림 (b)는 로그램에서 생성된 100×212개의 난수

를 사용하여 3차원 정규분포를 나타낸 결과이다.

( )

그림 4에서와 같이 가우시안 함수를 사용하여 나타낸

그림과 비교하여 GPU상에서 병렬로 생성된 난수가 임

의성을 가지는 것을 알 수 있다.

그림 5는 난수의 발생을 NVIDIA Tesla C1060을 사

용하여 계산한 시간을 Intel Zeon E5405 CPU에서의 계

산 시간과 비교하 다. NVIDIA Tesla C1060 GPU는

512개의 코어(각 코어의 성능은 1.3GHz)로 구성이 되어

있으며, Intel Zeon E5405 CPU의 성능은 2.0GHz이다.

그림에서는 발생한 난수의 개수를 10×210부터 50×210까

지 증가하며 계산한 시간을 비교하 는데 GPU에서 병

렬로 계산된 난수의 성능은 한 개의 CPU를 사용한 순

차 로그램과 비교하여 1,000배 이상의 뛰어난 속도의

개선을 보인다. 그림 5의 오른쪽 그래 는 왼쪽에서의

GPU 계산 시간만을 확 하여 보여 다. 한 두 로세

서에서 계산된 난수들은 동일한 값을 보 다.

3.2 몬테카를로 응용 로그램을 이용한 원주율() 계산

3.2.1 몬테카를로 알고리즘

CUDA 라이 러리 함수인 cuRAND와 성능을 비교

하고 병렬로 발생한 난수를 실제 로그램에서 응용하

기 하여 난수를 사용하는 표 인 알고리즘의 하나

인 몬테카를로 알고리즘[10,14]을 사용하 다. 한편 GPU

를 사용하여 몬테카를로 알고리즘을 용한 유사한 연

구들이 수행되어 오고 있다[15].

Page 5: NVIDIA GPU 상에서의 난수 생성을 위한 CUDA 병렬프로그램kiise.or.kr/e_journal/2015/12/JOK/pdf/01.pdf · 등의 대표적인 병렬프로그래밍 방식으로 구현이

NVIDIA GPU 상에서의 난수 생성을 한 CUDA 병렬 로그램 1471

(a) Using Gaussian function (b) Using generated random numbers

그림 4 난수의 2차원 분포

Fig. 4 Distribution of 2D random numbers

그림 5 인텔 Zeon CPU와의 병렬 계산 시간 비교

Fig. 5 Parallel computing time compared with Intel Zeon CPU

그림 6 인텔 몬테카를로 알고리즘을 사용한 계산

Fig. 6 Monte Carlo algorithm for π calculation

일반 으로 원주율은 tan-1(x)의 정의를 이용하여 계

산한다[16]. 본 논문에서는 몬테카를로 알고리즘에서의

확률을 이용하여 원주율을 계산하며, 계산 결과와 실제

값을 비교하면 난수 분포의 효율성을 알 수 있다.

그림 6은 크기가 1×1인 정사각형에서 난수를 이용한

들을 생성하여 그 이 반지름이 1인 원안에 들어갈

확률을 이용한 원주율의 계산을 보여 다. 그림은 실제

생성된 100×212개의 난수들의 분포를 보여 다.

3.2.2 병렬 난수의 용

확률을 계산하는 알고리즘은 다음과 같다.

(i) 0~1사이의 값을 가지고 있는 x, y를 구한다.

(ii) 원 (0, 0)과 (x, y)의 거리가 1보다 작은지를

확인한다.

(iii) 이 과정을 필요한 만큼 반복하며 원안에 있는

들의 수를 계산한다.

(iv) 마지막으로 원안에 있는 들의 개수를 체

의 개수로 나 다.

이와 같은 방법으로 계산된 결과는 /4 값이기 때문에

결과의 4배를 하면 값에 근사한 값이 나온다.

Page 6: NVIDIA GPU 상에서의 난수 생성을 위한 CUDA 병렬프로그램kiise.or.kr/e_journal/2015/12/JOK/pdf/01.pdf · 등의 대표적인 병렬프로그래밍 방식으로 구현이

1472 정보과학회논문지 제42권 제12호(2015. 12)

(a) Numerical error (b) Computation time

그림 7 계산을 한 cuRAND와의 시간 비교

Fig. 7 Comparison with cuRAND for calculation of

알고리즘을 CUDA 로그램으로 구 하면 다음과

같다. 로그램에서 sqrs(a, b) 함수는 a2+b2를 계산하며,

변수 reduce는 쓰 드에 분포한 들의 개수를 parallel

prefix sum 방식[17]으로 계산하기 한 공유메모리 변

수이다.

ran_x(i,j) = seed_x;

ran_y(i,j) = seed_y;

for(k=0; k<i*M+j); k++) {

ran_x(i,j) = a * ran_x(i,j) +c;

ran_y(i,j) = a * ran_y(i,j) +c;

}

...

ti = threadIdx.x;

tj = threadIdx.y;

...

if(sqrs(ran_x(i,j), ran_y(i,j)) <= 1.0) reduce(ti,tj) = 1;

else reduce(ti,tj) = 0;

for(s=blockDim.x*blocDim.y/2; s>0; s>>=1) {

if((i*blockDim.y+j) < s) reduce(ti,tj) +=

reduce_s(ti,tj,s);

}

if((ti==0)&&(tj==0)) count(blockIdx.x,blockIdx.y)

= reduce(0,0);

...

for(i=0; i<dimGrid.x*dimGrid.y; i++) pi_count +=

count[i];

pi = (pi_count / (M * N)) * 4.0;

3.2.3 성능 분석

그림 7은 본 논문에서 구 한 로그램과 CUDA 라

이 러리의 cuRAND[18]를 사용하여 비교 측정한 결과

이고, 결과 값은 16×1020개의 난수를 사용했을 때 0.00025%

미만의 오차율을 보이고 많은 난수를 사용할수록 오차

율이 낮아지며, cuRAND 함수보다 오차 값이 은 것

을 볼 수 있다(그림 (a) 참고). 한편 cuRAND에서 특히

256M개의 난수를 사용할 경우 오차 값이 더 좋은 이유

는 cuRAND의 난수 분포가 나은 임의성을 갖기 때문으

로 보인다. 그림 (b)는 두 로그램의 계산 시간을 비교

하 다. 계산 시간의 성능에서도 본 논문에서 구 한 난

수 로그램이 cuRAND보다 뛰어나다는 것을 보여 다.

그림 8은 MPI 병렬 로그램을 사용하여 GPU 수의

증가에 따른 이상 인 계산 시간과 실제로 측정된 계산

시간을 나타낸 그림이다. 성능 분석을 하여 생성된 난

수의 수는 230개이며, GPU의 수를 4개까지 증가시켜 이

상 인 계산 시간과 비교한 결과이다. 이상 인 시간은

GPU 한 개를 사용하여 계산하는 시간을 기 으로 하여

상 으로 계산 했으며 측정 결과 이상 인 계산 시간

보다 더 좋은 계산 시간을 보 는데 이는 한 개의 GPU

를 사용할 때보다 기 난수 도메인을 계산하는 시간이

상 으로 게 걸리기 때문이다.

4. 결 론

본 논문에서는 의사 난수 생성기 선형 합동 생성

기의 성능 향상을 하여 NVIDIA GPU를 사용하는

CUDA 계산 환경에서 병렬 로그램을 구 하 다. CUDA

계산 환경에서는 기존의 CPU에서의 계산 방법과 다르

게 많은 수의 계산 유닛을 사용하여 병렬 계산을 진행

한다. 이는 다음 결과를 계산하기 해 이 계산 값을

사용해야 하는 선형 합동 방식의 순차 인 특성에 따라

병렬 방식의 어려움이 있기 때문에 본 논문에서는 병렬

로 계산하기 한 방법을 제안하 다. 병렬 로그램에서

계산된 난수의 임의성(분포가 균등한지의 여부)을 보이

기 하여 2차 가우시안 함수를 사용하고, 3차원 정규분

포를 나타내어 임의성을 확인하 다. 한 GPU를 사용

Page 7: NVIDIA GPU 상에서의 난수 생성을 위한 CUDA 병렬프로그램kiise.or.kr/e_journal/2015/12/JOK/pdf/01.pdf · 등의 대표적인 병렬프로그래밍 방식으로 구현이

NVIDIA GPU 상에서의 난수 생성을 한 CUDA 병렬 로그램 1473

그림 8 다 GPU를 사용한 이상 인 계산 시간과의 비교

Fig. 8 Comparison with ideal time using different numbers

of GPU's

한 난수의 병렬계산 시간을 CPU를 사용한 계산 시간과

비교하고 발생하는 난수의 수를 증가시켜 난수의 병렬계

산 로그램의 성능을 보 다. 실행 결과 GPU와 CPU를

사용하여 계산된 난수의 값들은 동일하며 GPU를 사용한

결과 1,000배 이상의 빠른 계산 시간을 보 다. 난수의 임

의성을 가질 경우에는 난수의 수가 많을수록 난수를 사용

한 응용 로그램의 결과가 정확해지며 따라서 본 논문에

서의 난수 발생 병렬 로그램은 유용하게 사용될 수 있다.

한 본 논문에서 제시한 방법으로 병렬 계산한 난수

를 응용하기 해 몬테카를로 알고리즘을 사용하여 값

을 계산하며 성능을 보았다. 성능의 비교를 해 CUDA

라이 러리에서 제공하는 난수 생성 함수인 cuRAND와

비교하 다. 비교 결과 본 논문에서 제시한 방법이 최

2.5배 정도 더 빠른 계산 시간을 보 다. 다 GPU에서

의 성능을 알아보기 하여 GPU의 수를 증가시켜 계산

한 결과 GPU의 수가 증가할수록 계산 시간이 GPU의

수보다 더 감소하는 모습을 보 다.

References

[ 1 ] A. Sheldon, A first course in probability, Pearson

Education India, 2002.

[ 2 ] C. Dutang, and D Wuertz, A note on random number

generation, 2009.

[ 3 ] S. Mohanty, A. K. Mohanty, and F. Carminati,

"Efficient pseudo-random number generation for

monte-carlo simulations using graphic processors,"

Journal of Physics: Conference Series. IOP Publi-

shing, Vol. 368, No. 1, 2012.

[ 4 ] W. B. Langdon, "A fast high quality pseudo random

number generator for NVIDIA CUDA," Proc. of the

11th Annual Conference Companion on Genetic and

Evolutionary Computation Conference: Late Brea-

king Papers. ACM, 2009.

[ 5 ] M. Manssen, M. Weigel, and A. K. Hartmann1,

"Random number generators for massively parallel

simulations on GPU," The European Physical Jour-

nal Special Topics, Vol. 210, No. 1, pp. 53-71, 2012.

[ 6 ] D. Kirk, "NVIDIA CUDA software and GPU

parallel computing architecture," ISMM, Vol. 7, 2007.

[ 7 ] P. S. Pacheco, Parallel Programming with MPI,

Morgan Kaufmann, 2001.

[ 8 ] NVIDIA, CUDA, Compute United Device Archi-

tecture Reference Manual Version 5.0, NVIDIA

Corporation, 2012.

[ 9 ] D. E. Knuth, The Art of Computer Programming

Volume 2 (3rd ed.): Seminumerical Algorithms,

Addison-Wesley, Boston, MA, 1997.

[10] G. Fox, M. Johnson, G. Lyzenga, S. Otto, J.

Salmon, and D. Walker, Solving Problems on con-

current Processors Vol. 1, Prentice Hall, Engle-

wood Cliffs, NJ, 1988.

[11] B. Kernighan, and D. Ritchie, The C Programming

Language: 2nd Edition, Prentice Hall Software Series

Englewood Cliffs, 1998.

[12] B. Gough, GNU scientific library reference manual,

Network Theory Ltd., 2009.

[13] J. H. Lim, S. H. Lee, and D. K. Kim, "New Ran-

domness Testing Methods using Approximate Periods,"

KIISE Transactions on Computing Practices (KTCP),

Vol. 16, No. 6, pp. 742-746, 2010. (in Korean)

[14] M. H. Kalos, and P. A. Whitlock, Monte Carlo

Methods, Wiley-VCH, 2nd edition, 2008.

[15] H. Lee, E. Im, "Parallelization of Path Integral

Monte Carlo Simulation on nVidia GPU," Proc. of

the Korean Information Science Society Conference,

Vol. 36, No. 1, pp. 322-326, 2009. (in Korean)

[16] M. Choi, S. Maeng, "Parallelized PI() Calculation

Algorithm using MPI," Proc. of the Korean Infor-

mation Science Society Conference, Vol. 31, No. 1,

pp. 91-93, 2004. (in Korean)

[17] T. H. Cormen, C. E. Leiserson, R. L. Rivest, and C.

Stein, Introduction to Algorithms, MIT Press, 2009.

[18] NVIDIA, CUDA CURAND Library, PG-05328-

032_V01 August, 2010.

김 태

1986년 연세 학교 수학과 학사. 1992년

미국 Iowa State Univ. M.S. 1996년 미

국 Iowa State Univ. Ph. D. 1998년~

재 강릉원주 학교 컴퓨터공학과 교수

황 규

2014년 강릉원주 학교 컴퓨터공학과 학

사. 2014년~ 재 강릉원주 학교 컴퓨

터공학과 석사과정