티스토리 뷰
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include "pthread.h"
#define NUM_THREADS 4
#define SIZE 256
#define ITER 100000
int* a;
int* b;
void* thread_func_write(void* arg)
{
int* array = (int*) arg;
int i, j;
for(i = 0; i < ITER; i++)
{
for(j = 0; j < SIZE ; j++)
{
array[j] = array[j] + 1;
}
}
return NULL;
}
void* thread_func_read(void* arg)
{
int* array = (int*)arg;
int i, j;
int sum = 0;
for(i = 0; i < ITER ; i++)
{
for(j = 0; j < SIZE ; j++)
{
sum += array[j];
}
}
return (void*)sum;
}
int main(int argc, char** argv)
{
int i;
struct timeval t1, t2;
for(i=1;i<=4;i++)
{
if(argv[i]==NULL)
{
printf("argv[%d] input error\n",i);
return 0;
}
}
int first = atoi(argv[1]);
int second = atoi(argv[2]);
int third = atoi(argv[3]);
int fourth = atoi(argv[4]);
pthread_t tids[NUM_THREADS];
cpu_set_t cpuset;
void* status;
int result;
int s;
a = (int*)malloc(SIZE * sizeof(int));
b = (int*)malloc(SIZE * sizeof(int));
printf("SIZE*sizeof(int) %d\n",SIZE*sizeof(int));
for(i = 0; i <SIZE ; i++)
{
a[i] = 0;
b[i] = 0;
}
gettimeofday(&t1,NULL);
i = 0;
CPU_ZERO(&cpuset);
CPU_SET(first, &cpuset);
result = pthread_create(&tids[i], NULL, thread_func_write, (void*)a);
if(result != 0)
{
printf("Error(%d) occured in pthread_create.\n",result);
}
s = pthread_setaffinity_np(tids[i], sizeof(cpu_set_t), &cpuset);
if(s!=0)
{
printf("Error : pthread_setaffinity_np\n");
} else {
printf("Set affinity thread %d to %d\n", i, first);
}
i++;
CPU_ZERO(&cpuset);
CPU_SET(second, &cpuset);
result = pthread_create(&tids[i], NULL, thread_func_read, (void*)a);
if(result != 0)
{
printf("Error(%d) occured in pthread_create.\n",result);
}
s = pthread_setaffinity_np(tids[i], sizeof(cpu_set_t), &cpuset);
if(s!=0)
{
printf("Error : pthread_setaffinity_np\n");
} else {
printf("Set affinity thread %d to %d\n", i, second);
}
i++;
CPU_ZERO(&cpuset);
CPU_SET(third, &cpuset);
result = pthread_create(&tids[i], NULL, thread_func_write, (void*)b);
if(result != 0)
{
printf("Error(%d) occured in pthread_create.\n",result);
}
s = pthread_setaffinity_np(tids[i], sizeof(cpu_set_t), &cpuset);
if(s!=0)
{
printf("Error : pthread_setaffinity_np\n");
} else {
printf("Set affinity thread %d to %d\n", i, third);
}
i++;
CPU_ZERO(&cpuset);
CPU_SET(fourth, &cpuset);
result = pthread_create(&tids[i], NULL, thread_func_read, (void*)b);
if(result != 0)
{
printf("Error(%d) occured in pthread_create.\n",result);
}
s = pthread_setaffinity_np(tids[i], sizeof(cpu_set_t), &cpuset);
if(s!=0)
{
printf("Error : pthread_setaffinity_np\n");
} else {
printf("Set affinity thread %d to %d\n", i, fourth);
}
for(i = 0; i < NUM_THREADS ; i++)
{
pthread_join(tids[i], &status);
}
gettimeofday(&t2, NULL);
printf("%.3f elapsed\n", (double)(t2.tv_sec - t1.tv_sec) + (double)(t2.tv_usec-t1.tv_usec) / 1.e6);
free(a);
free(b);
return 0;
}
' la fermata, 개발 > Pthread' 카테고리의 다른 글
False Sharing 문제 해결 with padding (0) | 2019.02.19 |
---|---|
False sharing 예제 (0) | 2019.02.19 |
타일링을 이용한 행렬 곱셈 (0) | 2019.02.19 |
큐를 이용한 주사위 확률 구하기 (0) | 2019.02.19 |
병렬 계수 정렬(Parallel counting sort (0) | 2019.02.19 |