티스토리 뷰

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

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함