티스토리 뷰
병렬 계수 정렬 (parallel counting sort) with OpenMP barrier / atomic
창공미나래 2019. 2. 19. 23:03#include <stdio.h>
#include <omp.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define N 100000 //array size
#define M 1000000 //number area
int data[N];
int buckets[M];
int *my_buckets[16];
void init_array(int a[N], int size)
{
int i;
for( i = 0 ; i < size ; i++)
{
a[i] = rand()%M;
}
}
void omp_thread(int a[N], int b[M])
{
int i;
#pragma omp parallel for num_threads(16) private(i)
for(i = 0; i < N ; i++)
{
#pragma omp atomic
b[a[i]]++;
}
}
void omp_thread_barrier(int *my_buckets[16], int data[N])
{
int i,j, tid;
for( i = 0 ; i < 16 ; i++)
{
my_buckets[i] = malloc(sizeof(int) * M);
memset(my_buckets[i], 0, sizeof(int) * M);
}
double t = omp_get_wtime();
#pragma omp parallel private(i, j, tid)
{
tid = omp_get_thread_num();
#pragma omp for
for(i = 0; i < N ; i++)
my_buckets[tid][data[i]]++;
#pragma omp barrier
#pragma omp for
for(i = 0; i < M; i++)
for(j = 1; j < 16; j++)
{
my_buckets[0][i] += my_buckets[j][i];
}
}
t = omp_get_wtime() - t;
printf("%lfsec elapsed\n",t);
}
int main(int argc, char** argv)
{
srand(time(NULL));
if(argc < 2)
return 0;
int select_item = atoi(argv[1]);
if(select_item = 1)
{
init_array(data, N);
init_array(buckets, M);
double t = omp_get_wtime();
omp_thread(data,buckets);
t = omp_get_wtime() - t;
printf("%lfsec elapsed\n",t);
}
else if(select_item = 2)
{
omp_thread_barrier(my_buckets, data);
}
return 0;
}
' la fermata, 개발 > OpenMP' 카테고리의 다른 글
가위바위보 게임 (0) | 2019.02.19 |
---|---|
공유변수 덧셈 (gcc_atomic, omp_critical, omp_atomic) (0) | 2019.02.19 |
행렬 곱셈 max_active_levels / set_nested (0) | 2019.02.19 |
행렬 곱셈 nest loop 2가지 사용해보기 (0) | 2019.02.19 |
병렬 합 / shared, atomic, reduction 사용해보기 (0) | 2019.02.19 |