imc_extension.cmake 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. set(IMC_BENCH_NAME "vAes" CACHE STRING "")
  2. set(IMC_BENCH_INFINITE_LOOP 0 CACHE BOOL "")
  3. set(IMC_PRINT_RECOVERY_MESSAGE 0 CACHE BOOL "")
  4. set(IMC_ENABLE_STATIC_LOOP_PASS_COUNT 1 CACHE BOOL "")
  5. set(IMC_ENABLE_ADAPTIVE_LOOP_PASS_COUNT 0 CACHE BOOL "")
  6. set(IMC_MAX_LOOP_IDS 1 CACHE STRING "")
  7. set(IMC_LOOP_PASS_COUNT 10 CACHE BOOL "")
  8. set(IMC_BENCH_REPEAT_COUNT 1 CACHE BOOL "")
  9. set(IMC_PRINT_STATS 0 CACHE BOOL "")
  10. set(IMC_CUSTOM_UNROLL 0 CACHE BOOL "")
  11. set(IMC_LOOP_OPT_DEBUG 0 CACHE BOOL "")
  12. set(IMC_PRINT_INIT_TIME 0 CACHE BOOL "")
  13. set(IMC_PRINT_LATENCY_OVERHEAD 0 CACHE BOOL "")
  14. set(IMC_ENABLE_DYNAMIC_CHECKPOINT 0 CACHE BOOL "")
  15. set(IMC_DUPLICATION_RATIO 100 CACHE BOOL "")
  16. set(AVAILABLE_BENCHES "vBasicMath" "vStringSearch" "vFFT" "vSha" "vCrc" "vMatMul" "vConv2d" "adc_demo" "vAes" "fmc_expr" "vrefint_expr")
  17. if(NOT IMC_BENCH_NAME IN_LIST AVAILABLE_BENCHES)
  18. message( FATAL_ERROR "incorrect benchmark name: ${IMC_BENCH_NAME}")
  19. endif()
  20. if(IMC_ENABLE_STATIC_LOOP_PASS_COUNT AND IMC_ENABLE_ADAPTIVE_LOOP_PASS_COUNT)
  21. mesage( FATAL_ERROR "static and adaptive loop pass count are enalbed simultaneously")
  22. endif()
  23. add_compile_definitions(imcBENCH_NAME=${IMC_BENCH_NAME})
  24. add_compile_definitions(imcBENCH_REPEAT_COUNT=${IMC_BENCH_REPEAT_COUNT})
  25. add_compile_definitions(imcCUSTOM_UNROLL=${IMC_CUSTOM_UNROLL})
  26. add_compile_definitions(imcLOOP_OPT_DEBUG=${IMC_LOOP_OPT_DEBUG})
  27. add_compile_definitions(imcPRINT_INIT_TIME=${IMC_PRINT_INIT_TIME})
  28. add_compile_definitions(imcPRINT_LATENCY_OVERHEAD=${IMC_PRINT_LATENCY_OVERHEAD})
  29. # add_compile_definitions(imcUSE_IMC_KERNEL=${IMC_INSERT_COMPILER_CHECKPOINTS})
  30. add_compile_definitions(imcUSE_IMC_KERNEL=1)
  31. add_compile_definitions(imcENABLE_DYNAMIC_CHECKPOINT=${IMC_ENABLE_DYNAMIC_CHECKPOINT})
  32. if(IMC_BENCH_INFINITE_LOOP)
  33. add_compile_definitions(imcBENCH_INFINITE_LOOP=1)
  34. endif()
  35. if(IMC_PRINT_RECOVERY_MESSAGE)
  36. add_compile_definitions(imcPRINT_RECOVERY_MESSAGE=1)
  37. endif()
  38. add_compile_definitions(imcPRINT_STATS=${IMC_PRINT_STATS})
  39. list(APPEND SRC_FILES
  40. Core/Src/ImC/imc_extension.c
  41. )
  42. if(IMC_BENCH_NAME MATCHES "vConv2d")
  43. set(BENCHMARK_SRC_FILES
  44. )
  45. set(IMC_APP_FILES
  46. Core/Src/benchmarks/conv2d/conv2d.c
  47. )
  48. set(IMC_LINK_OBJS
  49. )
  50. endif()
  51. if(IMC_BENCH_NAME MATCHES "adc_demo")
  52. set(BENCHMARK_SRC_FILES
  53. Core/Src/benchmarks/adc_demo/adc_demo.c
  54. )
  55. set(IMC_APP_FILES
  56. )
  57. set(IMC_LINK_OBJS
  58. )
  59. endif()
  60. if(IMC_BENCH_NAME MATCHES "fmc_expr")
  61. set(BENCHMARK_SRC_FILES
  62. Core/Src/benchmarks/fmc_expr/fmc_expr.c
  63. )
  64. set(IMC_APP_FILES
  65. )
  66. set(IMC_LINK_OBJS
  67. )
  68. endif()
  69. if(IMC_BENCH_NAME MATCHES "vrefint_expr")
  70. set(BENCHMARK_SRC_FILES
  71. Core/Src/benchmarks/vrefint_expr/vrefint_expr.c
  72. )
  73. set(IMC_APP_FILES
  74. )
  75. set(IMC_LINK_OBJS
  76. )
  77. endif()
  78. if(IMC_BENCH_NAME MATCHES "vBasicMath")
  79. set(BENCHMARK_SRC_FILES
  80. Core/Src/benchmarks/basicmath/cubic.c
  81. Core/Src/benchmarks/basicmath/isqrt.c
  82. Core/Src/benchmarks/basicmath/rad2deg.c
  83. )
  84. set(IMC_APP_FILES
  85. Core/Src/benchmarks/basicmath/basicmath.c
  86. )
  87. set(IMC_LINK_OBJS
  88. )
  89. include_directories(
  90. Core/Inc/benchmarks/basicmath
  91. )
  92. endif()
  93. if(IMC_BENCH_NAME MATCHES "vCrc")
  94. set(BENCHMARK_SRC_FILES
  95. )
  96. set(IMC_APP_FILES
  97. Core/Src/benchmarks/crc/crc_32.c
  98. )
  99. set(IMC_LINK_OBJS
  100. ${CMAKE_SOURCE_DIR}/Core/Src/benchmarks/crc/crc_input.o
  101. )
  102. include_directories(
  103. Core/Inc/benchmarks/crc
  104. )
  105. endif()
  106. if(IMC_BENCH_NAME MATCHES "vFFT")
  107. set(BENCHMARK_SRC_FILES
  108. Core/Src/benchmarks/fft/fftmisc.c
  109. Core/Src/benchmarks/fft/fourierf.c
  110. )
  111. set(IMC_APP_FILES
  112. Core/Src/benchmarks/fft/fft.c
  113. )
  114. set(IMC_LINK_OBJS
  115. )
  116. include_directories(
  117. Core/Inc/benchmarks/fft
  118. )
  119. endif()
  120. if(IMC_BENCH_NAME MATCHES "vSha")
  121. set(BENCHMARK_SRC_FILES
  122. )
  123. set(IMC_APP_FILES
  124. Core/Src/benchmarks/sha/sha.c
  125. )
  126. set(IMC_LINK_OBJS
  127. ${CMAKE_SOURCE_DIR}/Core/Src/benchmarks/sha/sha_input.o
  128. )
  129. include_directories(
  130. Core/Inc/benchmarks/sha
  131. )
  132. endif()
  133. if(IMC_BENCH_NAME MATCHES "vMatMul")
  134. set(BENCHMARK_SRC_FILES
  135. )
  136. set(IMC_APP_FILES
  137. Core/Src/benchmarks/matmul/matmul.c
  138. )
  139. set(IMC_LINK_OBJS
  140. )
  141. endif()
  142. if(IMC_BENCH_NAME MATCHES "vStringSearch")
  143. set(BENCHMARK_SRC_FILES
  144. )
  145. set(IMC_APP_FILES
  146. Core/Src/benchmarks/stringsearch/stringsearch_local.c
  147. )
  148. set(IMC_LINK_OBJS
  149. )
  150. endif()
  151. if(IMC_BENCH_NAME MATCHES "vAes")
  152. set(BENCHMARK_SRC_FILES
  153. )
  154. set(IMC_APP_FILES
  155. Core/Src/benchmarks/aes/aes.c
  156. )
  157. set(IMC_LINK_OBJS
  158. )
  159. include_directories(
  160. Core/Inc/benchmarks/aes
  161. )
  162. endif()
  163. foreach(BENCH_SRC ${BENCHMARK_SRC_FILES})
  164. list(APPEND SRC_FILES ${BENCH_SRC})
  165. endforeach()
  166. function(compile_imc_files)
  167. # message("compile_imc_files called")
  168. get_target_property(SRC_INCLUDES imc_freeRTOS INCLUDE_DIRECTORIES)
  169. foreach(dir ${SRC_INCLUDES})
  170. list(APPEND INCLUDE_DIRS "-I${dir}")
  171. endforeach()
  172. string(REPLACE " " ";" C_FLAGS ${CMAKE_C_FLAGS})
  173. set(IMC_BASIC_PASSES "")
  174. set(BASIC_OPT_PASSES "mem2reg,indvars,instnamer,simplifycfg,lcssa,loop-simplify")
  175. foreach(PASS ${BASIC_OPT_PASSES})
  176. list(APPEND IMC_BASIC_PASSES "function\\(${PASS}\\)")
  177. endforeach()
  178. set(IMC_MODULE_PASSES "")
  179. set(IMC_FUNCTION_PASSES "")
  180. set(PLUGINS "")
  181. if(IMC_CUSTOM_UNROLL)
  182. # Wrap function-level pass with function(...) for the new pass manager; escape parens for sh
  183. list(APPEND IMC_FUNCTION_PASSES "function\\(imc-loop-unroll\\)")
  184. list(APPEND PLUGINS /home/ybkim/workspace/imc/loop_duplication/build/lib/libImcLoopUnroll.so)
  185. endif()
  186. if(IMC_SPLIT_LOOP)
  187. list(APPEND IMC_MODULE_PASSES "imc-loop-opt")
  188. list(APPEND PLUGINS /home/ybkim/workspace/imc/loop_duplication/build/lib/libImcLoopOpt.so)
  189. add_compile_definitions(imcENABLE_STATIC_LOOP_PASS_COUNT=${IMC_ENABLE_STATIC_LOOP_PASS_COUNT})
  190. add_compile_definitions(imcENABLE_ADAPTIVE_LOOP_PASS_COUNT=${IMC_ENABLE_ADAPTIVE_LOOP_PASS_COUNT})
  191. add_compile_definitions(imcMAX_LOOP_IDS=${IMC_MAX_LOOP_IDS})
  192. add_compile_definitions(imcLOOP_PASS_COUNT=${IMC_LOOP_PASS_COUNT})
  193. endif()
  194. if(IMC_INSERT_COMPILER_CHECKPOINTS)
  195. # Wrap function-level pass with function(...) for the new pass manager; escape parens for sh
  196. list(APPEND IMC_FUNCTION_PASSES "function\\(imc-insert-checkpoints\\)")
  197. list(APPEND PLUGINS /home/ybkim/workspace/imc/loop_duplication/build/lib/libImcInsertCheckpoints.so)
  198. endif()
  199. list(JOIN IMC_BASIC_PASSES "," IMC_BASIC_PASSES)
  200. list(JOIN IMC_MODULE_PASSES "," IMC_MODULE_PASSES)
  201. list(JOIN IMC_FUNCTION_PASSES "," IMC_FUNCTION_PASSES)
  202. set(PLUGIN_OPTIONS "")
  203. foreach(PLUGIN ${PLUGINS})
  204. list(APPEND PLUGIN_OPTIONS -load-pass-plugin=${PLUGIN})
  205. endforeach()
  206. # Build -passes list without trailing commas
  207. set(PASSES "${IMC_BASIC_PASSES}")
  208. if(IMC_MODULE_PASSES)
  209. set(PASSES "${PASSES},${IMC_MODULE_PASSES}")
  210. endif()
  211. if(IMC_FUNCTION_PASSES)
  212. set(PASSES "${PASSES},${IMC_FUNCTION_PASSES}")
  213. endif()
  214. # Only pass plugin-specific options when the relevant optimization is enabled
  215. set(OPT_OPTIONS "")
  216. if(IMC_SPLIT_LOOP)
  217. set(OPT_OPTIONS "-imc-loop-opt-duplication-ratio=${IMC_DUPLICATION_RATIO}")
  218. endif()
  219. set(ADDITIONAL_DEFS
  220. "-D imcBENCH_REPEAT_COUNT=${IMC_BENCH_REPEAT_COUNT}"
  221. "-D imcCUSTOM_UNROLL=${IMC_CUSTOM_UNROLL}"
  222. )
  223. set(ADDITIONAL_OPT_FLAGS
  224. "--disable-loop-unrolling"
  225. )
  226. foreach(APP_SRC ${IMC_APP_FILES})
  227. add_custom_command(
  228. OUTPUT ${PROJECT_BINARY_DIR}/${APP_SRC}.s
  229. DEPENDS ${APP_SRC}
  230. COMMAND ${CMAKE_C_COMPILER} -g ${C_FLAGS} -O0 -Xclang -disable-O0-optnone ${INCLUDE_DIRS} -D USE_HAL_DRIVER -D STM32L552xx ${ADDITIONAL_DEFS} -c -emit-llvm ${PROJECT_SOURCE_DIR}/${APP_SRC} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
  231. COMMAND ${OPT_BIN} -o ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc ${PLUGIN_OPTIONS} "-passes=${PASSES}" ${OPT_OPTIONS} ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
  232. # COMMAND ${OPT_BIN} -o ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc ${PLUGIN_OPTIONS} "-passes=${IMC_MODULE_PASSES},${IMC_FUNCTION_PASSES}" ${OPT_OPTIONS} ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
  233. # COMMAND ${OPT_BIN} -o ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc ${PLUGIN_OPTIONS} -passes=${BASIC_OPT_PASSES},${IMC_OPT_PASSES} ${OPT_OPTIONS} ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
  234. COMMAND ${OPT_BIN} ${OPT} ${ADDITIONAL_OPT_FLAGS} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.opt.bc ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc
  235. COMMAND ${LLC_BIN} ${CPU} ${OPT} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.s ${PROJECT_BINARY_DIR}/${APP_SRC}.opt.bc
  236. )
  237. list(APPEND APP_OPTS ${PROJECT_BINARY_DIR}/${APP_SRC}.s)
  238. endforeach()
  239. add_library(imc_apps OBJECT "${APP_OPTS}")
  240. endfunction()