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μ΄ μμ‘΄νλ λμλ€ μ€ λ³κ²½λ κ²λ€μ λͺ©λ‘
νμΌ μμ±λ λͺ¨μ΅
$ make
$ make all
$ make clean
μ°Έμ‘°
[Make νν 리μΌ] Makefile μμ μ μμ± λ°©λ² λ° κΈ°λ³Έ ν¨ν΄
리λ μ€ μμ€ν νλ‘κ·Έλλ° - μ°λ λ