la fermata, 개발/OpenMP

공유변수 덧셈 (gcc_atomic, omp_critical, omp_atomic)

창공미나래 2019. 2. 19. 23:03

#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);
}