CMakeLists.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. # check systems
  2. if (NOT UNAME_S)
  3. execute_process(COMMAND uname -s OUTPUT_VARIABLE UNAME_S)
  4. endif()
  5. if (NOT UNAME_P)
  6. execute_process(COMMAND uname -p OUTPUT_VARIABLE UNAME_P)
  7. endif()
  8. if (NOT UNAME_M)
  9. execute_process(COMMAND uname -m OUTPUT_VARIABLE UNAME_M)
  10. endif()
  11. #message(STATUS "UNAME_S: ${UNAME_S} UNAME_P: ${UNAME_P} UNAME_M: ${UNAME_M}")
  12. # Mac OS + Arm can report x86_64
  13. # ref: https://github.com/ggerganov/whisper.cpp/issues/66#issuecomment-1282546789
  14. if (UNAME_S MATCHES "Darwin")
  15. if (NOT UNAME_P MATCHES "arm")
  16. execute_process(COMMAND sysctl -n hw.optional.arm64 OUTPUT_VARIABLE SYSCTL_M)
  17. if (SYSCTL_M MATCHES "1")
  18. #set(UNAME_P "arm")
  19. #set(UNAME_M "arm64")
  20. message(WARNING "Your arch is announced as x86_64, but it seems to actually be ARM64. Not fixing that can lea
  21. d to bad performance. For more info see: https://github.com/ggerganov/whisper.cpp/issues/66\#issuecomment-#1282546789")
  22. endif()
  23. endif()
  24. endif()
  25. if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64")
  26. message(STATUS "ARM detected")
  27. #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=apple-m1")
  28. elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc64le" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc64")
  29. message(STATUS "PPC64 detected")
  30. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mpower9-vector")
  31. else()
  32. message(STATUS "x86 detected")
  33. #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx -mavx2 -mfma -mf16c")
  34. if (UNAME_S MATCHES "Darwin")
  35. execute_process(COMMAND sysctl machdep.cpu.features OUTPUT_VARIABLE AVX1_M)
  36. if (AVX1_M MATCHES "AVX1.0")
  37. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx")
  38. endif()
  39. execute_process(COMMAND sysctl machdep.cpu.leaf7_features OUTPUT_VARIABLE AVX2_M)
  40. if (AVX2_M MATCHES "AVX2")
  41. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx2")
  42. endif()
  43. if (AVX1_M MATCHES "FMA")
  44. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfma")
  45. endif()
  46. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mf16c")
  47. elseif (UNAME_S MATCHES "Linux")
  48. message(STATUS "Linux detected")
  49. execute_process(COMMAND grep "avx " /proc/cpuinfo OUTPUT_VARIABLE AVX1_M)
  50. if (AVX1_M MATCHES "avx")
  51. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx")
  52. endif()
  53. execute_process(COMMAND grep "avx2 " /proc/cpuinfo OUTPUT_VARIABLE AVX2_M)
  54. if (AVX2_M MATCHES "avx2")
  55. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx2")
  56. endif()
  57. execute_process(COMMAND grep "fma " /proc/cpuinfo OUTPUT_VARIABLE FMA_M)
  58. if (FMA_M MATCHES "fma")
  59. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfma")
  60. endif()
  61. execute_process(COMMAND grep "f16c " /proc/cpuinfo OUTPUT_VARIABLE F16C_M)
  62. if (F16C_M MATCHES "f16c")
  63. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mf16c")
  64. endif()
  65. execute_process(COMMAND grep "sse3 " /proc/cpuinfo OUTPUT_VARIABLE SSE3_M)
  66. if (SSE3_M MATCHES "sse3")
  67. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse3")
  68. endif()
  69. elseif (UNAME_S MATCHES "Haiku")
  70. message(STATUS "Haiku detected")
  71. execute_process(COMMAND sysinfo -cpu COMMAND grep "AVX " OUTPUT_VARIABLE AVX1_M)
  72. if (AVX1_M MATCHES "avx")
  73. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx")
  74. endif()
  75. execute_process(COMMAND sysinfo -cpu COMMAND grep "AVX2 " OUTPUT_VARIABLE AVX2_M)
  76. if (AVX2_M MATCHES "avx2")
  77. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx2")
  78. endif()
  79. execute_process(COMMAND sysinfo -cpu COMMAND grep "FMA " OUTPUT_VARIABLE FMA_M)
  80. if (FMA_M MATCHES "fma")
  81. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfma")
  82. endif()
  83. execute_process(COMMAND sysinfo -cpu COMMAND grep "F16C " OUTPUT_VARIABLE F16C_M)
  84. if (F16C_M MATCHES "f16c")
  85. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mf16c")
  86. endif()
  87. elseif (MSVC)
  88. if (GGML_AVX512)
  89. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:AVX512")
  90. # MSVC has no compile-time flags enabling specific
  91. # AVX512 extensions, neither it defines the
  92. # macros corresponding to the extensions.
  93. # Do it manually.
  94. if (GGML_AVX512_VBMI)
  95. add_compile_definitions(__AVX512VBMI__)
  96. endif()
  97. if (GGML_AVX512_VNNI)
  98. add_compile_definitions(__AVX512VNNI__)
  99. endif()
  100. elseif (GGML_AVX2)
  101. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:AVX2")
  102. elseif (GGML_AVX)
  103. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:AVX")
  104. endif()
  105. else()
  106. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfma -mf16c -mavx -mavx2")
  107. endif()
  108. endif()
  109. # on APPLE - include Accelerate framework
  110. if (APPLE AND NOT GGML_NO_ACCELERATE)
  111. find_library(ACCELERATE_FRAMEWORK Accelerate)
  112. if (ACCELERATE_FRAMEWORK)
  113. message(STATUS "Accelerate framework found")
  114. set(GGML_EXTRA_LIBS ${GGML_EXTRA_LIBS} ${ACCELERATE_FRAMEWORK})
  115. set(GGML_EXTRA_FLAGS ${GGML_EXTRA_FLAGS} -DGGML_USE_ACCELERATE)
  116. else()
  117. message(WARNING "Accelerate framework not found")
  118. endif()
  119. endif()
  120. if (GGML_OPENBLAS)
  121. set(OPENBLAS_INCLUDE_SEARCH_PATHS
  122. /usr/include
  123. /usr/include/openblas
  124. /usr/include/openblas-base
  125. /usr/local/include
  126. /usr/local/include/openblas
  127. /usr/local/include/openblas-base
  128. /opt/OpenBLAS/include
  129. $ENV{OpenBLAS_HOME}
  130. $ENV{OpenBLAS_HOME}/include
  131. )
  132. find_path(OPENBLAS_INC NAMES cblas.h PATHS ${OPENBLAS_INCLUDE_SEARCH_PATHS})
  133. find_library(OPENBLAS_LIB NAMES openblas libopenblas)
  134. if (OPENBLAS_LIB)
  135. message(STATUS "OpenBLAS found")
  136. set(GGML_EXTRA_LIBS ${GGML_EXTRA_LIBS} ${OPENBLAS_LIB})
  137. set(GGML_EXTRA_INCS ${GGML_EXTRA_INCS} ${OPENBLAS_INC})
  138. set(GGML_EXTRA_FLAGS ${GGML_EXTRA_FLAGS} -DGGML_USE_OPENBLAS)
  139. else()
  140. message(WARNING "OpenBLAS not found")
  141. endif()
  142. endif()
  143. # undefine NDEBUG so asserts don't get disabled in tests
  144. add_definitions(-UNDEBUG)
  145. #
  146. # test-vec0
  147. set(TEST_TARGET test-vec0)
  148. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  149. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  150. #
  151. # test-vec1 (x86)
  152. if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86")
  153. set(TEST_TARGET test-vec1)
  154. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  155. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  156. endif()
  157. #
  158. # test-vec2 (arm)
  159. if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
  160. set(TEST_TARGET test-vec2)
  161. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  162. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  163. endif()
  164. #
  165. # test-grad0
  166. set(TEST_TARGET test-grad0)
  167. add_executable(${TEST_TARGET} ${TEST_TARGET}.cpp)
  168. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  169. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  170. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  171. #
  172. # test-opt
  173. set(TEST_TARGET test-opt)
  174. add_executable(${TEST_TARGET} ${TEST_TARGET}.cpp)
  175. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  176. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  177. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  178. #
  179. # test-quantize-fns
  180. set(TEST_TARGET test-quantize-fns)
  181. add_executable(${TEST_TARGET} ${TEST_TARGET}.cpp)
  182. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  183. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  184. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  185. #
  186. # test-quantize-perf
  187. set(TEST_TARGET test-quantize-perf)
  188. add_executable(${TEST_TARGET} ${TEST_TARGET}.cpp)
  189. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  190. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  191. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  192. #
  193. # test-mul-mat0
  194. set(TEST_TARGET test-mul-mat0)
  195. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  196. target_link_libraries(${TEST_TARGET} PRIVATE ggml ${GGML_EXTRA_LIBS})
  197. if (MSVC)
  198. target_link_options(${TEST_TARGET} PRIVATE "/STACK: 8388608") # 8MB
  199. endif()
  200. target_compile_options(${TEST_TARGET} PRIVATE ${GGML_EXTRA_FLAGS})
  201. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  202. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  203. #
  204. # test-mul-mat1 (arm)
  205. if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" AND NOT GGML_NO_ACCELERATE)
  206. set(TEST_TARGET test-mul-mat1)
  207. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  208. target_link_libraries(${TEST_TARGET} PRIVATE ggml ${GGML_EXTRA_LIBS})
  209. target_compile_options(${TEST_TARGET} PRIVATE ${GGML_EXTRA_FLAGS})
  210. endif()
  211. #
  212. # test-blas0 (arm)
  213. if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" AND NOT GGML_NO_ACCELERATE)
  214. set(TEST_TARGET test-blas0)
  215. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  216. target_link_libraries(${TEST_TARGET} PRIVATE ggml ${GGML_EXTRA_LIBS})
  217. target_compile_options(${TEST_TARGET} PRIVATE ${GGML_EXTRA_FLAGS})
  218. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}> 128 128 128)
  219. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  220. endif()
  221. #
  222. # test-mul-mat2
  223. set(TEST_TARGET test-mul-mat2)
  224. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  225. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  226. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  227. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  228. #
  229. # test0
  230. set(TEST_TARGET test0)
  231. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  232. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  233. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  234. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  235. #
  236. # test1
  237. set(TEST_TARGET test1)
  238. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  239. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  240. if (MSVC)
  241. target_link_options(${TEST_TARGET} PRIVATE "/STACK: 8388608") # 8MB
  242. endif()
  243. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  244. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  245. #
  246. # test2
  247. set(TEST_TARGET test2)
  248. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  249. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  250. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  251. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  252. #
  253. # test3
  254. set(TEST_TARGET test3)
  255. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  256. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  257. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  258. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  259. #
  260. # test-pool
  261. set(TEST_TARGET test-pool)
  262. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  263. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  264. if (MSVC)
  265. target_link_options(${TEST_TARGET} PRIVATE "/STACK: 8388608") # 8MB
  266. endif()
  267. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  268. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  269. #
  270. # test-conv-transpose
  271. set(TEST_TARGET test-conv-transpose)
  272. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  273. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  274. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  275. #
  276. # test-rel-pos
  277. set(TEST_TARGET test-rel-pos)
  278. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  279. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  280. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  281. #
  282. # test-svd0 (arm/x86)
  283. if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" AND NOT GGML_NO_ACCELERATE)
  284. set(TEST_TARGET test-svd0)
  285. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  286. target_link_libraries(${TEST_TARGET} PRIVATE ggml ${GGML_EXTRA_LIBS})
  287. target_compile_options(${TEST_TARGET} PRIVATE ${GGML_EXTRA_FLAGS})
  288. elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86" AND GGML_OPENBLAS)
  289. set(TEST_TARGET test-svd0)
  290. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  291. target_link_libraries(${TEST_TARGET} PRIVATE ggml ${GGML_EXTRA_LIBS})
  292. target_compile_options(${TEST_TARGET} PRIVATE ${GGML_EXTRA_FLAGS})
  293. endif()
  294. #
  295. # test-customop
  296. set(TEST_TARGET test-customop)
  297. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  298. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  299. if (MSVC)
  300. target_link_options(${TEST_TARGET} PRIVATE "/STACK: 8388608") # 8MB
  301. endif()
  302. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  303. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")
  304. #
  305. # test-xpos
  306. set(TEST_TARGET test-xpos)
  307. add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
  308. target_link_libraries(${TEST_TARGET} PRIVATE ggml)
  309. add_test(NAME ${TEST_TARGET} COMMAND $<TARGET_FILE:${TEST_TARGET}>)
  310. set_property(TEST ${TEST_TARGET} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${TEST_TARGET}.profraw")