TIL (Today I Learned)/Linux

[Linux] 닀쀑 μ“°λ ˆλ“œ

loki d 2021. 8. 22. 21:58
728x90

Threads Program

  • ν–‰λ ¬μ˜ 곱을 좜λ ₯ν•˜λŠ” ν•¨μˆ˜λ₯Ό 닀쀑 μ“°λ ˆλ“œλ₯Ό μ΄μš©ν•˜λŠ” 예제

thread Syntax in c

int pthread_create(pthread_t * thread, 
                   const pthread_attr_t * attr, 
                   void * (*start_routine)(void *), 
                   void *arg);

λ§€κ°œλ³€μˆ˜

1. thread

  • μ“°λ ˆλ“œκ°€ μ„±κ³΅μ μœΌλ‘œ μƒμ„±λ˜μ—ˆμ„ λ•Œ μƒμ„±λœ μ“°λ ˆλ“œλ₯Ό μ‹λ³„ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©λ˜λŠ” μ“°λ ˆλ“œ μ‹λ³„μžμ΄λ‹€.

    2. attr

  • μ“°λ ˆλ“œ νŠΉμ„±μ„ μ§€μ •ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•˜λ©°, κΈ°λ³Έ μ“°λ ˆλ“œ νŠΉμ„±μ„ μ΄μš©ν•˜κ³ μž ν•  κ²½μš°μ—λŠ” NULL μ‚¬μš©

    3. start_routine

  • λΆ„κΈ°μ‹œμΌœμ„œ μ‹€ν–‰ν•  μ“°λ ˆλ“œ ν•¨μˆ˜

    4. arg

  • start_routine μ“°λ ˆλ“œ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨μ§„λ‹€.

μ„±κ³΅μ μœΌλ‘œ 생성될 경우 0을 return

main.c

#include<stdio.h>
#include<stdlib.h>
#define MAX_LEN 30
#include<time.h>
#include "matrix.h"
#include<sys/time.h>

int main()
{
    int **a;
    int **b;
    int **c;
    int i, j, k;
    double start, stop;

    init_matrix(&a, &b, &c, MAX_LEN);

    start = clock();
    matrix_mul(a, b, c, MAX_LEN);
    stop = clock();
    start = wtime();

    if(matrix_mul(a, b, c, MAX_LEN)!=0){
        fprintf(stderr, "Failed to Matrix multiplecation\n");
        exit(1);
    }
    stop = wtime();
    printf("single-thread-Proccessing time : %lf\n", stop-start);

    start = wtime();
    if(matrix_mul_th(a,b,c, MAX_LEN) !=0){
        fprintf(stderr, "Failed to Matrix Multiplecation\n");
        exit(1);
    }
    stop = wtime();
    printf("multi-thread-Processing time : %lf\n", stop - start);
    return 0;
}

double wtime(){
    static int sec = -1;
    struct timeval tv;
    gettimeofday(&tv, NULL);
    if(sec < 0) sec = tv.tv_sec;

    return (tv.tv_sec - sec) + 1.0e-6 * tv.tv_usec;
}

matrix.h

void matrix_add(int **, int**, int**, int len);
void matrix_sub(int **, int**, int**, int len);
int matrix_mul(int **, int**, int**, int len);
int matrix_mul_th(int **, int**, int**, int len);
void matrix_mul_th_kernel(int, int **, int**, int**, int len);
void matrix_inv(int **, int**,int len);
void init_matrix(int***, int***, int***, int len);
void print_matrix(int **, char*, int len);
double wtime();

matrix.c

#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>

int matrix_mul(int** a, int** b, int** c, int len)
{
    int i,j,k;
    int result =0;
    for(i=0; i<len; i++){
        for(j=0; j<len; j++){
            // c[i][j] = a[i][j] + b[i][j];
            result = 0;
            for(k=0; k<len; k++){
                result += a[i][k] *b[k][j];
            }
            c[i][j] = result;
        }
    }
    return 0;
}

typedef struct{
    int i;
    int** src1;
    int** src2;
    int** dst;
    int len;
} matmul_arg_t;

void *matrix_mul_th_kernel(void *arg)
{
    int j,k, result;
    matmul_arg_t *parg = (matmul_arg_t*)arg;
    int i = parg->i;
    int **src1 = parg->src1;
    int **src2 = parg->src2;
    int **dst = parg->dst;
    int len = parg->len;
    for(j=0; j<len; j++){
        result = 0;
        for(k=0; k<len; k++){
            result += src1[i][k] *src2[k][j];
        }
        dst[i][j] = result;
    }
}

