공유변수 덧셈 (gcc_atomic, omp_critical, omp_atomic)
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main(int argc, char** argv)
{
char prompt[][11] = {"ordinary", "gcc_atomic", "critical", "atomic"};
int select_item;
if (argc < 2)
return 0;
select_item = atoi(argv[1]);
int shared_value = 0;
double t = omp_get_wtime();
#pragma omp parallel num_threads(16)
{
int i;
if(select_item == 0) // ordinary
{
#pragma omp parallel for shared(shared_value)
for( i = 0; i < 10000 ; i++)
shared_value++;
}
else if(select_item == 1) //gcc_atomic
{
for( i = 0; i < 10000 ; i++)
__sync_fetch_and_add(&shared_value, 1);
}
else if(select_item == 2) //critical
{
#pragma omp parallel for
for(i = 0; i < 10000 ; i++)
{
#pragma omp critical
{
shared_value++;
}
}
}
else if(select_item == 3) //omp_atomic
{
#pragma omp parallel for
for(i = 0; i < 10000 ; i++)
{
#pragma omp atomic
shared_value++;
}
}
}
t = omp_get_wtime() - t;
printf("[%s] shared_value : %d / %lf elapsed\n",prompt[select_item],shared_value, t);
}