티스토리 뷰
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
#define NUM_THREAD 3
typedef enum {ROCK, SCISSOR, PAPER} decision_t;
char* toString[3] = {"ROCK", "SCISSOR", "PAPER"};
static int my_rand()
{
return omp_get_thread_num() ^ time(NULL);
}
int main(int argc, char** argv)
{
int i, tid;
decision_t decision[NUM_THREAD];
decision_t my_result;
decision_t winner, loser;
int somebody_winner = 0, somebody_loser = 0;
#pragma omp parallel num_threads(NUM_THREAD) private(i, tid, my_result, winner, loser) firstprivate(somebody_winner, somebody_loser)
{
tid = omp_get_thread_num();
my_result = (decision_t)(my_rand() % 3);
printf("thread %d : %s!\n",tid, toString[my_result]);
decision[tid] = my_result;
#pragma omp barrier
printf("=============================================\n");
if(my_result == ROCK)
{
winner = PAPER;
loser = SCISSOR;
}
else if(my_result == PAPER)
{
winner = SCISSOR;
loser = ROCK;
}
else
{
winner = ROCK;
loser = PAPER;
}
for(i = 0 ; i < NUM_THREAD ; i++)
{
if(decision[i] == winner)
{
somebody_winner = 1;
break;
}
}
for(i = 0 ; i < NUM_THREAD ; i++)
{
if(decision[i] == loser)
{
somebody_loser = 1;
break;
}
}
if(somebody_winner == somebody_loser)
{
printf("thread %d : DRAW\n",tid);
}
else if(somebody_winner)
{
printf("thread %d : I LOSE\n",tid);
}
else
printf("thread %d : I WIN\n", tid);
}
return 0;
}
' la fermata, 개발 > OpenMP' 카테고리의 다른 글
병렬 계수 정렬 (parallel counting sort) with OpenMP barrier / atomic (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 |