AUTH's THMMY "Parallel and distributed systems" course assignments.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

272 lignes
8.6 KiB

  1. #
  2. # PDS homework_1 Makefile
  3. #
  4. # Copyright (C) 2024 Christos Choutouridis <christos@choutouridis.net>
  5. #
  6. # This program is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU Lesser General Public License as
  8. # published by the Free Software Foundation, either version 3
  9. # of the License, or (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU Lesser General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU Lesser General Public License
  17. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. # ============== Project settings ==============
  20. # Project's name
  21. PROJECT := PDS_homework_1
  22. # Excecutable's name
  23. TARGET := knnsearch
  24. # Source directories list(space seperated). Makefile-relative path, UNDER current directory.
  25. SRC_DIR_LIST := src
  26. # Include directories list(space seperated). Makefile-relative path.
  27. INC_DIR_LIST := inc \
  28. src
  29. # Exclude files list(space seperated). Filenames only.
  30. # EXC_FILE_LIST := bad.cpp old.cpp
  31. # Build directories
  32. BUILD_DIR := bin
  33. OBJ_DIR := $(BUILD_DIR)/obj
  34. DEP_DIR := $(BUILD_DIR)/.dep
  35. # ========== Compiler settings ==========
  36. # Compiler flags for debug and release
  37. DEB_CFLAGS := -DDEBUG -g3 -Wall -Wextra -std=c11
  38. REL_CFLAGS := -Wall -Wextra -O3 -std=c11
  39. DEB_CXXFLAGS := -DDEBUG -g3 -Wall -Wextra -std=c++17
  40. REL_CXXFLAGS := -Wall -Wextra -O3 -std=c++17
  41. # Pre-defines
  42. # PRE_DEFS := MYCAB=1729 SUPER_MODE
  43. PRE_DEFS :=
  44. # ============== Linker settings ==============
  45. # Linker flags (example: -pthread -lm)
  46. LDFLAGS := -pthread -lopenblas
  47. # Map output file
  48. MAP_FILE := output.map
  49. MAP_FLAG := -Xlinker -Map=$(BUILD_DIR)/$(MAP_FILE)
  50. # ============== Docker settings ==============
  51. # We need:
  52. # - Bind the entire project directory(the dir that icludes all the code) as volume.
  53. # - In docker instance, change to working directory(where the makefile is).
  54. DOCKER_VOL_DIR := ${PWD}
  55. DOCKER_WRK_DIR :=
  56. DOCKER_RUN := docker run --rm
  57. DOCKER_FLAGS := -v $(DOCKER_VOL_DIR):/usr/src/$(PROJECT) -w /usr/src/$(PROJECT)/$(DOCKER_WRK_DIR)
  58. # docker invoke mechanism (edit with care)
  59. # note:
  60. # Here, `DOCKER` variable is empty. Rules can assign `DOCKER := DOCKER_CMD` when docker
  61. # functionality is needed.
  62. DOCKER_CMD = $(DOCKER_RUN) $(DOCKER_FLAGS) $(IMAGE)
  63. DOCKER :=
  64. # ============== Tool selection ==============
  65. # compiler and compiler flags.
  66. CSIZE := size
  67. CFLAGS := $(DEB_CFLAGS)
  68. CXXFLAGS := $(DEB_CXXFLAGS)
  69. CXX := g++
  70. CC := gcc
  71. #
  72. # =========== Main body and Patterns ===========
  73. #
  74. #ifeq ($(OS), Windows_NT)
  75. # TARGET := $(TARGET).exe
  76. #endif
  77. INC := $(foreach dir,$(INC_DIR_LIST),-I$(dir))
  78. DEF := $(foreach def,$(PRE_DEFS),-D$(def))
  79. EXC := $(foreach fil,$(EXC_FILE_LIST), \
  80. $(foreach dir,$(SRC_DIR_LIST),$(wildcard $(dir)/$(fil))) \
  81. )
  82. # source files. object and dependencies list
  83. # recursive search into current and source directories
  84. SRC := $(wildcard *.cpp)
  85. SRC += $(foreach dir,$(SRC_DIR_LIST),$(wildcard $(dir)/*.cpp))
  86. SRC += $(foreach dir,$(SRC_DIR_LIST),$(wildcard $(dir)/**/*.cpp))
  87. SRC := $(filter-out $(EXC),$(SRC))
  88. #SRC := $(abspath $(SRC))
  89. OBJ := $(foreach file,$(SRC:%.cpp=%.o),$(OBJ_DIR)/$(file))
  90. DEP := $(foreach file,$(SRC:%.cpp=%.d),$(DEP_DIR)/$(file))
  91. # Make Dependencies pattern.
  92. # This little trick enables recompilation only when dependencies change
  93. # and it does so for changes both in source AND header files ;)
  94. #
  95. # It is based on Tom Tromey's method.
  96. #
  97. # Invoke cpp to create makefile rules with dependencies for each source file
  98. $(DEP_DIR)/%.d: %.c
  99. @mkdir -p $(@D)
  100. @$(DOCKER) $(CC) -E $(CFLAGS) $(INC) $(DEF) -MM -MT $(OBJ_DIR)/$(<:.c=.o) -MF $@ $<
  101. # c file objects depent on .c AND dependency files, which have an empty recipe
  102. $(OBJ_DIR)/%.o: %.c $(DEP_DIR)/%.d
  103. @mkdir -p $(@D)
  104. $(DOCKER) $(CC) -c $(CFLAGS) $(INC) $(DEF) -o $@ $<
  105. $(DEP_DIR)/%.d: %.cpp
  106. @mkdir -p $(@D)
  107. @$(DOCKER) $(CXX) -E $(CXXFLAGS) $(INC) $(DEF) -MM -MT $(OBJ_DIR)/$(<:.cpp=.o) -MF $@ $<
  108. # cpp file objects depent on .cpp AND dependency files, which have an empty recipe
  109. $(OBJ_DIR)/%.o: %.cpp $(DEP_DIR)/%.d
  110. @mkdir -p $(@D)
  111. $(DOCKER) $(CXX) -c $(CXXFLAGS) $(INC) $(DEF) -o $@ $<
  112. # empty recipe for dependency files. This prevents make errors
  113. $(DEP):
  114. # now include all dependencies
  115. # After all they are makefile dependency rules ;)
  116. include $(wildcard $(DEP))
  117. # main target rule
  118. $(BUILD_DIR)/$(TARGET): $(OBJ)
  119. @mkdir -p $(@D)
  120. @echo Linking to target: $(TARGET)
  121. @echo $(DOCKER) $(CXX) '$$(OBJ)' $(LDFLAGS) $(MAP_FLAG) -o $(@D)/$(TARGET)
  122. @$(DOCKER) $(CXX) $(OBJ) $(LDFLAGS) $(MAP_FLAG) -o $(@D)/$(TARGET)
  123. @echo
  124. @echo Print size information
  125. @$(CSIZE) $(@D)/$(TARGET)
  126. @echo Done
  127. .PHONY: clean
  128. clean:
  129. @echo Cleaning build directories
  130. @rm -rf $(OBJ_DIR)
  131. @rm -rf $(DEP_DIR)
  132. @rm -rf $(BUILD_DIR)
  133. #
  134. # ================ Local build rules =================
  135. # example:
  136. # make debug
  137. debug: CFLAGS := $(DEB_CFLAGS)
  138. debug: $(BUILD_DIR)/$(TARGET)
  139. release: CFLAGS := $(REL_CFLAGS)
  140. release: $(BUILD_DIR)/$(TARGET)
  141. all: release
  142. hpc-results/post:
  143. $(CXX) $(CFLAGS) -o $@ hpc-results/main.cpp
  144. hpc-clean:
  145. rm hpc-results/post
  146. #
  147. # ================ Local via docker build rules =================
  148. #
  149. # examples:
  150. # make IMAGE=hpcimage v0
  151. # make IMAGE=hpcimage v1_cilk
  152. #
  153. local_v0: CFLAGS := $(DEB_CFLAGS) -DCODE_VERSION=0
  154. local_v0: CXXFLAGS := $(DEB_CXXFLAGS) -DCODE_VERSION=0
  155. local_v0: TARGET := local_v0
  156. local_v0: $(BUILD_DIR)/$(TARGET)
  157. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  158. local_v1: CFLAGS := $(DEB_CFLAGS) -DCODE_VERSION=4
  159. local_v1: CXXFLAGS := $(DEB_CXXFLAGS) -DCODE_VERSION=4
  160. local_v1: TARGET := local_v1
  161. local_v1: $(BUILD_DIR)/$(TARGET)
  162. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  163. v0: DOCKER := $(DOCKER_CMD)
  164. v0: CFLAGS := $(REL_CFLAGS) -DCODE_VERSION=0
  165. v0: CXXFLAGS := $(REL_CXXFLAGS) -DCODE_VERSION=0
  166. v0: TARGET := knnsearch_v0
  167. v0: $(BUILD_DIR)/$(TARGET)
  168. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  169. v1_cilk: DOCKER := $(DOCKER_CMD)
  170. v1_cilk: CXX := /usr/local/OpenCilk-9.0.1-Linux/bin/clang++
  171. v1_cilk: CFLAGS := $(REL_CFLAGS) -fcilkplus -DCODE_VERSION=1 -DCILK
  172. v1_cilk: CXXFLAGS := $(REL_CXXFLAGS) -fcilkplus -DCODE_VERSION=1 -DCILK
  173. v1_cilk: LDFLAGS += -fcilkplus
  174. v1_cilk: TARGET := knnsearch_cilkv1
  175. v1_cilk: $(BUILD_DIR)/$(TARGET)
  176. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  177. v1_omp: DOCKER := $(DOCKER_CMD)
  178. v1_omp: CFLAGS := $(REL_CFLAGS) -fopenmp -DCODE_VERSION=1 -DOMP
  179. v1_omp: CXXFLAGS := $(REL_CXXFLAGS) -fopenmp -DCODE_VERSION=1 -DOMP
  180. v1_omp: LDFLAGS += -fopenmp
  181. v1_omp: TARGET := knnsearch_ompv1
  182. v1_omp: $(BUILD_DIR)/$(TARGET)
  183. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  184. v1: DOCKER := $(DOCKER_CMD)
  185. v1: CFLAGS := $(REL_CFLAGS) -DCODE_VERSION=1
  186. v1: CXXFLAGS := $(REL_CXXFLAGS) -DCODE_VERSION=1
  187. v1: TARGET := knnsearch_v1
  188. v1: $(BUILD_DIR)/$(TARGET)
  189. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  190. #
  191. # ========= Inside CSAL Image build rules ===========
  192. #
  193. # 1) first jump into image (make sure you are in the directory where Makefile is):
  194. # > docker run -it -v ${PWD}:/usr/src/exercise_1 -w /usr/src/exercise_1/ hpcimage
  195. # 2) Clean binaries first **important**
  196. # > make clean
  197. # 3) for v4 cilk for example:
  198. # > make csal_v4_cilk
  199. # 4) run executables from `bin/`. Examples:
  200. # > ./bin/tcount_ompv3 -i mtx/NACA0015.mtx --timing -r 3 -o /dev/null
  201. # > ./bin/tcount_pthv4 -i mtx/com_Youtube.mtx --timing --dynamic --print_count
  202. csal_v0: CFLAGS := $(REL_CFLAGS) -DCODE_VERSION=0
  203. csal_v0: TARGET := knnsearch_v0
  204. csal_v0: $(BUILD_DIR)/$(TARGET)
  205. csal_v1_cilk: CXX := /usr/local/OpenCilk-9.0.1-Linux/bin/clang++
  206. csal_v1_cilk: CFLAGS := $(REL_CFLAGS) -fcilkplus -DCODE_VERSION=1 -DCILK
  207. csal_v1_cilk: CXXFLAGS := $(REL_CXXFLAGS) -fcilkplus -DCODE_VERSION=1 -DCILK
  208. csal_v1_cilk: LDFLAGS += -fcilkplus
  209. csal_v1_cilk: TARGET := knnsearch_cilkv1
  210. csal_v1_cilk: $(BUILD_DIR)/$(TARGET)
  211. csal_v1_omp: CFLAGS := $(REL_CFLAGS) -fopenmp -DCODE_VERSION=1 -DOMP
  212. csal_v1_omp: CXXFLAGS := $(REL_CXXFLAGS) -fopenmp -DCODE_VERSION=1 -DOMP
  213. csal_v1_omp: LDFLAGS += -fopenmp
  214. csal_v1_omp: TARGET := knnsearch_ompv1
  215. csal_v1_omp: $(BUILD_DIR)/$(TARGET)
  216. csal_v1: CFLAGS := $(REL_CFLAGS) -DCODE_VERSION=1
  217. csal_v1: CXXFLAGS := $(REL_CXXFLAGS) -DCODE_VERSION=1
  218. csal_v1: TARGET := knnsearch_v1
  219. csal_v1: $(BUILD_DIR)/$(TARGET)
  220. #
  221. # ======== Run from container =========
  222. #
  223. # examples:
  224. #
  225. # make IMAGE=hpcimage EXEC=knnsearch_v1 run
  226. # make IMAGE=hpcimage EXEC=knnsearch_v1 run
  227. #
  228. run: DOCKER := $(DOCKER_CMD)
  229. run:
  230. $(DOCKER) ./out/$(EXEC)