You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

system.cmake 26 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862
  1. ##
  2. ## Author: Hank Anderson <hank@statease.com>
  3. ## Description: Ported from OpenBLAS/Makefile.system
  4. ##
  5. set(NETLIB_LAPACK_DIR "${PROJECT_SOURCE_DIR}/lapack-netlib")
  6. # System detection, via CMake.
  7. include("${PROJECT_SOURCE_DIR}/cmake/system_check.cmake")
  8. if(CMAKE_CROSSCOMPILING AND NOT DEFINED TARGET)
  9. # Detect target without running getarch
  10. if (ARM64)
  11. set(TARGET "ARMV8")
  12. elseif(ARM)
  13. set(TARGET "ARMV7") # TODO: Ask compiler which arch this is
  14. else()
  15. message(FATAL_ERROR "When cross compiling, a TARGET is required.")
  16. endif()
  17. endif()
  18. # Other files expect CORE, which is actually TARGET and will become TARGET_CORE for kernel build. Confused yet?
  19. # It seems we are meant to use TARGET as input and CORE internally as kernel.
  20. if(NOT DEFINED CORE AND DEFINED TARGET)
  21. if (${TARGET} STREQUAL "LOONGSON3R5")
  22. set(CORE "LA464")
  23. elseif (${TARGET} STREQUAL "LOONGSON2K1000")
  24. set(CORE "LA264")
  25. elseif (${TARGET} STREQUAL "LOONGSONGENERIC")
  26. set(CORE "LA64_GENERIC)")
  27. else ()
  28. set(CORE ${TARGET})
  29. endif()
  30. endif()
  31. # TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
  32. if (DEFINED TARGET_CORE)
  33. set(TARGET ${TARGET_CORE})
  34. endif ()
  35. # Force fallbacks for 32bit
  36. if (DEFINED BINARY AND DEFINED TARGET AND BINARY EQUAL 32)
  37. message(STATUS "Compiling a ${BINARY}-bit binary.")
  38. set(NO_AVX 1)
  39. if (${TARGET} STREQUAL "HASWELL" OR ${TARGET} STREQUAL "SANDYBRIDGE" OR ${TARGET} STREQUAL "SKYLAKEX" OR ${TARGET} STREQUAL "COOPERLAKE" OR ${TARGET} STREQUAL "SAPPHIRERAPIDS")
  40. set(TARGET "NEHALEM")
  41. endif ()
  42. if (${TARGET} STREQUAL "BULLDOZER" OR ${TARGET} STREQUAL "PILEDRIVER" OR ${TARGET} STREQUAL "ZEN")
  43. set(TARGET "BARCELONA")
  44. endif ()
  45. if (${TARGET} STREQUAL "ARMV8" OR ${TARGET} STREQUAL "CORTEXA57" OR ${TARGET} STREQUAL "CORTEXA53" OR ${TARGET} STREQUAL "CORTEXA55")
  46. set(TARGET "ARMV7")
  47. endif ()
  48. if (${TARGET} STREQUAL "POWER8" OR ${TARGET} STREQUAL "POWER9" OR ${TARGET} STREQUAL "POWER10")
  49. set(TARGET "POWER6")
  50. endif ()
  51. endif ()
  52. if (DEFINED TARGET)
  53. message(STATUS "-- -- -- -- -- -- -- -- -- -- -- -- --")
  54. message(STATUS "Targeting the ${TARGET} architecture.")
  55. set(GETARCH_FLAGS "-DFORCE_${TARGET}")
  56. endif ()
  57. # On x86_64 build getarch with march=native. This is required to detect AVX512 support in getarch.
  58. if (X86_64 AND NOT (${CMAKE_C_COMPILER_ID} STREQUAL "PGI" OR ${CMAKE_C_COMPILER_ID} STREQUAL "NVHPC"))
  59. set(GETARCH_FLAGS "${GETARCH_FLAGS} -march=native")
  60. endif ()
  61. # On x86 no AVX support is available
  62. if (X86 OR X86_64)
  63. if ((DEFINED BINARY AND BINARY EQUAL 32) OR ("$CMAKE_SIZEOF_VOID_P}" EQUAL "4"))
  64. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX -DNO_AVX2 -DNO_AVX512")
  65. endif ()
  66. endif ()
  67. if (INTERFACE64)
  68. message(STATUS "Using 64-bit integers.")
  69. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DUSE64BITINT")
  70. endif ()
  71. if (NOT DEFINED GEMM_MULTITHREAD_THRESHOLD)
  72. set(GEMM_MULTITHREAD_THRESHOLD 4)
  73. endif ()
  74. message(STATUS "GEMM multithread threshold set to ${GEMM_MULTITHREAD_THRESHOLD}.")
  75. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DGEMM_MULTITHREAD_THRESHOLD=${GEMM_MULTITHREAD_THRESHOLD}")
  76. if (NO_AVX)
  77. message(STATUS "Disabling Advanced Vector Extensions (AVX).")
  78. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX")
  79. endif ()
  80. if (NO_AVX2)
  81. message(STATUS "Disabling Advanced Vector Extensions 2 (AVX2).")
  82. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX2")
  83. endif ()
  84. if (NO_AVX512)
  85. message(STATUS "Disabling Advanced Vector Extensions 512 (AVX512).")
  86. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX512")
  87. endif ()
  88. if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  89. set(GETARCH_FLAGS "${GETARCH_FLAGS} ${CMAKE_C_FLAGS_DEBUG}")
  90. endif ()
  91. if (NOT DEFINED NO_PARALLEL_MAKE)
  92. set(NO_PARALLEL_MAKE 0)
  93. endif ()
  94. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_PARALLEL_MAKE=${NO_PARALLEL_MAKE}")
  95. if (CMAKE_C_COMPILER STREQUAL loongcc)
  96. set(GETARCH_FLAGS "${GETARCH_FLAGS} -static")
  97. endif ()
  98. if (POWER)
  99. set(NO_WARMUP 1)
  100. set(HAVE_GAS 1)
  101. if (CMAKE_ASM_COMPILER_ID STREQUAL "GNU")
  102. set(HAVE_GAS 0)
  103. elseif (CMAKE_ASM_COMPILER_ID STREQUAL "Clang")
  104. set(CCOMMON_OPT "${CCOMMON_OPT} -fno-integrated-as")
  105. set(HAVE_GAS 0)
  106. endif ()
  107. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DHAVE_GAS=${HAVE_GAS}")
  108. endif ()
  109. #if don't use Fortran, it will only compile CBLAS.
  110. if (ONLY_CBLAS)
  111. set(NO_LAPACK 1)
  112. else ()
  113. set(ONLY_CBLAS 0)
  114. endif ()
  115. # N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa
  116. if (NOT CMAKE_CROSSCOMPILING)
  117. if (NOT DEFINED NUM_CORES)
  118. include(ProcessorCount)
  119. ProcessorCount(NUM_CORES)
  120. endif()
  121. endif()
  122. if (NOT DEFINED NUM_PARALLEL)
  123. set(NUM_PARALLEL 1)
  124. endif()
  125. if (NOT DEFINED NUM_THREADS)
  126. if (DEFINED NUM_CORES AND NOT NUM_CORES EQUAL 0)
  127. # HT?
  128. set(NUM_THREADS ${NUM_CORES})
  129. else ()
  130. set(NUM_THREADS 0)
  131. endif ()
  132. endif()
  133. if (${NUM_THREADS} LESS 2)
  134. set(USE_THREAD 0)
  135. elseif(NOT DEFINED USE_THREAD)
  136. set(USE_THREAD 1)
  137. endif ()
  138. if (USE_THREAD)
  139. message(STATUS "Multi-threading enabled with ${NUM_THREADS} threads.")
  140. else()
  141. if (${USE_LOCKING})
  142. set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_LOCKING")
  143. endif ()
  144. endif ()
  145. if (C_LAPACK)
  146. if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
  147. set(CCOMMON_OPT "${CCOMMON_OPT} -Wno-error=incompatible-pointer-types")
  148. endif ()
  149. endif ()
  150. include("${PROJECT_SOURCE_DIR}/cmake/prebuild.cmake")
  151. if (DEFINED TARGET)
  152. if (${TARGET} STREQUAL COOPERLAKE AND NOT NO_AVX512)
  153. if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
  154. if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 10.09)
  155. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=cooperlake")
  156. else()
  157. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512")
  158. endif()
  159. elseif (${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_C_COMPILER_ID} STREQUAL "AppleClang")
  160. if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 8.99)
  161. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=cooperlake -mllvm -exhaustive-register-search")
  162. else()
  163. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512 -mllvm -exhaustive-register-search")
  164. endif()
  165. endif()
  166. endif()
  167. if (${TARGET} STREQUAL SAPPHIRERAPIDS AND NOT NO_AVX512)
  168. if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
  169. if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 11.0)
  170. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=sapphirerapids")
  171. else()
  172. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512")
  173. endif()
  174. elseif (${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_C_COMPILER_ID} STREQUAL "AppleClang")
  175. if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 12.0)
  176. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=sapphirerapids -mllvm -exhaustive-register-search")
  177. else()
  178. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512 -mllvm -exhaustive-register-search")
  179. endif()
  180. endif()
  181. endif()
  182. if (${TARGET} STREQUAL SKYLAKEX AND NOT NO_AVX512)
  183. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512")
  184. if (${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_C_COMPILER_ID} STREQUAL "AppleClang")
  185. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mllvm -exhaustive-register-search")
  186. endif()
  187. endif()
  188. if (((${TARGET} STREQUAL ZEN) AND HAVE_AVX512VL) AND NOT NO_AVX512)
  189. if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
  190. if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 12.99)
  191. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=znver4")
  192. else()
  193. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512")
  194. endif()
  195. elseif (${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_C_COMPILER_ID} STREQUAL "AppleClang")
  196. if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 15.99)
  197. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=znver4")
  198. else()
  199. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512")
  200. endif()
  201. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mllvm -exhaustive-register-search")
  202. endif()
  203. endif()
  204. if ((${TARGET} STREQUAL HASWELL OR (${TARGET} STREQUAL ZEN AND NOT HAVE_AVX512VL)) AND NOT NO_AVX2)
  205. if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
  206. if (CMAKE_C_COMPILER_VERSION VERSION_GREATER 4.7 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 4.7)
  207. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx2")
  208. endif()
  209. elseif (${CMAKE_C_COMPILER_ID} STREQUAL "CLANG")
  210. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx2 -mfma")
  211. endif()
  212. endif()
  213. if (DEFINED HAVE_AVX)
  214. if (NOT NO_AVX)
  215. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx")
  216. endif()
  217. endif()
  218. if (DEFINED HAVE_AVX2)
  219. if (NOT NO_AVX2)
  220. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx2")
  221. endif()
  222. endif()
  223. # if (DEFINED HAVE_FMA3)
  224. # if (NOT NO_AVX2)
  225. # set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mfma")
  226. # endif()
  227. # endif()
  228. if (DEFINED HAVE_SSE)
  229. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse")
  230. endif()
  231. if (DEFINED HAVE_SSE2)
  232. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse2")
  233. endif()
  234. if (DEFINED HAVE_SSE3)
  235. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse3")
  236. endif()
  237. if (DEFINED HAVE_SSSE3)
  238. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mssse3")
  239. endif()
  240. if (DEFINED HAVE_SSE4_1)
  241. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse4.1")
  242. endif()
  243. if (${TARGET} STREQUAL POWER10)
  244. if (CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.2 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 10.2)
  245. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=power10 -mtune=power10 -mvsx -fno-fast-math")
  246. else ()
  247. message(FATAL_ERROR "Compiler GCC ${CMAKE_C_COMPILER_VERSION} does not support Power10.")
  248. endif()
  249. endif()
  250. if (${TARGET} STREQUAL POWER9)
  251. if (CMAKE_C_COMPILER_VERSION VERSION_GREATER 5.0 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 5.0)
  252. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=power9 -mtune=power9 -mvsx -fno-fast-math")
  253. else ()
  254. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math")
  255. message(WARNING "Compiler GCC ${CMAKE_C_COMPILER_VERSION} does not support fully Power9.")
  256. endif()
  257. endif()
  258. if (${TARGET} STREQUAL POWER8)
  259. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math")
  260. endif()
  261. if (${TARGET} STREQUAL NEOVERSEV1)
  262. if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI" AND NOT NO_SVE)
  263. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -Msve_intrinsics -march=armv8.4-a+sve -mtune=neoverse-v1")
  264. else ()
  265. if (CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.4 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 10.4)
  266. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.4-a+sve -mtune=neoverse-v1")
  267. else ()
  268. message(FATAL_ERROR "Compiler ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_VERSION} does not support Neoverse V1.")
  269. endif()
  270. endif()
  271. endif()
  272. if (${TARGET} STREQUAL NEOVERSEN2)
  273. if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI" AND NOT NO_SVE)
  274. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -Msve-intrinsics -march=armv8.5-a+sve+sve2+bf16 -mtune=neoverse-n2")
  275. else ()
  276. if (CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.4 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 10.4)
  277. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.5-a+sve+sve2+bf16 -mtune=neoverse-n2")
  278. else ()
  279. message(FATAL_ERROR "Compiler $${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_VERSION} does not support Neoverse N2.")
  280. endif()
  281. endif()
  282. endif()
  283. if (${TARGET} STREQUAL ARMV8SVE)
  284. if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI" AND NOT NO_SVE)
  285. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -Msve-intrinsics -march=armv8.2-a+sve")
  286. else ()
  287. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.2-a+sve")
  288. endif()
  289. endif()
  290. if (${TARGET} STREQUAL ARMV9SME)
  291. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv9-a+sme -O3")
  292. endif()
  293. if (${TARGET} STREQUAL A64FX)
  294. if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI" AND NOT NO_SVE)
  295. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -Msve-intrinsics -march=armv8.2-a+sve -mtune=a64fx")
  296. else ()
  297. execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
  298. if (${GCC_VERSION} VERSION_GREATER 10.4 OR ${GCC_VERSION} VERSION_EQUAL 10.4)
  299. set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.2-a+sve -mtune=a64fx")
  300. else ()
  301. message(FATAL_ERROR "Compiler $${CMAKE_C_COMPILER} {GCC_VERSION} does not support A64FX.")
  302. endif()
  303. endif()
  304. endif()
  305. endif()
  306. if (DEFINED BINARY)
  307. message(STATUS "Compiling a ${BINARY}-bit binary.")
  308. endif ()
  309. if (NOT DEFINED NEED_PIC)
  310. set(NEED_PIC 1)
  311. endif ()
  312. # OS dependent settings
  313. include("${PROJECT_SOURCE_DIR}/cmake/os.cmake")
  314. # Architecture dependent settings
  315. include("${PROJECT_SOURCE_DIR}/cmake/arch.cmake")
  316. # C Compiler dependent settings
  317. include("${PROJECT_SOURCE_DIR}/cmake/cc.cmake")
  318. if (INTERFACE64)
  319. set(SUFFIX64 64)
  320. set(SUFFIX64_UNDERSCORE _64)
  321. endif()
  322. if (NOT NOFORTRAN)
  323. # Fortran Compiler dependent settings
  324. include("${PROJECT_SOURCE_DIR}/cmake/fc.cmake")
  325. else ()
  326. if (NOT XXXX)
  327. set(C_LAPACK 1)
  328. if (INTERFACE64)
  329. set (CCOMMON_OPT "${CCOMMON_OPT} -DLAPACK_ILP64")
  330. endif ()
  331. set(TIMER "NONE")
  332. else ()
  333. set (NO_LAPACK 1)
  334. endif ()
  335. endif ()
  336. if (USE_OPENMP)
  337. find_package(OpenMP COMPONENTS C REQUIRED)
  338. set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_OPENMP")
  339. if (NOT NOFORTRAN)
  340. find_package(OpenMP COMPONENTS Fortran REQUIRED)
  341. # Avoid mixed OpenMP linkage
  342. get_target_property(OMP_C_LIB OpenMP::OpenMP_C INTERFACE_LINK_LIBRARIES)
  343. get_target_property(OMP_Fortran_LIB OpenMP::OpenMP_Fortran INTERFACE_LINK_LIBRARIES)
  344. if (NOT OMP_C_LIB STREQUAL OMP_Fortran_LIB)
  345. message(FATAL_ERROR "Multiple OpenMP runtime libraries detected. Mixed OpenMP runtime linkage is dangerous. You may pass -DOpenMP_LANG_LIB_NAMES and -DOpenMP_omp_LIBRARY to manually choose the OpenMP library.")
  346. endif()
  347. endif ()
  348. endif ()
  349. if (BINARY64)
  350. if (INTERFACE64)
  351. # CCOMMON_OPT += -DUSE64BITINT
  352. endif ()
  353. endif ()
  354. if(EMBEDDED)
  355. set(CCOMMON_OPT "${CCOMMON_OPT} -DOS_EMBEDDED")
  356. set(CCOMMON_OPT "${CCOMMON_OPT} -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16")
  357. endif()
  358. if (NEED_PIC)
  359. if (${CMAKE_C_COMPILER} STREQUAL "IBM")
  360. set(CCOMMON_OPT "${CCOMMON_OPT} -qpic=large")
  361. else ()
  362. set(CCOMMON_OPT "${CCOMMON_OPT} -fPIC")
  363. endif ()
  364. if (NOT NOFORTRAN)
  365. if (${F_COMPILER} STREQUAL "SUN")
  366. set(FCOMMON_OPT "${FCOMMON_OPT} -pic")
  367. elseif (${F_COMPILER} STREQUAL "NAGFOR")
  368. set(FCOMMON_OPT "${FCOMMON_OPT} -PIC")
  369. else ()
  370. set(FCOMMON_OPT "${FCOMMON_OPT} -fPIC")
  371. endif ()
  372. endif()
  373. endif ()
  374. if (X86_64 OR ${CORE} STREQUAL POWER10 OR ARM64 OR LOONGARCH64)
  375. set(SMALL_MATRIX_OPT TRUE)
  376. endif ()
  377. if (ARM64)
  378. set(GEMM_GEMV_FORWARD TRUE)
  379. endif ()
  380. if (GEMM_GEMV_FORWARD AND NOT ONLY_CBLAS)
  381. set(CCOMMON_OPT "${CCOMMON_OPT} -DGEMM_GEMV_FORWARD")
  382. endif ()
  383. if (GEMM_GEMV_FORWARD_BF16 AND NOT ONLY_CBLAS)
  384. set(CCOMMON_OPT "${CCOMMON_OPT} -DGEMM_GEMV_FORWARD_BF16")
  385. endif ()
  386. if (SMALL_MATRIX_OPT)
  387. set(CCOMMON_OPT "${CCOMMON_OPT} -DSMALL_MATRIX_OPT")
  388. endif ()
  389. if (DYNAMIC_ARCH)
  390. if (X86 OR X86_64 OR ARM64 OR POWER OR RISCV64 OR LOONGARCH64)
  391. set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_ARCH")
  392. if (DYNAMIC_OLDER)
  393. set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_OLDER")
  394. endif ()
  395. else ()
  396. unset (DYNAMIC_ARCH)
  397. message (STATUS "DYNAMIC_ARCH is not supported on the target architecture, removing")
  398. endif ()
  399. endif ()
  400. if (DYNAMIC_LIST)
  401. set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_LIST")
  402. foreach(DCORE ${DYNAMIC_LIST})
  403. set(CCOMMON_OPT "${CCOMMON_OPT} -DDYN_${DCORE}")
  404. endforeach ()
  405. endif ()
  406. if (NO_LAPACK)
  407. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACK")
  408. #Disable LAPACK C interface
  409. set(NO_LAPACKE 1)
  410. endif ()
  411. if (NO_LAPACKE)
  412. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACKE")
  413. endif ()
  414. if (NO_AVX)
  415. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
  416. endif ()
  417. if (X86)
  418. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
  419. endif ()
  420. if (NO_AVX2)
  421. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX2")
  422. endif ()
  423. if (NO_AVX512)
  424. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX512")
  425. endif ()
  426. if (USE_THREAD)
  427. # USE_SIMPLE_THREADED_LEVEL3 = 1
  428. # NO_AFFINITY = 1
  429. set(CCOMMON_OPT "${CCOMMON_OPT} -DSMP_SERVER")
  430. if (MIPS64)
  431. if (NOT ${CORE} STREQUAL "LOONGSON3B")
  432. set(USE_SIMPLE_THREADED_LEVEL3 1)
  433. endif ()
  434. endif ()
  435. if (BIGNUMA)
  436. set(CCOMMON_OPT "${CCOMMON_OPT} -DBIGNUMA")
  437. endif ()
  438. endif ()
  439. if (NO_WARMUP)
  440. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_WARMUP")
  441. endif ()
  442. if (CONSISTENT_FPCSR)
  443. set(CCOMMON_OPT "${CCOMMON_OPT} -DCONSISTENT_FPCSR")
  444. endif ()
  445. if (USE_TLS)
  446. set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_TLS")
  447. endif ()
  448. # Only for development
  449. # set(CCOMMON_OPT "${CCOMMON_OPT} -DPARAMTEST")
  450. # set(CCOMMON_OPT "${CCOMMON_OPT} -DPREFETCHTEST")
  451. # set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_SWITCHING")
  452. # set(USE_PAPI 1)
  453. if (USE_PAPI)
  454. set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_PAPI")
  455. set(EXTRALIB "${EXTRALIB} -lpapi -lperfctr")
  456. endif ()
  457. if (DYNAMIC_THREADS)
  458. set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_THREADS")
  459. endif ()
  460. set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_CPU_NUMBER=${NUM_THREADS}")
  461. set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_PARALLEL_NUMBER=${NUM_PARALLEL}")
  462. if (BUFFERSIZE)
  463. set(CCOMMON_OPT "${CCOMMON_OPT} -DBUFFERSIZE=${BUFFERSIZE}")
  464. endif ()
  465. if (USE_SIMPLE_THREADED_LEVEL3)
  466. set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_SIMPLE_THREADED_LEVEL3")
  467. endif ()
  468. if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  469. if (DEFINED MAX_STACK_ALLOC)
  470. if (NOT ${MAX_STACK_ALLOC} EQUAL 0)
  471. set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_STACK_ALLOC=${MAX_STACK_ALLOC}")
  472. endif ()
  473. else ()
  474. set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_STACK_ALLOC=2048")
  475. endif ()
  476. endif ()
  477. if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  478. if (DEFINED BLAS3_MEM_ALLOC_THRESHOLD)
  479. if (NOT ${BLAS3_MEM_ALLOC_THRESHOLD} EQUAL 32)
  480. set(CCOMMON_OPT "${CCOMMON_OPT} -DBLAS3_MEM_ALLOC_THRESHOLD=${BLAS3_MEM_ALLOC_THRESHOLD}")
  481. endif()
  482. endif()
  483. endif()
  484. set(LIBPREFIX "lib${LIBNAMEPREFIX}openblas")
  485. if (DEFINED LIBNAMESUFFIX)
  486. set(LIBPREFIX "${LIBNAMEPREFIX}_${LIBNAMESUFFIX}")
  487. endif ()
  488. if (NOT DEFINED SYMBOLPREFIX)
  489. set(SYMBOLPREFIX "")
  490. endif ()
  491. if (NOT DEFINED SYMBOLSUFFIX)
  492. set(SYMBOLSUFFIX "")
  493. endif ()
  494. set(KERNELDIR "${PROJECT_SOURCE_DIR}/kernel/${ARCH}")
  495. # TODO: need to convert these Makefiles
  496. # include ${PROJECT_SOURCE_DIR}/cmake/${ARCH}.cmake
  497. if (${CORE} STREQUAL "PPC440")
  498. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_QALLOC")
  499. endif ()
  500. if (${CORE} STREQUAL "PPC440FP2")
  501. set(STATIC_ALLOCATION 1)
  502. endif ()
  503. if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
  504. set(NO_AFFINITY 1)
  505. endif ()
  506. if (NOT X86_64 AND NOT X86 AND NOT ${CORE} STREQUAL "LOONGSON3B")
  507. set(NO_AFFINITY 1)
  508. endif ()
  509. if (NO_AFFINITY)
  510. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AFFINITY")
  511. endif ()
  512. if (FUNCTION_PROFILE)
  513. set(CCOMMON_OPT "${CCOMMON_OPT} -DFUNCTION_PROFILE")
  514. endif ()
  515. if (HUGETLB_ALLOCATION)
  516. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLB")
  517. endif ()
  518. if (DEFINED HUGETLBFILE_ALLOCATION)
  519. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=${HUGETLBFILE_ALLOCATION})")
  520. endif ()
  521. if (STATIC_ALLOCATION)
  522. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_STATIC")
  523. endif ()
  524. if (DEVICEDRIVER_ALLOCATION)
  525. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"")
  526. endif ()
  527. if (MIXED_MEMORY_ALLOCATION)
  528. set(CCOMMON_OPT "${CCOMMON_OPT} -DMIXED_MEMORY_ALLOCATION")
  529. endif ()
  530. set(CCOMMON_OPT "${CCOMMON_OPT} -DVERSION=\"\\\"${OpenBLAS_VERSION}\\\"\"")
  531. set(REVISION "-r${OpenBLAS_VERSION}")
  532. set(MAJOR_VERSION ${OpenBLAS_MAJOR_VERSION})
  533. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CCOMMON_OPT}")
  534. if (NOT BUILD_SINGLE AND NOT BUILD_DOUBLE AND NOT BUILD_COMPLEX AND NOT BUILD_COMPLEX16)
  535. set (BUILD_SINGLE ON)
  536. set (BUILD_DOUBLE ON)
  537. set (BUILD_COMPLEX ON)
  538. set (BUILD_COMPLEX16 ON)
  539. endif()
  540. if (BUILD_SINGLE)
  541. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_SINGLE")
  542. endif()
  543. if (BUILD_DOUBLE)
  544. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_DOUBLE")
  545. endif()
  546. if (BUILD_COMPLEX)
  547. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_COMPLEX")
  548. endif()
  549. if (BUILD_COMPLEX16)
  550. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_COMPLEX16")
  551. endif()
  552. if (BUILD_BFLOAT16)
  553. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_BFLOAT16")
  554. endif()
  555. if(NOT MSVC)
  556. set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CCOMMON_OPT}")
  557. endif()
  558. # TODO: not sure what PFLAGS is -hpa
  559. set(PFLAGS "${PFLAGS} ${CCOMMON_OPT} -I${TOPDIR} -DPROFILE ${COMMON_PROF}")
  560. if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
  561. if ("${F_COMPILER}" STREQUAL "FLANG")
  562. if (${CMAKE_Fortran_COMPILER_VERSION} VERSION_LESS_EQUAL 3)
  563. set(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fno-unroll-loops")
  564. endif ()
  565. endif ()
  566. if (ARM64 AND CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang.*" AND CMAKE_SYSTEM_NAME STREQUAL "Windows")
  567. set(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -O2")
  568. endif ()
  569. endif ()
  570. set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${FCOMMON_OPT}")
  571. # TODO: not sure what FPFLAGS is -hpa
  572. set(FPFLAGS "${FPFLAGS} ${FCOMMON_OPT} ${COMMON_PROF}")
  573. #For LAPACK Fortran codes.
  574. set(LAPACK_FFLAGS "${LAPACK_FFLAGS} ${CMAKE_Fortran_FLAGS}" )
  575. if (LAPACK_STRLEN)
  576. set (LAPACK_FFLAGS "${LAPACK_FFLAGS} -DLAPACK_STRLEN=${LAPACK_STRLEN}")
  577. endif()
  578. set(LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}")
  579. if (CMAKE_Fortran_COMPILER)
  580. if ("${F_COMPILER}" STREQUAL "NAGFOR" OR "${F_COMPILER}" STREQUAL "CRAY" OR CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang.*")
  581. set(FILTER_FLAGS "-msse3;-mssse3;-msse4.1;-mavx;-mavx2,-mskylake-avx512")
  582. if (CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang.*")
  583. message(STATUS "removing fortran flags not supported by the compiler")
  584. set(FILTER_FLAGS "${FILTER_FLAGS};-m32;-m64")
  585. endif ()
  586. foreach (FILTER_FLAG ${FILTER_FLAGS})
  587. string(REPLACE ${FILTER_FLAG} "" LAPACK_FFLAGS ${LAPACK_FFLAGS})
  588. string(REPLACE ${FILTER_FLAG} "" LAPACK_FPFLAGS ${LAPACK_FPFLAGS})
  589. endforeach ()
  590. endif ()
  591. endif ()
  592. if ("${F_COMPILER}" STREQUAL "GFORTRAN")
  593. # lapack-netlib is rife with uninitialized warnings -hpa
  594. set(LAPACK_FFLAGS "${LAPACK_FFLAGS} -Wno-maybe-uninitialized")
  595. endif ()
  596. set(LAPACK_CFLAGS "${CMAKE_C_CFLAGS} -DHAVE_LAPACK_CONFIG_H")
  597. if (INTERFACE64)
  598. set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_ILP64")
  599. endif ()
  600. if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  601. set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DOPENBLAS_OS_WINDOWS")
  602. endif ()
  603. if (${CMAKE_C_COMPILER} STREQUAL "LSB" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  604. set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_COMPLEX_STRUCTURE")
  605. endif ()
  606. if (${CMAKE_C_COMPILER_ID} MATCHES "IntelLLVM" AND ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  607. set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DNOCHANGE")
  608. endif ()
  609. if (NOT DEFINED SUFFIX)
  610. set(SUFFIX o)
  611. endif ()
  612. if (NOT DEFINED PSUFFIX)
  613. set(PSUFFIX po)
  614. endif ()
  615. if (NOT DEFINED LIBSUFFIX)
  616. set(LIBSUFFIX a)
  617. endif ()
  618. if (DYNAMIC_ARCH)
  619. if (USE_THREAD)
  620. set(LIBNAME "${LIBPREFIX}p${REVISION}.${LIBSUFFIX}")
  621. set(LIBNAME_P "${LIBPREFIX}p${REVISION}_p.${LIBSUFFIX}")
  622. else ()
  623. set(LIBNAME "${LIBPREFIX}${REVISION}.${LIBSUFFIX}")
  624. set(LIBNAME_P "${LIBPREFIX}${REVISION}_p.${LIBSUFFIX}")
  625. endif ()
  626. else ()
  627. if (USE_THREAD)
  628. set(LIBNAME "${LIBPREFIX}_${LIBCORE}p${REVISION}.${LIBSUFFIX}")
  629. set(LIBNAME_P "${LIBPREFIX}_${LIBCORE}p${REVISION}_p.${LIBSUFFIX}")
  630. else ()
  631. set(LIBNAME "${LIBPREFIX}_${LIBCORE}${REVISION}.${LIBSUFFIX}")
  632. set(LIBNAME_P "${LIBPREFIX}_${LIBCORE}${REVISION}_p.${LIBSUFFIX}")
  633. endif ()
  634. endif ()
  635. if (DEFINED FIXED_LIBNAME)
  636. set (LIBNAME "${LIBPREFIX}.${LIBSUFFIX}")
  637. set (LIBNAME "${LIBPREFIX}_p.${LIBSUFFIX}")
  638. endif()
  639. set(LIBDLLNAME "${LIBPREFIX}.dll")
  640. set(LIBSONAME "${LIBNAME}.${LIBSUFFIX}.so")
  641. set(LIBDYNNAME "${LIBNAME}.${LIBSUFFIX}.dylib")
  642. set(LIBDEFNAME "${LIBNAME}.${LIBSUFFIX}.def")
  643. set(LIBEXPNAME "${LIBNAME}.${LIBSUFFIX}.exp")
  644. set(LIBZIPNAME "${LIBNAME}.${LIBSUFFIX}.zip")
  645. set(LIBS "${PROJECT_SOURCE_DIR}/${LIBNAME}")
  646. set(LIBS_P "${PROJECT_SOURCE_DIR}/${LIBNAME_P}")
  647. set(LIB_COMPONENTS BLAS)
  648. if (NOT NO_CBLAS)
  649. set(LIB_COMPONENTS "${LIB_COMPONENTS} CBLAS")
  650. endif ()
  651. if (NOT NO_LAPACK)
  652. set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACK")
  653. if (NOT NO_LAPACKE)
  654. set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACKE")
  655. endif ()
  656. if (BUILD_RELAPACK)
  657. set(LIB_COMPONENTS "${LIB_COMPONENTS} ReLAPACK")
  658. endif ()
  659. endif ()
  660. if (ONLY_CBLAS)
  661. set(LIB_COMPONENTS CBLAS)
  662. endif ()
  663. # For GEMM3M
  664. set(USE_GEMM3M 0)
  665. if (DEFINED ARCH)
  666. if (X86 OR X86_64 OR ${ARCH} STREQUAL "ia64" OR MIPS64)
  667. set(USE_GEMM3M 1)
  668. endif ()
  669. if (${CORE} STREQUAL "generic")
  670. set(USE_GEMM3M 0)
  671. endif ()
  672. endif ()
  673. #export OSNAME
  674. #export ARCH
  675. #export CORE
  676. #export LIBCORE
  677. #export PGCPATH
  678. #export CONFIG
  679. #export CC
  680. #export FC
  681. #export BU
  682. #export FU
  683. #export NEED2UNDERSCORES
  684. #export USE_THREAD
  685. #export NUM_THREADS
  686. #export NUM_CORES
  687. #export SMP
  688. #export MAKEFILE_RULE
  689. #export NEED_PIC
  690. #export BINARY
  691. #export BINARY32
  692. #export BINARY64
  693. #export F_COMPILER
  694. #export C_COMPILER
  695. #export USE_OPENMP
  696. #export CROSS
  697. #export CROSS_SUFFIX
  698. #export NOFORTRAN
  699. #export NO_FBLAS
  700. #export EXTRALIB
  701. #export CEXTRALIB
  702. #export FEXTRALIB
  703. #export HAVE_SSE
  704. #export HAVE_SSE2
  705. #export HAVE_SSE3
  706. #export HAVE_SSSE3
  707. #export HAVE_SSE4_1
  708. #export HAVE_SSE4_2
  709. #export HAVE_SSE4A
  710. #export HAVE_SSE5
  711. #export HAVE_AVX
  712. #export HAVE_VFP
  713. #export HAVE_VFPV3
  714. #export HAVE_VFPV4
  715. #export HAVE_NEON
  716. #export KERNELDIR
  717. #export FUNCTION_PROFILE
  718. #export TARGET_CORE
  719. #
  720. #export SBGEMM_UNROLL_M
  721. #export SBGEMM_UNROLL_N
  722. #export SGEMM_UNROLL_M
  723. #export SGEMM_UNROLL_N
  724. #export DGEMM_UNROLL_M
  725. #export DGEMM_UNROLL_N
  726. #export QGEMM_UNROLL_M
  727. #export QGEMM_UNROLL_N
  728. #export CGEMM_UNROLL_M
  729. #export CGEMM_UNROLL_N
  730. #export ZGEMM_UNROLL_M
  731. #export ZGEMM_UNROLL_N
  732. #export XGEMM_UNROLL_M
  733. #export XGEMM_UNROLL_N
  734. #export CGEMM3M_UNROLL_M
  735. #export CGEMM3M_UNROLL_N
  736. #export ZGEMM3M_UNROLL_M
  737. #export ZGEMM3M_UNROLL_N
  738. #export XGEMM3M_UNROLL_M
  739. #export XGEMM3M_UNROLL_N
  740. #if (USE_CUDA)
  741. # export CUDADIR
  742. # export CUCC
  743. # export CUFLAGS
  744. # export CULIB
  745. #endif