열렬히.뛰기

평가 팁

école 42 > philosopher > philosopher : 진행 상황 > 평가 팁

makefile의 병렬성

shell
make -j 4 re

make에 -j 옵션을 주면 코어 수를 정할 수 있다.

  • 클러스터 아이맥은 6코어인 걸로 알려져 있다.
  • 이때 명령어들이 병렬적으로 실행되서 안되는 명령어가 발생할 수 있다.

예시 : make -j 4 re

다음과 같은 makefile이 있다고 쳐보자.

makefile
NAME = philo
CC = cc -g -Wall -Wextra -Werror -fsanitize=thread

SRCS = philo_main.c philo_util.c philo_util2.c \
		philo_exe.c philo_check.c philo_input.c
OBJS = $(SRCS:.c=.o)

all : $(NAME)

$(NAME) : $(OBJS)
	$(CC) $(OBJS) -o $(NAME)

clean :
	rm -rf $(OBJS)

fclean : clean
	rm -rf $(NAME)

re : fclean 
	make all

.PHONY : all clean fclean re

이때 make -j 4 re 의 결과는 다음과 같다.

shell
rm -rf philo_main.o philo_util.o philo_util2.o philo_exe.o philo_check.o philo_input.o
rm -rf philo

왜? 병렬로 돌기 때문이다. 즉, fclean과 all이 한번에 돌면서 object 파일의 소멸이 되던 중 생성이 됨.

따라서 소멸하는 명령만 실행이 될 수 밖에 없다.

그래서 그 대안으로 Makefile을 다음과 같이 바꿀 수 있다.

re 부분 중 all을 의존성이 아닌 실행부에 두면 된다.

makefile
NAME = philo
CC = cc -g -Wall -Wextra -Werror -fsanitize=thread

SRCS = philo_main.c philo_util.c philo_util2.c \
		philo_exe.c philo_check.c philo_input.c
OBJS = $(SRCS:.c=.o)

all : $(NAME)

$(NAME) : $(OBJS)
	$(CC) $(OBJS) -o $(NAME)

clean :
	rm -rf $(OBJS)

fclean : clean
	rm -rf $(NAME)

re : fclean 
	make all

.PHONY : all clean fclean re