int matrix_mul_th(int** src1, int** src2, int** dst, int len)
{
    int              i,k,j, res;
    matmul_arg_t     *arg;
    pthread_t        *a_thread;
    void             *thread_result;

    a_thread = (pthread_t *)malloc(sizeof(pthread_t) * len);

    for(i=0; i<len; i++){
        arg = (matmul_arg_t*)malloc(sizeof(matmul_arg_t));
        arg->i = i;
        arg->src1 = src1;
        arg->src2 = src2;
        arg->dst = dst;
        arg->len = len;
        //matrix_mul_th_kernel((void*)&arg);
        res = pthread_create(a_thread+i, NULL, matrix_mul_th_kernel, (void*)arg);
        if(res !=0){
            perror("Thread creation failed\n");
            exit(EXIT_FAILURE);
        }
    }
    for(i=0; i<len; i++){
        res = pthread_join(a_thread[i], &thread_result);
        if(res !=0){
            perror("Thread join failed");
            exit(EXIT_FAILURE);
        }
    }
    return 0;
}
int matrix_add(int** a, int** b, int** c, int len)
{
}
int matrix_sub(int** a, int** b, int** c, int len)
{
}
int matrix_inv(int** src, int** dst, int len)
{

}
void print_matrix(int** matrix, char* name, int len)
{
    int i,j;
    printf("==%s Matrix==============\n", name);
    for(i=0; i<len; i++){
        for(j=0; j<len; j++){
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}
void init_matrix(int*** p_a, int*** p_b, int*** p_c, int len)
{
    int **a;
    int **b;
    int **c;
    int i, j;
    a = (int**)malloc(len * sizeof(int*));
    b = (int**)malloc(len * sizeof(int*));
    c = (int**)malloc(len * sizeof(int*));

    for(i=0; i< len; i++){
        a[i] = (int*)malloc(len * sizeof(int));
        b[i] = (int*)malloc(len * sizeof(int));
        c[i] = (int*)malloc(len * sizeof(int));
    }
    srandom((unsigned int)time(NULL));
    for(i=0; i<len; i++){
        for(j=0; j<len; j++){
            a[i][j] = random() % 10;
            b[i][j] = random() % 10;
        }
    }
    *p_a = a;
    *p_b = b;
    *p_c = c;
}

컴파일 λͺ…λ Ήμ–΄

  • gcc matrix.c -o matrix -pthread -lpthread

Makefile


Target = matrix
obj = main.o matrix.o
LFLAGS = -pthread -lpthread             // 1.
CFLAGS = -D_REENTRANT                   // 2.

all : $(obj)
    gcc -o $(Target) $(LFLAGS) $(obj)

main.o: main.c
    gcc -c $(CFLAGS) main.c

matrix.o: matrix.c
    gcc -c $(CFLAGS) matrix.c

clean:
    rm -r *.o $(Target)

1. μŠ€λ ˆλ“œ κ΄€λ ¨ 라이브러리λ₯Ό λ§ν¬ν•˜λŠ” μ˜΅μ…˜

2. μŠ€λ ˆλ“œμ—μ„œ λ™μž‘ν•  λ•Œ μ„±λŠ₯상 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλŠ” μŠ€λ ˆλ“œ λΆˆμ•ˆμ „ ν•¨μˆ˜κ°€ μ‘΄μž¬ν•œλ‹€. μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ λΆˆμ•ˆμ „ ν•¨μˆ˜λ₯Ό λŒ€μ²΄ν•  수 있게 지원해 μ£ΌλŠ” 링컀 μ˜΅μ…˜

정리

  • CC : 컴파일러
  • CFLAGS :
  • OBJS : 쀑간 μ‚°λ¬Ό Object 파일 λͺ©λ‘
  • TARGET : λΉŒλ“œ λŒ€μƒ(μ‹€ν–‰ 파일) 이름
  • LDFLAGS : 링크 μ˜΅μ…˜
  • LDLIBS : 링크 라이브러리
  • $@ : ν˜„μž¬ Target 이름
  • $^ : ν˜„μž¬ Target이 μ˜μ‘΄ν•˜λŠ” λŒ€μƒλ“€μ˜ 전체 λͺ©λ‘
  • $? : ν˜„μž¬ Target이 μ˜μ‘΄ν•˜λŠ” λŒ€μƒλ“€ 쀑 λ³€κ²½λœ κ²ƒλ“€μ˜ λͺ©λ‘

파일 μƒμ„±λœ λͺ¨μŠ΅

image

$ make

image

$ make all

image

$ make clean

image





μ°Έμ‘°

[Make νŠœν† λ¦¬μ–Ό] Makefile μ˜ˆμ œμ™€ μž‘μ„± 방법 및 κΈ°λ³Έ νŒ¨ν„΄

λ¦¬λˆ…μŠ€ μ‹œμŠ€ν…œ ν”„λ‘œκ·Έλž˜λ° - μ“°λ ˆλ“œ