More Related Content Similar to cuda포스터-박일남 (12) cuda포스터-박일남1. Parallel IR Vector model on NVIDIA GPU
박일남 pin0156@naver.com
배병걸 bazel1984@naver.com
Motivation
IR Vector model
ConclusionSolution #1 - mul
Kookmin University NLP lab
Solution #2 - sum
for(i=0; i<n-1; i++)
{
for(j=0; j<m; j++)
{
wij_x_wiq+= vector_table[i][j] * vector_table[n-1][j];
wij^2 += vector_table[i][j] * vector_table[i][j];
wiq^2 += vector_table[n-1][j] * vector_table[n-1][j];
}
sim[i] = wij_x_wiq / (sqrt(wij^2 ) * sqrt(wiq^2));
}
Grid
Block 0 Block 1 Block M
number of M block
Grid
Block 0 Block 1
512 thread 512 thread
blockIdx.x * 512 + threadIdx.x
= 0 * 512 + 0
= 0
blockIdx.x * 512 + threadIdx.x
= 1 * 512 + 0
= 512
0
500
1000
1500
2000
GPU CPU
0%
20%
40%
60%
80%
100%
GPU CPU
Document
vector size
CPU(msec) GPU(msec)
1000x10 0.195776 0.188000
2000x20 0.675520 0.308512
3000x30 1.663424 0.479520
4000x40 2.742592 0.612000
5000x50 4.309344 0.844480
6000x60 6.505952 1.028928
7000x70 9.120416 1.288864
8000x80 13.296700 1.398496
9000x90 14.064350 1.705152
10000x100 18.426880 1.852256
20000x200 73.406050 4.935264
30000x300 157.468600 12.655680
40000x400 285.985700 19.385120
50000x500 439.460900 32.910150
100000x1000 1757.020000 118.664400
Dj
Query
Inner
product
||||
),(
11
1
22
t
i
iq
t
i
ij
t
i
iqij
j
j
j
ww
ww
qd
qd
qdsim
t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11
D1 0 0 .477 0 .477 .176 0 0 0 .176 0
D2 0 .176 0 .477 0 0 0 0 .954 0 .176
D3 0 .176 0 0 0 .176 0 0 0 .176 .176
Q 0 0 0 0 0 .176 0 0 .477 0 .176
벡터 모델은 Cosine 연산
이다. 각 문서Dj와 Query의
모든 벡터간의 곱셈과 덧셈
이 필요한 연산으로 병렬처
리를 할 경우, 속도 향상이
예상된다.
1 … … … 1 1 … … … 1
0 … … … (n/2) -1 n/2 … … … n
Sum(n) … … … … … … … … 512
n = 256
n = 0
.
.
.
.
.
.
n = 512
n = 1
1 1 1 1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9
2 2 2 2 2 1 1 1 1 1
6 4 2 2 2 1 1 1 1 1
10 4 2 2 2 1 1 1 1 1
n = 5
n = 2
n = 1
n = 0
Solution #3 - CUDA Kernel
//벡터 내적
for(int i=0; i<D_NUMBER-1; i++)
{
if(idx < N)
d_arr_ip[i*N+idx] = d_arr[i*N+idx] * d_arr[(D_NUMBER-1)*N+idx];
}
__syncthreads();
//벡터 크기
for(int i=0; i<D_NUMBER; i++)
{
if(idx < N)
d_arr[i*N+idx] *= d_arr[i*N+idx];
}
__syncthreads();
//덧셈 연산
for(int i=0; i<D_NUMBER; i++)
{
//각 블럭당 lg 덧셈 계산
int n = B_SIZE/2;
for(; n>1;)
{
if(idx % B_SIZE < n && idx+n < N)
{
d_arr_ip[(i*N)+idx] += d_arr_ip[(i*N)+idx+n];
d_arr[(i*N)+idx] += d_arr[(i*N)+idx+n];
}
if(n%2!=0 && (idx % B_SIZE == 0)) //홀수일때
{
d_arr_ip[(i*N)+idx] += d_arr_ip[(i*N)+idx + n-1];
d_arr[(i*N)+idx] += d_arr[(i*N)+idx + n-1];
}
n /= 2;
__syncthreads();
}
if(idx % B_SIZE == 0)
{
d_arr_ip[(i*N)+idx] += d_arr_ip[(i*N)+idx+1];
d_arr[(i*N)+idx] += d_arr[(i*N)+idx+1];
}
__syncthreads();
}
제시한 곱셈과 덧셈방법을
NVIDIA GPU가 수행할 수 있
도록 CUDA Kernel 을 다음과
같이 작성하였다.
정보검색 분야에 있어서 vector model
은 여러부분에서 사용되는 기초적인 알
고리즘이다. 이러한 기초적인 알고리즘
을 실제 기업들의 경우 속도의 문제로
정확도가 떨어지는 다른 알고리즘으로
대체하고 있는 것이 현실이다. 그래서
이런 vector model의 속도 문제를
NVIDIA GPU의 병렬처리를 이용해 연산
시간을 단축하는 실험을 하였다.
그림 1. 문서 Dj와 Query간의 Vector model 유사도 식
표 1. Document vector
알고리즘 1. vector model algorithm for CPU
그림 3. 문서 Dj와 Query간의 병렬 곱셈 수행 idea
그림 2. 병렬처리를 위한 Grid 와 Block의 크기 제시 및 쓰레드당 index 주소 표현
idx = blockIdx.x * blockDim.x + threadIdx.x
그림 4. 덧셈 병렬 처리를 위한 idea
그림 5. block당 512 쓰레드 사용하여 덧셈 수행
알고리즘 2. vector model - mul algorithm for GPU 알고리즘 3. vector model – sum algorithm for GPU
그림 6. vector size 별 CPU, GPU vector model 연산 시간 그래프
그림 7. vector size 별 CPU, GPU vector model 연산 시간 비교
그래프
표 1. vector size 별 CPU, GPU vector
model 연산 시간 결과
vector size가 증가 할
수록 연산 속도의 효
율성이 확연히 좋아짐
을 볼 수 있었다.