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.

cc.cmake 13 kB

2 years ago
2 years ago
5 years ago
7 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. ###############################################################################
  2. # Copyright (c) 2025, The OpenBLAS Project
  3. # All rights reserved.
  4. # Redistribution and use in source and binary forms, with or without
  5. # modification, are permitted provided that the following conditions are
  6. # met:
  7. # 1. Redistributions of source code must retain the above copyright
  8. # notice, this list of conditions and the following disclaimer.
  9. # 2. Redistributions in binary form must reproduce the above copyright
  10. # notice, this list of conditions and the following disclaimer in
  11. # the documentation and/or other materials provided with the
  12. # distribution.
  13. # 3. Neither the name of the OpenBLAS project nor the names of
  14. # its contributors may be used to endorse or promote products
  15. # derived from this software without specific prior written permission.
  16. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. # ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
  20. # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  21. # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  22. # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  23. # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  24. # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  25. # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  26. # POSSIBILITY OF SUCH DAMAGE.
  27. ###############################################################################
  28. ##
  29. ## Author: Hank Anderson <hank@statease.com>
  30. ## Description: Ported from portion of OpenBLAS/Makefile.system
  31. ## Sets C related variables.
  32. include(CheckCCompilerFlag)
  33. if (${CMAKE_C_COMPILER_ID} MATCHES "IntelLLVM")
  34. set(CCOMMON_OPT "${CCOMMON_OPT} -fp-model=consistent")
  35. set(GCC_VERSION 100)
  36. endif ()
  37. if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_C_COMPILER_ID} STREQUAL "LSB" OR ${CMAKE_C_COMPILER_ID} MATCHES "Clang")
  38. set(CCOMMON_OPT "${CCOMMON_OPT} -Wall")
  39. set(COMMON_PROF "${COMMON_PROF} -fno-inline")
  40. set(NO_UNINITIALIZED_WARN "-Wno-uninitialized")
  41. set(GCC_VERSION ${CMAKE_C_COMPILER_VERSION})
  42. if (QUIET_MAKE)
  43. set(CCOMMON_OPT "${CCOMMON_OPT} ${NO_UNINITIALIZED_WARN} -Wno-unused")
  44. endif ()
  45. if (NO_BINARY_MODE)
  46. if (MIPS32)
  47. set(CCOMMON_OPT "${CCOMMON_OPT} -mabi=32")
  48. set(BINARY_DEFINED 1)
  49. endif ()
  50. if (MIPS64)
  51. if (BINARY64)
  52. set(CCOMMON_OPT "${CCOMMON_OPT} -mabi=64")
  53. else ()
  54. set(CCOMMON_OPT "${CCOMMON_OPT} -mabi=n32")
  55. endif ()
  56. set(BINARY_DEFINED 1)
  57. endif ()
  58. if (${CORE} STREQUAL "LOONGSON3A" OR ${CORE} STREQUAL "LOONGSON3B")
  59. set(CCOMMON_OPT "${CCOMMON_OPT} -march=mips64")
  60. set(FCOMMON_OPT "${FCOMMON_OPT} -march=mips64")
  61. endif ()
  62. if (LOONGARCH64)
  63. if (BINARY64)
  64. CHECK_C_COMPILER_FLAG("-mabi=lp64d" COMPILER_SUPPORT_LP64D_ABI)
  65. if(COMPILER_SUPPORT_LP64D_ABI)
  66. set(CCOMMON_OPT "${CCOMMON_OPT} -mabi=lp64d")
  67. else()
  68. set(CCOMMON_OPT "${CCOMMON_OPT} -mabi=lp64")
  69. endif ()
  70. else ()
  71. CHECK_C_COMPILER_FLAG("-mabi=ilp32d" COMPILER_SUPPORT_ILP32D_ABI)
  72. if(COMPILER_SUPPORT_ILP32D_ABI)
  73. set(CCOMMON_OPT "${CCOMMON_OPT} -mabi=ilp32d")
  74. else()
  75. set(CCOMMON_OPT "${CCOMMON_OPT} -mabi=lp32")
  76. endif ()
  77. endif ()
  78. set(BINARY_DEFINED 1)
  79. endif ()
  80. if (CMAKE_SYSTEM_NAME STREQUAL "AIX")
  81. set(BINARY_DEFINED 1)
  82. endif ()
  83. endif ()
  84. if (NOT BINARY_DEFINED)
  85. if (BINARY64)
  86. set(CCOMMON_OPT "${CCOMMON_OPT} -m64")
  87. else ()
  88. set(CCOMMON_OPT "${CCOMMON_OPT} -m32")
  89. endif ()
  90. endif ()
  91. endif ()
  92. if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI")
  93. if (BINARY64)
  94. set(CCOMMON_OPT "${CCOMMON_OPT} -tp p7-64")
  95. else ()
  96. set(CCOMMON_OPT "${CCOMMON_OPT} -tp p7")
  97. endif ()
  98. endif ()
  99. if (${CMAKE_C_COMPILER_ID} STREQUAL "NVHPC")
  100. if (POWER)
  101. set(CCOMMON_OPT "${CCOMMON_OPT} -tp pwr8")
  102. elseif (X86_64)
  103. set(CCOMMON_OPT "${CCOMMON_OPT} -tp px")
  104. endif ()
  105. endif ()
  106. if (${CMAKE_C_COMPILER_ID} STREQUAL "PATHSCALE")
  107. if (BINARY64)
  108. set(CCOMMON_OPT "${CCOMMON_OPT} -m64")
  109. else ()
  110. set(CCOMMON_OPT "${CCOMMON_OPT} -m32")
  111. endif ()
  112. endif ()
  113. if (${CMAKE_C_COMPILER_ID} STREQUAL "OPEN64")
  114. if (MIPS64)
  115. if (NOT BINARY64)
  116. set(CCOMMON_OPT "${CCOMMON_OPT} -n32")
  117. else ()
  118. set(CCOMMON_OPT "${CCOMMON_OPT} -n64")
  119. endif ()
  120. if (${CORE} STREQUAL "LOONGSON3A")
  121. set(CCOMMON_OPT "${CCOMMON_OPT} -loongson3 -static")
  122. endif ()
  123. if (${CORE} STREQUAL "LOONGSON3B")
  124. set(CCOMMON_OPT "${CCOMMON_OPT} -loongson3 -static")
  125. endif ()
  126. else ()
  127. if (BINARY64)
  128. set(CCOMMON_OPT "${CCOMMON_OPT} -m32")
  129. else ()
  130. set(CCOMMON_OPT "${CCOMMON_OPT} -m64")
  131. endif ()
  132. endif ()
  133. endif ()
  134. if (${CMAKE_C_COMPILER_ID} STREQUAL "SUN")
  135. set(CCOMMON_OPT "${CCOMMON_OPT} -w")
  136. if (X86)
  137. set(CCOMMON_OPT "${CCOMMON_OPT} -m32")
  138. else ()
  139. set(CCOMMON_OPT "${CCOMMON_OPT} -m64")
  140. endif ()
  141. endif ()
  142. if (${CORE} STREQUAL SKYLAKEX)
  143. if (NOT DYNAMIC_ARCH)
  144. if (NOT NO_AVX512)
  145. set (CCOMMON_OPT "${CCOMMON_OPT} -march=skylake-avx512")
  146. endif ()
  147. endif ()
  148. endif ()
  149. if (${CORE} STREQUAL COOPERLAKE)
  150. if (NOT DYNAMIC_ARCH)
  151. if (NOT NO_AVX512)
  152. if (${GCC_VERSION} VERSION_GREATER 10.1 OR ${GCC_VERSION} VERSION_EQUAL 10.1)
  153. set (CCOMMON_OPT "${CCOMMON_OPT} -march=cooperlake")
  154. else ()
  155. set (CCOMMON_OPT "${CCOMMON_OPT} -march=skylake-avx512")
  156. endif()
  157. endif ()
  158. endif ()
  159. endif ()
  160. if (${CORE} STREQUAL SAPPHIRERAPIDS)
  161. if (NOT DYNAMIC_ARCH)
  162. if (NOT NO_AVX512)
  163. if (${GCC_VERSION} VERSION_GREATER 11.0 OR ${GCC_VERSION} VERSION_EQUAL 11.0)
  164. set (CCOMMON_OPT "${CCOMMON_OPT} -march=sapphirerapids")
  165. else ()
  166. set (CCOMMON_OPT "${CCOMMON_OPT} -march=skylake-avx512")
  167. endif()
  168. endif ()
  169. endif ()
  170. endif ()
  171. if (${CORE} STREQUAL ZEN)
  172. if (HAVE_AVX512VL)
  173. if (NOT DYNAMIC_ARCH)
  174. if (NOT NO_AVX512)
  175. if (${GCC_VERSION} VERSION_GREATER 13.0 OR ${GCC_VERSION} VERSION_EQUAL 13.0)
  176. set (CCOMMON_OPT "${CCOMMON_OPT} -march=znver4")
  177. else ()
  178. set (CCOMMON_OPT "${CCOMMON_OPT} -march=skylake-avx512")
  179. endif ()
  180. endif ()
  181. endif ()
  182. endif ()
  183. endif ()
  184. if (${CORE} STREQUAL A64FX)
  185. if (NOT DYNAMIC_ARCH)
  186. if (${CMAKE_C_COMPILER_ID} STREQUAL "NVC" AND NOT NO_SVE)
  187. set (CCOMMON_OPT "${CCOMMON_OPT} -tp=a64fx")
  188. elseif (${GCC_VERSION} VERSION_GREATER 11.0 OR ${GCC_VERSION} VERSION_EQUAL 11.0)
  189. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.2-a+sve -mtune=a64fx")
  190. else ()
  191. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.2-a+sve")
  192. endif()
  193. endif ()
  194. endif ()
  195. if (${CORE} STREQUAL NEOVERSEV2)
  196. if (NOT DYNAMIC_ARCH)
  197. if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI" AND NOT NO_SVE)
  198. set (CCOMMON_OPT "${CCOMMON_OPT} -Msve_intrinsics -march=armv8.5-a+sve+sve2+bf16 -mtune=neoverse-v2")
  199. elseif (${CMAKE_C_COMPILER_ID} STREQUAL "NVC" AND NOT NO_SVE)
  200. set (CCOMMON_OPT "${CCOMMON_OPT} -tp=neoverse-v2")
  201. else ()
  202. if (${GCC_VERSION} VERSION_GREATER 13.0 OR ${GCC_VERSION} VERSION_EQUAL 13.0)
  203. set (CCOMMON_OPT "${CCOMMON_OPT} -mcpu=neoverse-v2")
  204. elseif (${GCC_VERSION} VERSION_GREATER 10.4 OR ${GCC_VERSION} VERSION_EQUAL 10.4)
  205. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.4-a+sve+bf16 -mtune=neoverse-v1")
  206. else ()
  207. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.2-a+sve+bf16")
  208. endif()
  209. endif ()
  210. endif ()
  211. endif ()
  212. if (${CORE} STREQUAL NEOVERSEN2)
  213. if (NOT DYNAMIC_ARCH)
  214. if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI" AND NOT NO_SVE)
  215. set (CCOMMON_OPT "${CCOMMON_OPT} -Msve_intrinsics -march=armv8.5-a+sve+sve2+bf16 -mtune=neoverse-n2")
  216. elseif (${CMAKE_C_COMPILER_ID} STREQUAL "NVC" AND NOT NO_SVE)
  217. set (CCOMMON_OPT "${CCOMMON_OPT} -tp=neoverse-v2")
  218. else ()
  219. if (${GCC_VERSION} VERSION_GREATER 11.1 OR ${GCC_VERSION} VERSION_EQUAL 11.1)
  220. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.5-a+sve+sve2+bf16 -mtune=neoverse-n2")
  221. else ()
  222. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.2-a+sve+bf16")
  223. endif()
  224. endif ()
  225. endif ()
  226. endif ()
  227. if (${CORE} STREQUAL NEOVERSEV1)
  228. if (NOT DYNAMIC_ARCH)
  229. if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI" AND NOT NO_SVE)
  230. set (CCOMMON_OPT "${CCOMMON_OPT} -Msve_intrinsics -march=armv8.4-a+sve+bf16 -mtune=neoverse-v1")
  231. elseif (${CMAKE_C_COMPILER_ID} STREQUAL "NVC" AND NOT NO_SVE)
  232. set (CCOMMON_OPT "${CCOMMON_OPT} -tp=neoverse-v1")
  233. else ()
  234. if (${GCC_VERSION} VERSION_GREATER 10.4 OR ${GCC_VERSION} VERSION_EQUAL 10.4)
  235. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.4-a+sve+bf16 -mtune=neoverse-v1")
  236. else ()
  237. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.2-a+sve+bf16")
  238. endif()
  239. endif()
  240. endif ()
  241. endif ()
  242. if (${CORE} STREQUAL NEOVERSEN1)
  243. if (NOT DYNAMIC_ARCH)
  244. if (${CMAKE_C_COMPILER_ID} STREQUAL "NVC" AND NOT NO_SVE)
  245. set (CCOMMON_OPT "${CCOMMON_OPT} -tp=neoverse-n1")
  246. elseif (${GCC_VERSION} VERSION_GREATER 9.4 OR ${GCC_VERSION} VERSION_EQUAL 9.4)
  247. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.2-a -mtune=neoverse-n1")
  248. else ()
  249. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.2-a")
  250. endif()
  251. endif ()
  252. endif ()
  253. if (${CORE} STREQUAL AMPEREONE)
  254. if (NOT DYNAMIC_ARCH)
  255. if (${CMAKE_C_COMPILER_ID} STREQUAL "NVC")
  256. set (CCOMMON_OPT "${CCOMMON_OPT} -tp=neoverse-n1")
  257. elseif (${GCC_VERSION} VERSION_GREATER 12.1)
  258. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.6-a+crypto+crc+fp16+sha3+rng -mtune=ampereone")
  259. else ()
  260. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.6-a+fp16")
  261. endif()
  262. endif ()
  263. endif ()
  264. if (${CORE} STREQUAL ARMV8SVE)
  265. if (NOT DYNAMIC_ARCH)
  266. if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI" AND NOT NO_SVE)
  267. set (CCOMMON_OPT "${CCOMMON_OPT} -Msve_intrinsics -march=armv8-a+sve")
  268. elseif (${CMAKE_C_COMPILER_ID} STREQUAL "NVC" AND NOT NO_SVE)
  269. set (CCOMMON_OPT "${CCOMMON_OPT} -tp=host")
  270. else ()
  271. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8-a+sve")
  272. endif ()
  273. endif ()
  274. endif ()
  275. if (${CORE} STREQUAL ARMV9SME)
  276. if (NOT DYNAMIC_ARCH)
  277. if (${CMAKE_C_COMPILER_ID} STREQUAL "NVC" AND NOT NO_SVE)
  278. set (CCOMMON_OPT "${CCOMMON_OPT} -tp=host")
  279. else ()
  280. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv9-a+sme")
  281. endif ()
  282. endif ()
  283. endif ()
  284. if (${CORE} STREQUAL CORTEXA510)
  285. if (NOT DYNAMIC_ARCH)
  286. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.4-a+sve")
  287. endif ()
  288. endif ()
  289. if (${CORE} STREQUAL CORTEXA710)
  290. if (NOT DYNAMIC_ARCH)
  291. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.4-a+sve")
  292. endif ()
  293. endif ()
  294. if (${CORE} STREQUAL CORTEXX1)
  295. if (NOT DYNAMIC_ARCH)
  296. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.2-a")
  297. endif ()
  298. endif ()
  299. if (${CORE} STREQUAL CORTEXX2)
  300. if (NOT DYNAMIC_ARCH)
  301. set (CCOMMON_OPT "${CCOMMON_OPT} -march=armv8.4-a+sve")
  302. endif ()
  303. endif ()
  304. if (${CORE} STREQUAL POWER10)
  305. if (NOT DYNAMIC_ARCH)
  306. if (${GCC_VERSION} VERSION_GREATER 10.2 OR ${GCC_VERSION} VERSION_EQUAL 10.2)
  307. set (CCOMMON_OPT "${CCOMMON_OPT} -mcpu=power10 -mtune=power10 -mvsx -fno-fast-math")
  308. else ()
  309. message(FATAL_ERROR "Compiler GCC ${GCC_VERSION} does not support Power10." )
  310. endif()
  311. endif ()
  312. endif ()
  313. if (${CORE} STREQUAL POWER9)
  314. if (NOT DYNAMIC_ARCH)
  315. if (${GCC_VERSION} VERSION_GREATER 5.0 OR ${GCC_VERSION} VERSION_EQUAL 5.0)
  316. set (CCOMMON_OPT "${CCOMMON_OPT} -mcpu=power9 -mtune=power9 -mvsx -fno-fast-math")
  317. else ()
  318. set (CCOMMON_OPT "${CCOMMON_OPT} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math")
  319. message(WARNING "Compiler GCC ${GCC_VERSION} does not fully support Power9.")
  320. endif ()
  321. endif ()
  322. endif ()
  323. if (${CORE} STREQUAL POWER8)
  324. if (NOT DYNAMIC_ARCH)
  325. set (CCOMMON_OPT "${CCOMMON_OPT} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math")
  326. endif ()
  327. endif ()
  328. # With -mcpu=970 added it compiles, but library is broken, at least on macOS. If someone
  329. # tests on *BSD or Linux and adds this flag, please make sure it is not used for macOS case.
  330. if (${CORE} STREQUAL PPC970)
  331. if (NOT DYNAMIC_ARCH)
  332. set (CCOMMON_OPT "${CCOMMON_OPT} -mtune=970 -maltivec -fno-fast-math")
  333. endif ()
  334. if (APPLE)
  335. set (CCOMMON_OPT "${CCOMMON_OPT} -force_cpusubtype_ALL")
  336. endif ()
  337. endif ()
  338. # -mcpu=G4 seems to work fine, but perhaps avoid it for the sake of consistency?
  339. if (${CORE} STREQUAL PPCG4)
  340. if (NOT DYNAMIC_ARCH)
  341. set (CCOMMON_OPT "${CCOMMON_OPT} -mtune=G4 -maltivec -fno-fast-math")
  342. endif ()
  343. if (APPLE)
  344. set (CCOMMON_OPT "${CCOMMON_OPT} -force_cpusubtype_ALL")
  345. endif ()
  346. endif ()
  347. if (NOT DYNAMIC_ARCH)
  348. if (HAVE_AVX2)
  349. set (CCOMMON_OPT "${CCOMMON_OPT} -mavx2")
  350. endif ()
  351. if (HAVE_AVX)
  352. set (CCOMMON_OPT "${CCOMMON_OPT} -mavx")
  353. endif ()
  354. # if (HAVE_FMA3)
  355. #set (CCOMMON_OPT "${CCOMMON_OPT} -mfma")
  356. #endif ()
  357. if (HAVE_SSE)
  358. set (CCOMMON_OPT "${CCOMMON_OPT} -msse")
  359. endif ()
  360. if (HAVE_SSE2)
  361. set (CCOMMON_OPT "${CCOMMON_OPT} -msse2")
  362. endif ()
  363. if (HAVE_SSE3)
  364. set (CCOMMON_OPT "${CCOMMON_OPT} -msse3")
  365. endif ()
  366. if (HAVE_SSSE3)
  367. set (CCOMMON_OPT "${CCOMMON_OPT} -mssse3")
  368. endif ()
  369. if (HAVE_SSE4_1)
  370. set (CCOMMON_OPT "${CCOMMON_OPT} -msse4.1")
  371. endif ()
  372. endif()