imc_extension.cmake 7.4 KB

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