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 12 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  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. set(CORE ${TARGET})
  22. endif()
  23. # TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
  24. if (DEFINED TARGET_CORE)
  25. set(TARGET ${TARGET_CORE})
  26. endif ()
  27. # Force fallbacks for 32bit
  28. if (DEFINED BINARY AND DEFINED TARGET AND BINARY EQUAL 32)
  29. message(STATUS "Compiling a ${BINARY}-bit binary.")
  30. set(NO_AVX 1)
  31. if (${TARGET} STREQUAL "HASWELL" OR ${TARGET} STREQUAL "SANDYBRIDGE")
  32. set(TARGET "NEHALEM")
  33. endif ()
  34. if (${TARGET} STREQUAL "BULLDOZER" OR ${TARGET} STREQUAL "PILEDRIVER" OR ${TARGET} STREQUAL "ZEN")
  35. set(TARGET "BARCELONA")
  36. endif ()
  37. endif ()
  38. if (DEFINED TARGET)
  39. message(STATUS "Targeting the ${TARGET} architecture.")
  40. set(GETARCH_FLAGS "-DFORCE_${TARGET}")
  41. endif ()
  42. if (INTERFACE64)
  43. message(STATUS "Using 64-bit integers.")
  44. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DUSE64BITINT")
  45. endif ()
  46. if (NOT DEFINED GEMM_MULTITHREAD_THRESHOLD)
  47. set(GEMM_MULTITHREAD_THRESHOLD 4)
  48. endif ()
  49. message(STATUS "GEMM multithread threshold set to ${GEMM_MULTITHREAD_THRESHOLD}.")
  50. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DGEMM_MULTITHREAD_THRESHOLD=${GEMM_MULTITHREAD_THRESHOLD}")
  51. if (NO_AVX)
  52. message(STATUS "Disabling Advanced Vector Extensions (AVX).")
  53. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX")
  54. endif ()
  55. if (NO_AVX2)
  56. message(STATUS "Disabling Advanced Vector Extensions 2 (AVX2).")
  57. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX2")
  58. endif ()
  59. if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  60. set(GETARCH_FLAGS "${GETARCH_FLAGS} ${CMAKE_C_FLAGS_DEBUG}")
  61. endif ()
  62. if (NOT DEFINED NO_PARALLEL_MAKE)
  63. set(NO_PARALLEL_MAKE 0)
  64. endif ()
  65. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_PARALLEL_MAKE=${NO_PARALLEL_MAKE}")
  66. if (CMAKE_C_COMPILER STREQUAL loongcc)
  67. set(GETARCH_FLAGS "${GETARCH_FLAGS} -static")
  68. endif ()
  69. #if don't use Fortran, it will only compile CBLAS.
  70. if (ONLY_CBLAS)
  71. set(NO_LAPACK 1)
  72. else ()
  73. set(ONLY_CBLAS 0)
  74. endif ()
  75. # N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa
  76. if (NOT CMAKE_CROSSCOMPILING)
  77. if (NOT DEFINED NUM_CORES)
  78. include(ProcessorCount)
  79. ProcessorCount(NUM_CORES)
  80. endif()
  81. if (NOT NUM_CORES EQUAL 0)
  82. # HT?
  83. set(NUM_THREADS ${NUM_CORES})
  84. endif ()
  85. endif()
  86. if (NOT DEFINED NUM_THREADS)
  87. set(NUM_THREADS 0)
  88. endif()
  89. if (${NUM_THREADS} LESS 2)
  90. set(USE_THREAD 0)
  91. elseif(NOT DEFINED USE_THREAD)
  92. set(USE_THREAD 1)
  93. endif ()
  94. if (USE_THREAD)
  95. message(STATUS "Multi-threading enabled with ${NUM_THREADS} threads.")
  96. endif ()
  97. include("${PROJECT_SOURCE_DIR}/cmake/prebuild.cmake")
  98. if (NOT DEFINED NEED_PIC)
  99. set(NEED_PIC 1)
  100. endif ()
  101. # OS dependent settings
  102. include("${PROJECT_SOURCE_DIR}/cmake/os.cmake")
  103. # Architecture dependent settings
  104. include("${PROJECT_SOURCE_DIR}/cmake/arch.cmake")
  105. # C Compiler dependent settings
  106. include("${PROJECT_SOURCE_DIR}/cmake/cc.cmake")
  107. if (NOT NOFORTRAN)
  108. # Fortran Compiler dependent settings
  109. include("${PROJECT_SOURCE_DIR}/cmake/fc.cmake")
  110. endif ()
  111. if (BINARY64)
  112. if (INTERFACE64)
  113. # CCOMMON_OPT += -DUSE64BITINT
  114. endif ()
  115. endif ()
  116. if (NEED_PIC)
  117. if (${CMAKE_C_COMPILER} STREQUAL "IBM")
  118. set(CCOMMON_OPT "${CCOMMON_OPT} -qpic=large")
  119. else ()
  120. set(CCOMMON_OPT "${CCOMMON_OPT} -fPIC")
  121. endif ()
  122. if (NOT NOFORTRAN)
  123. if (${F_COMPILER} STREQUAL "SUN")
  124. set(FCOMMON_OPT "${FCOMMON_OPT} -pic")
  125. else ()
  126. set(FCOMMON_OPT "${FCOMMON_OPT} -fPIC")
  127. endif ()
  128. endif()
  129. endif ()
  130. if (DYNAMIC_ARCH)
  131. set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_ARCH")
  132. endif ()
  133. if (NO_LAPACK)
  134. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACK")
  135. #Disable LAPACK C interface
  136. set(NO_LAPACKE 1)
  137. endif ()
  138. if (NO_LAPACKE)
  139. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACKE")
  140. endif ()
  141. if (NO_AVX)
  142. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
  143. endif ()
  144. if (X86)
  145. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
  146. endif ()
  147. if (NO_AVX2)
  148. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX2")
  149. endif ()
  150. if (USE_THREAD)
  151. # USE_SIMPLE_THREADED_LEVEL3 = 1
  152. # NO_AFFINITY = 1
  153. set(CCOMMON_OPT "${CCOMMON_OPT} -DSMP_SERVER")
  154. if (MIPS64)
  155. if (NOT ${CORE} STREQUAL "LOONGSON3B")
  156. set(USE_SIMPLE_THREADED_LEVEL3 1)
  157. endif ()
  158. endif ()
  159. if (BIGNUMA)
  160. set(CCOMMON_OPT "${CCOMMON_OPT} -DBIGNUMA")
  161. endif ()
  162. endif ()
  163. if (NO_WARMUP)
  164. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_WARMUP")
  165. endif ()
  166. if (CONSISTENT_FPCSR)
  167. set(CCOMMON_OPT "${CCOMMON_OPT} -DCONSISTENT_FPCSR")
  168. endif ()
  169. # Only for development
  170. # set(CCOMMON_OPT "${CCOMMON_OPT} -DPARAMTEST")
  171. # set(CCOMMON_OPT "${CCOMMON_OPT} -DPREFETCHTEST")
  172. # set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_SWITCHING")
  173. # set(USE_PAPI 1)
  174. if (USE_PAPI)
  175. set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_PAPI")
  176. set(EXTRALIB "${EXTRALIB} -lpapi -lperfctr")
  177. endif ()
  178. if (DYNAMIC_THREADS)
  179. set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_THREADS")
  180. endif ()
  181. set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_CPU_NUMBER=${NUM_THREADS}")
  182. if (USE_SIMPLE_THREADED_LEVEL3)
  183. set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_SIMPLE_THREADED_LEVEL3")
  184. endif ()
  185. if (DEFINED LIBNAMESUFFIX)
  186. set(LIBPREFIX "libopenblas_${LIBNAMESUFFIX}")
  187. else ()
  188. set(LIBPREFIX "libopenblas")
  189. endif ()
  190. if (NOT DEFINED SYMBOLPREFIX)
  191. set(SYMBOLPREFIX "")
  192. endif ()
  193. if (NOT DEFINED SYMBOLSUFFIX)
  194. set(SYMBOLSUFFIX "")
  195. endif ()
  196. set(KERNELDIR "${PROJECT_SOURCE_DIR}/kernel/${ARCH}")
  197. # TODO: nead to convert these Makefiles
  198. # include ${PROJECT_SOURCE_DIR}/cmake/${ARCH}.cmake
  199. if (${CORE} STREQUAL "PPC440")
  200. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_QALLOC")
  201. endif ()
  202. if (${CORE} STREQUAL "PPC440FP2")
  203. set(STATIC_ALLOCATION 1)
  204. endif ()
  205. if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
  206. set(NO_AFFINITY 1)
  207. endif ()
  208. if (NOT X86_64 AND NOT X86 AND NOT ${CORE} STREQUAL "LOONGSON3B")
  209. set(NO_AFFINITY 1)
  210. endif ()
  211. if (NO_AFFINITY)
  212. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AFFINITY")
  213. endif ()
  214. if (FUNCTION_PROFILE)
  215. set(CCOMMON_OPT "${CCOMMON_OPT} -DFUNCTION_PROFILE")
  216. endif ()
  217. if (HUGETLB_ALLOCATION)
  218. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLB")
  219. endif ()
  220. if (DEFINED HUGETLBFILE_ALLOCATION)
  221. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=${HUGETLBFILE_ALLOCATION})")
  222. endif ()
  223. if (STATIC_ALLOCATION)
  224. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_STATIC")
  225. endif ()
  226. if (DEVICEDRIVER_ALLOCATION)
  227. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"")
  228. endif ()
  229. if (MIXED_MEMORY_ALLOCATION)
  230. set(CCOMMON_OPT "${CCOMMON_OPT} -DMIXED_MEMORY_ALLOCATION")
  231. endif ()
  232. set(REVISION "-r${OpenBLAS_VERSION}")
  233. set(MAJOR_VERSION ${OpenBLAS_MAJOR_VERSION})
  234. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CCOMMON_OPT}")
  235. if(NOT MSVC)
  236. set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CCOMMON_OPT}")
  237. endif()
  238. # TODO: not sure what PFLAGS is -hpa
  239. set(PFLAGS "${PFLAGS} ${CCOMMON_OPT} -I${TOPDIR} -DPROFILE ${COMMON_PROF}")
  240. set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${FCOMMON_OPT}")
  241. # TODO: not sure what FPFLAGS is -hpa
  242. set(FPFLAGS "${FPFLAGS} ${FCOMMON_OPT} ${COMMON_PROF}")
  243. #For LAPACK Fortran codes.
  244. set(LAPACK_FFLAGS "${LAPACK_FFLAGS} ${CMAKE_Fortran_FLAGS}")
  245. set(LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}")
  246. #Disable -fopenmp for LAPACK Fortran codes on Windows.
  247. if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  248. set(FILTER_FLAGS "-fopenmp;-mp;-openmp;-xopenmp=parallel")
  249. foreach (FILTER_FLAG ${FILTER_FLAGS})
  250. string(REPLACE ${FILTER_FLAG} "" LAPACK_FFLAGS ${LAPACK_FFLAGS})
  251. string(REPLACE ${FILTER_FLAG} "" LAPACK_FPFLAGS ${LAPACK_FPFLAGS})
  252. endforeach ()
  253. endif ()
  254. if ("${F_COMPILER}" STREQUAL "GFORTRAN")
  255. # lapack-netlib is rife with uninitialized warnings -hpa
  256. set(LAPACK_FFLAGS "${LAPACK_FFLAGS} -Wno-maybe-uninitialized")
  257. endif ()
  258. set(LAPACK_CFLAGS "${CMAKE_C_CFLAGS} -DHAVE_LAPACK_CONFIG_H")
  259. if (INTERFACE64)
  260. set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_ILP64")
  261. endif ()
  262. if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  263. set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DOPENBLAS_OS_WINDOWS")
  264. endif ()
  265. if (${CMAKE_C_COMPILER} STREQUAL "LSB" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  266. set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_COMPLEX_STRUCTURE")
  267. endif ()
  268. if (NOT DEFINED SUFFIX)
  269. set(SUFFIX o)
  270. endif ()
  271. if (NOT DEFINED PSUFFIX)
  272. set(PSUFFIX po)
  273. endif ()
  274. if (NOT DEFINED LIBSUFFIX)
  275. set(LIBSUFFIX a)
  276. endif ()
  277. if (DYNAMIC_ARCH)
  278. if (USE_THREAD)
  279. set(LIBNAME "${LIBPREFIX}p${REVISION}.${LIBSUFFIX}")
  280. set(LIBNAME_P "${LIBPREFIX}p${REVISION}_p.${LIBSUFFIX}")
  281. else ()
  282. set(LIBNAME "${LIBPREFIX}${REVISION}.${LIBSUFFIX}")
  283. set(LIBNAME_P "${LIBPREFIX}${REVISION}_p.${LIBSUFFIX}")
  284. endif ()
  285. else ()
  286. if (USE_THREAD)
  287. set(LIBNAME "${LIBPREFIX}_${LIBCORE}p${REVISION}.${LIBSUFFIX}")
  288. set(LIBNAME_P "${LIBPREFIX}_${LIBCORE}p${REVISION}_p.${LIBSUFFIX}")
  289. else ()
  290. set(LIBNAME "${LIBPREFIX}_${LIBCORE}${REVISION}.${LIBSUFFIX}")
  291. set(LIBNAME_P "${LIBPREFIX}_${LIBCORE}${REVISION}_p.${LIBSUFFIX}")
  292. endif ()
  293. endif ()
  294. set(LIBDLLNAME "${LIBPREFIX}.dll")
  295. set(LIBSONAME "${LIBNAME}.${LIBSUFFIX}.so")
  296. set(LIBDYNNAME "${LIBNAME}.${LIBSUFFIX}.dylib")
  297. set(LIBDEFNAME "${LIBNAME}.${LIBSUFFIX}.def")
  298. set(LIBEXPNAME "${LIBNAME}.${LIBSUFFIX}.exp")
  299. set(LIBZIPNAME "${LIBNAME}.${LIBSUFFIX}.zip")
  300. set(LIBS "${PROJECT_SOURCE_DIR}/${LIBNAME}")
  301. set(LIBS_P "${PROJECT_SOURCE_DIR}/${LIBNAME_P}")
  302. set(LIB_COMPONENTS BLAS)
  303. if (NOT NO_CBLAS)
  304. set(LIB_COMPONENTS "${LIB_COMPONENTS} CBLAS")
  305. endif ()
  306. if (NOT NO_LAPACK)
  307. set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACK")
  308. if (NOT NO_LAPACKE)
  309. set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACKE")
  310. endif ()
  311. if (BUILD_RELAPACK)
  312. set(LIB_COMPONENTS "${LIB_COMPONENTS} ReLAPACK")
  313. endif ()
  314. endif ()
  315. if (ONLY_CBLAS)
  316. set(LIB_COMPONENTS CBLAS)
  317. endif ()
  318. # For GEMM3M
  319. set(USE_GEMM3M 0)
  320. if (DEFINED ARCH)
  321. if (X86 OR X86_64 OR ${ARCH} STREQUAL "ia64" OR MIPS64)
  322. set(USE_GEMM3M 1)
  323. endif ()
  324. if (${CORE} STREQUAL "generic")
  325. set(USE_GEMM3M 0)
  326. endif ()
  327. endif ()
  328. #export OSNAME
  329. #export ARCH
  330. #export CORE
  331. #export LIBCORE
  332. #export PGCPATH
  333. #export CONFIG
  334. #export CC
  335. #export FC
  336. #export BU
  337. #export FU
  338. #export NEED2UNDERSCORES
  339. #export USE_THREAD
  340. #export NUM_THREADS
  341. #export NUM_CORES
  342. #export SMP
  343. #export MAKEFILE_RULE
  344. #export NEED_PIC
  345. #export BINARY
  346. #export BINARY32
  347. #export BINARY64
  348. #export F_COMPILER
  349. #export C_COMPILER
  350. #export USE_OPENMP
  351. #export CROSS
  352. #export CROSS_SUFFIX
  353. #export NOFORTRAN
  354. #export NO_FBLAS
  355. #export EXTRALIB
  356. #export CEXTRALIB
  357. #export FEXTRALIB
  358. #export HAVE_SSE
  359. #export HAVE_SSE2
  360. #export HAVE_SSE3
  361. #export HAVE_SSSE3
  362. #export HAVE_SSE4_1
  363. #export HAVE_SSE4_2
  364. #export HAVE_SSE4A
  365. #export HAVE_SSE5
  366. #export HAVE_AVX
  367. #export HAVE_VFP
  368. #export HAVE_VFPV3
  369. #export HAVE_VFPV4
  370. #export HAVE_NEON
  371. #export KERNELDIR
  372. #export FUNCTION_PROFILE
  373. #export TARGET_CORE
  374. #
  375. #export SGEMM_UNROLL_M
  376. #export SGEMM_UNROLL_N
  377. #export DGEMM_UNROLL_M
  378. #export DGEMM_UNROLL_N
  379. #export QGEMM_UNROLL_M
  380. #export QGEMM_UNROLL_N
  381. #export CGEMM_UNROLL_M
  382. #export CGEMM_UNROLL_N
  383. #export ZGEMM_UNROLL_M
  384. #export ZGEMM_UNROLL_N
  385. #export XGEMM_UNROLL_M
  386. #export XGEMM_UNROLL_N
  387. #export CGEMM3M_UNROLL_M
  388. #export CGEMM3M_UNROLL_N
  389. #export ZGEMM3M_UNROLL_M
  390. #export ZGEMM3M_UNROLL_N
  391. #export XGEMM3M_UNROLL_M
  392. #export XGEMM3M_UNROLL_N
  393. #if (USE_CUDA)
  394. # export CUDADIR
  395. # export CUCC
  396. # export CUFLAGS
  397. # export CULIB
  398. #endif