blob: b7cfbf5ce3f50d1c88c39ce94adb25ca9f552072 [file] [log] [blame]
Austin Schuh9a24b372018-01-28 16:12:29 -08001###################################################################################################
2# #
3# This file is part of HPIPM. #
4# #
5# HPIPM -- High Performance Interior Point Method. #
6# Copyright (C) 2017 by Gianluca Frison. #
7# Developed at IMTEK (University of Freiburg) under the supervision of Moritz Diehl. #
8# All rights reserved. #
9# #
10# HPMPC is free software; you can redistribute it and/or #
11# modify it under the terms of the GNU Lesser General Public #
12# License as published by the Free Software Foundation; either #
13# version 2.1 of the License, or (at your option) any later version. #
14# #
15# HPMPC is distributed in the hope that it will be useful, #
16# but WITHOUT ANY WARRANTY; without even the implied warranty of #
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. #
18# See the GNU Lesser General Public License for more details. #
19# #
20# You should have received a copy of the GNU Lesser General Public #
21# License along with HPMPC; if not, write to the Free Software #
22# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #
23# #
24# Author: Gianluca Frison, gianluca.frison (at) imtek.uni-freiburg.de #
25# #
26###################################################################################################
27
28cmake_minimum_required(VERSION 2.8.11)
29
30project(blasfeo)
31
32enable_language(C ASM)
33
34# Target architecture
35#set(TARGET X64_INTEL_HASWELL)
36set(TARGET X64_INTEL_SANDY_BRIDGE CACHE STRING "Target architecture")
37#set(TARGET X64_INTEL_CORE)
38#set(TARGET X64_AMD_BULLDOZER)
39#set(TARGET ARMV8A_ARM_CORTEX_A57)
40#set(TARGET ARMV7A_ARM_CORTEX_A15)
41#set(TARGET GENERIC)
42
43# Linear Algebra library
44set(LA HIGH_PERFORMANCE CACHE STRING "Linear algebra optimization level")
45#set(LA REFERENCE)
46#set(LA BLAS)
47
48# BLAS and LAPACK version (for LA=BLAS in BLASFEO)
49set(REF_BLAS 0 CACHE STRING "Reference blas to use")
50#set(REF_BLAS OPENBLAS)
51#set(REF_BLAS NETLIB)
52#set(REF_BLAS MKL)
53#set(REF_BLAS BLIS)
54#set(REF_BLAS ATLAS)
55
56# Compile auxiliary functions with external dependencies (for memory allocation and printing)
57set(EXT_DEP ON CACHE BOOL "Compile external dependencies in BLASFEO")
58
59configure_file(${PROJECT_SOURCE_DIR}/blasfeo_target.h.in
60 ${CMAKE_CURRENT_SOURCE_DIR}/include/blasfeo_target.h @ONLY)
61
62# C Compiler
63# set(CC_COMPILER gcc CACHE STRING "compiler")
64#set(CC_COMPILER clang)
65#set(CC_COMPILER x86_64-w64-mingw32-gcc)
66
67# build shared library
68#set(BUILD_SHARED_LIBS ON CACHE STRING "Build shared libraries")
69
70# installation directory
71if(CMAKE_INSTALL_PREFIX MATCHES "/usr/local")
72 set(CMAKE_INSTALL_PREFIX "/opt/blasfeo")
73endif()
74
75# headers installation directory
76set(BLASFEO_HEADERS_INSTALLATION_DIRECTORY "include" CACHE STRING "Headers local installation directory")
77
78# Macro level (code size vs performance in assembly kernels): 0 (no macro), 1 (all macro but gemm kernel), 2 (all macro)
79set(MACRO_LEVEL 0)
80
81# enable runtine checks
82set(RUNTIME_CHECKS 0)
83#set(RUNTIME_CHECKS 0)
84
85# compiler flags
86if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
87 set(CMAKE_C_FLAGS "")
88 set(CMAKE_ASM_FLAGS "")
89 set(CMAKE_C_FLAGS_RELEASE "")
90 set(CMAKE_ASM_FLAGS_RELEASE "")
91 # optimization flags
92 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
93 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
94 # debugging flags
95 #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
96 #set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -g")
97endif()
98
99# search directories
100#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${BLASFEO_PATH}/include") XXX
101
102#
103if(${LA} MATCHES HIGH_PERFORMANCE)
104 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLA_HIGH_PERFORMANCE")
105endif()
106if(${LA} MATCHES REFERENCE)
107 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLA_REFERENCE")
108endif()
109if(${LA} MATCHES BLAS)
110 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLA_BLAS")
111endif()
112
113#
114if(${RUNTIME_CHECKS} MATCHES 1)
115 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDIM_CHECK")
116endif()
117
118#
119if(${EXT_DEP})
120 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DEXT_DEP")
121endif()
122
123#
124if(${MACRO_LEVEL} MATCHES 1)
125 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMACRO_LEVEL=1")
126endif()
127if(${MACRO_LEVEL} MATCHES 2)
128 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMACRO_LEVEL=2")
129endif()
130
131#
132if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
133 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DOS_LINUX")
134 set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -DOS_LINUX")
135endif()
136if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
137 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DOS_MAC")
138 set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -DOS_MAC")
139endif()
140if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
141 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DOS_WINDOWS")
142 set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -DOS_WINDOWS")
143endif()
144
145#
146if(${REF_BLAS} MATCHES 0)
147 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ")
148endif(${REF_BLAS} MATCHES 0)
149if(${REF_BLAS} MATCHES OPENBLAS)
150 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DREF_BLAS_OPENBLAS -I/opt/openblas/include")
151endif(${REF_BLAS} MATCHES OPENBLAS)
152if(${REF_BLAS} MATCHES BLIS)
153 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DREF_BLAS_BLIS -std=c99")
154endif(${REF_BLAS} MATCHES BLIS)
155if(${REF_BLAS} MATCHES NETLIB)
156 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DREF_BLAS_NETLIB")
157endif(${REF_BLAS} MATCHES NETLIB)
158if(${REF_BLAS} MATCHES MKL)
159 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DREF_BLAS_MKL -m64 -I/opt/intel/mkl/include")
160endif(${REF_BLAS} MATCHES MKL)
161if(${REF_BLAS} MATCHES ATLAS)
162 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DREF_BLAS_ATLAS")
163endif(${REF_BLAS} MATCHES ATLAS)
164
165# architecture-specific flags
166if(${TARGET} MATCHES X64_INTEL_HASWELL)
167 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTARGET_X64_INTEL_HASWELL")
168 if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
169 set()
170 endif()
171endif()
172
173if(${TARGET} MATCHES X64_INTEL_SANDY_BRIDGE)
174 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTARGET_X64_INTEL_SANDY_BRIDGE")
175 if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
176 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64 -mavx")
177 endif()
178endif()
179
180if(${TARGET} MATCHES X64_INTEL_CORE)
181 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTARGET_X64_INTEL_CORE")
182 if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
183 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64 -msse3")
184 endif()
185endif()
186
187if(${TARGET} MATCHES X64_AMD_BULLDOZER)
188 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTARGET_X64_AMD_BULLDOZER")
189 if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
190 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64 -mavx -mfma")
191 endif()
192endif()
193
194if(${TARGET} MATCHES ARMV8A_ARM_CORTEX_A57)
195 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTARGET_ARMV8A_ARM_CORTEX_A57")
196 set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -DTARGET_ARMV8A_ARM_CORTEX_A57")
197 if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
198 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crc+crypto+fp+simd")
199 endif()
200endif()
201
202if(${TARGET} MATCHES ARMV7A_ARM_CORTEX_A15)
203 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTARGET_ARMV7A_ARM_CORTEX_A15")
204 set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -DTARGET_ARMV7A_ARM_CORTEX_A15")
205 if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
206 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -marm -mfloat-abi=hard -mfpu=neon-vfpv4 -mcpu=cortex-a15")
207 set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon-vfpv4")
208 endif()
209endif()
210
211if(${TARGET} MATCHES GENERIC)
212 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTARGET_GENERIC")
213endif()
214
215
216
217# source files
218
219if(${LA} MATCHES HIGH_PERFORMANCE)
220
221 if(${TARGET} MATCHES X64_INTEL_HASWELL)
222
223 file(GLOB AUX_SRC
224 ${PROJECT_SOURCE_DIR}/auxiliary/d_aux_lib4.c
225 ${PROJECT_SOURCE_DIR}/auxiliary/avx/kernel_dgecp_lib4.c
226 ${PROJECT_SOURCE_DIR}/auxiliary/avx2/kernel_dgetr_lib4.c
227 ${PROJECT_SOURCE_DIR}/auxiliary/s_aux_lib8.c
228 ${PROJECT_SOURCE_DIR}/auxiliary/m_aux_lib48.c
229 )
230
231 file(GLOB KERNEL_SRC
232 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_dgemm_12x4_lib4.S
233 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_dgemm_8x8_lib4.S
234 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_dgemm_8x4_lib4.S
235 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_dgemm_4x4_lib4.S
236 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgemm_diag_lib4.c
237 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_dgemv_8_lib4.S
238 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgemv_4_lib4.S
239 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_dsymv_6_lib4.S
240 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dsymv_4_lib4.c
241 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_dgetrf_pivot_4_lib4.c
242 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgeqrf_4_lib4.c
243 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_dgebp_lib4.S
244 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_dgelqf_4_lib4.S
245 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_sgemm_24x4_lib8.S
246 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_sgemm_16x4_lib8.S
247 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_sgemm_8x8_lib8.S
248 ${PROJECT_SOURCE_DIR}/kernel/avx2/kernel_sgemm_8x4_lib8.S
249 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgemm_diag_lib8.c
250 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgead_lib8.S
251 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgecp_lib8.S
252 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgetr_lib8.S
253 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgesc_lib8.S
254 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgemv_8_lib8.S
255 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgemv_4_lib8.S
256 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_ssymv_4_lib8.c
257 )
258
259 file(GLOB BLAS_SRC
260 ${PROJECT_SOURCE_DIR}/blas/d_blas1_lib4.c
261 ${PROJECT_SOURCE_DIR}/blas/d_blas2_lib4.c
262 ${PROJECT_SOURCE_DIR}/blas/d_blas2_diag_lib.c
263 ${PROJECT_SOURCE_DIR}/blas/d_blas3_lib4.c
264 ${PROJECT_SOURCE_DIR}/blas/d_blas3_diag_lib4.c
265 ${PROJECT_SOURCE_DIR}/blas/d_lapack_lib4.c
266 ${PROJECT_SOURCE_DIR}/blas/s_blas1_lib8.c
267 ${PROJECT_SOURCE_DIR}/blas/s_blas2_lib8.c
268 ${PROJECT_SOURCE_DIR}/blas/s_blas2_diag_lib.c
269 ${PROJECT_SOURCE_DIR}/blas/s_blas3_lib8.c
270 ${PROJECT_SOURCE_DIR}/blas/s_blas3_diag_lib8.c
271 ${PROJECT_SOURCE_DIR}/blas/s_lapack_lib8.c
272 )
273
274 endif(${TARGET} MATCHES X64_INTEL_HASWELL)
275
276 if(${TARGET} MATCHES X64_INTEL_SANDY_BRIDGE)
277
278 file(GLOB AUX_SRC
279 ${PROJECT_SOURCE_DIR}/auxiliary/d_aux_lib4.c
280 ${PROJECT_SOURCE_DIR}/auxiliary/avx/kernel_dgecp_lib4.c
281 ${PROJECT_SOURCE_DIR}/auxiliary/avx/kernel_dgetr_lib4.c
282 ${PROJECT_SOURCE_DIR}/auxiliary/s_aux_lib8.c
283 ${PROJECT_SOURCE_DIR}/auxiliary/m_aux_lib48.c
284 )
285
286 file(GLOB KERNEL_SRC
287 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgemm_8x4_lib4.S
288 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgemm_4x4_lib4.S
289 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgemm_diag_lib4.c
290 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgemv_12_lib4.S
291 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgemv_8_lib4.S
292 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgemv_4_lib4.S
293 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dsymv_6_lib4.S
294 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dsymv_4_lib4.c
295 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgetrf_pivot_4_lib4.c
296 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgeqrf_4_lib4.c
297 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgebp_lib4.S
298 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_dgelqf_4_lib4.S
299 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgemm_16x4_lib8.S
300 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgemm_8x8_lib8.S
301 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgemm_8x4_lib8.S
302 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgemm_diag_lib8.c
303 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgead_lib8.S
304 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgecp_lib8.S
305 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgetr_lib8.S
306 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgesc_lib8.S
307 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgemv_8_lib8.S
308 ${PROJECT_SOURCE_DIR}/kernel/avx/kernel_sgemv_4_lib8.S
309 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_ssymv_4_lib8.c
310 )
311
312 file(GLOB BLAS_SRC
313 ${PROJECT_SOURCE_DIR}/blas/d_blas1_lib4.c
314 ${PROJECT_SOURCE_DIR}/blas/d_blas2_lib4.c
315 ${PROJECT_SOURCE_DIR}/blas/d_blas2_diag_lib.c
316 ${PROJECT_SOURCE_DIR}/blas/d_blas3_lib4.c
317 ${PROJECT_SOURCE_DIR}/blas/d_blas3_diag_lib4.c
318 ${PROJECT_SOURCE_DIR}/blas/d_lapack_lib4.c
319 ${PROJECT_SOURCE_DIR}/blas/s_blas1_lib8.c
320 ${PROJECT_SOURCE_DIR}/blas/s_blas2_lib8.c
321 ${PROJECT_SOURCE_DIR}/blas/s_blas2_diag_lib.c
322 ${PROJECT_SOURCE_DIR}/blas/s_blas3_lib8.c
323 ${PROJECT_SOURCE_DIR}/blas/s_blas3_diag_lib8.c
324 ${PROJECT_SOURCE_DIR}/blas/s_lapack_lib8.c
325 )
326
327 endif(${TARGET} MATCHES X64_INTEL_SANDY_BRIDGE)
328
329 if(${TARGET} MATCHES X64_INTEL_CORE)
330
331 file(GLOB AUX_SRC
332 ${PROJECT_SOURCE_DIR}/auxiliary/d_aux_lib4.c
333 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_dgecp_lib4.c
334 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_dgetr_lib4.c
335 ${PROJECT_SOURCE_DIR}/auxiliary/s_aux_lib4.c
336 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_sgetr_lib4.c
337 ${PROJECT_SOURCE_DIR}/auxiliary/m_aux_lib44.c
338 )
339
340 file(GLOB KERNEL_SRC
341 ${PROJECT_SOURCE_DIR}/kernel/sse3/kernel_dgemm_4x4_lib4.S
342 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemm_4x4_lib4.c
343 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemm_diag_lib4.c
344 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemv_4_lib4.c
345 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dsymv_4_lib4.c
346 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgetrf_pivot_4_lib4.c
347 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgeqrf_4_lib4.c
348 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemm_4x4_lib4.c
349 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemm_diag_lib4.c
350 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemv_4_lib4.c
351 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_ssymv_4_lib4.c
352 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgetrf_pivot_4_lib4.c
353 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgecp_lib4.c
354 )
355
356 file(GLOB BLAS_SRC
357 ${PROJECT_SOURCE_DIR}/blas/d_blas1_lib4.c
358 ${PROJECT_SOURCE_DIR}/blas/d_blas2_lib4.c
359 ${PROJECT_SOURCE_DIR}/blas/d_blas2_diag_lib.c
360 ${PROJECT_SOURCE_DIR}/blas/d_blas3_lib4.c
361 ${PROJECT_SOURCE_DIR}/blas/d_blas3_diag_lib4.c
362 ${PROJECT_SOURCE_DIR}/blas/d_lapack_lib4.c
363 ${PROJECT_SOURCE_DIR}/blas/s_blas1_lib4.c
364 ${PROJECT_SOURCE_DIR}/blas/s_blas2_lib4.c
365 ${PROJECT_SOURCE_DIR}/blas/s_blas2_diag_lib.c
366 ${PROJECT_SOURCE_DIR}/blas/s_blas3_lib4.c
367 ${PROJECT_SOURCE_DIR}/blas/s_blas3_diag_lib4.c
368 ${PROJECT_SOURCE_DIR}/blas/s_lapack_lib4.c
369 )
370
371 endif(${TARGET} MATCHES X64_INTEL_CORE)
372
373 if(${TARGET} MATCHES X64_AMD_BULLDOZER)
374
375 file(GLOB AUX_SRC
376 ${PROJECT_SOURCE_DIR}/auxiliary/d_aux_lib4.c
377 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_dgecp_lib4.c
378 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_dgetr_lib4.c
379 ${PROJECT_SOURCE_DIR}/auxiliary/s_aux_lib4.c
380 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_sgetr_lib4.c
381 ${PROJECT_SOURCE_DIR}/auxiliary/m_aux_lib44.c
382 )
383
384 file(GLOB KERNEL_SRC
385 ${PROJECT_SOURCE_DIR}/kernel/fma/kernel_dgemm_4x4_lib4.S
386 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemm_4x4_lib4.c
387 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemm_diag_lib4.c
388 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemv_4_lib4.c
389 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dsymv_4_lib4.c
390 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgetrf_pivot_4_lib4.c
391 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgeqrf_4_lib4.c
392 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemm_4x4_lib4.c
393 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemm_diag_lib4.c
394 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemv_4_lib4.c
395 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_ssymv_4_lib4.c
396 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgetrf_pivot_4_lib4.c
397 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgecp_lib4.c
398 )
399
400 file(GLOB BLAS_SRC
401 ${PROJECT_SOURCE_DIR}/blas/d_blas1_lib4.c
402 ${PROJECT_SOURCE_DIR}/blas/d_blas2_lib4.c
403 ${PROJECT_SOURCE_DIR}/blas/d_blas2_diag_lib.c
404 ${PROJECT_SOURCE_DIR}/blas/d_blas3_lib4.c
405 ${PROJECT_SOURCE_DIR}/blas/d_blas3_diag_lib4.c
406 ${PROJECT_SOURCE_DIR}/blas/d_lapack_lib4.c
407 ${PROJECT_SOURCE_DIR}/blas/s_blas1_lib4.c
408 ${PROJECT_SOURCE_DIR}/blas/s_blas2_lib4.c
409 ${PROJECT_SOURCE_DIR}/blas/s_blas2_diag_lib.c
410 ${PROJECT_SOURCE_DIR}/blas/s_blas3_lib4.c
411 ${PROJECT_SOURCE_DIR}/blas/s_blas3_diag_lib4.c
412 ${PROJECT_SOURCE_DIR}/blas/s_lapack_lib4.c
413 )
414
415 endif(${TARGET} MATCHES X64_AMD_BULLDOZER)
416
417 if(${TARGET} MATCHES ARMV8A_ARM_CORTEX_A57)
418
419 file(GLOB AUX_SRC
420 ${PROJECT_SOURCE_DIR}/auxiliary/d_aux_lib4.c
421 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_dgecp_lib4.c
422 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_dgetr_lib4.c
423 ${PROJECT_SOURCE_DIR}/auxiliary/s_aux_lib4.c
424 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_sgetr_lib4.c
425 ${PROJECT_SOURCE_DIR}/auxiliary/m_aux_lib44.c
426 )
427
428 file(GLOB KERNEL_SRC
429 ${PROJECT_SOURCE_DIR}/kernel/armv8a/kernel_dgemm_8x4_lib4.S
430 ${PROJECT_SOURCE_DIR}/kernel/armv8a/kernel_dgemm_4x4_lib4.S
431 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemm_4x4_lib4.c
432 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemm_diag_lib4.c
433 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemv_4_lib4.c
434 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dsymv_4_lib4.c
435 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgetrf_pivot_4_lib4.c
436 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgeqrf_4_lib4.c
437 ${PROJECT_SOURCE_DIR}/kernel/armv8a/kernel_sgemm_16x4_lib4.S
438 ${PROJECT_SOURCE_DIR}/kernel/armv8a/kernel_sgemm_12x4_lib4.S
439 ${PROJECT_SOURCE_DIR}/kernel/armv8a/kernel_sgemm_8x8_lib4.S
440 ${PROJECT_SOURCE_DIR}/kernel/armv8a/kernel_sgemm_8x4_lib4.S
441 ${PROJECT_SOURCE_DIR}/kernel/armv8a/kernel_sgemm_4x4_lib4.S
442 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemm_4x4_lib4.c
443 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemm_diag_lib4.c
444 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemv_4_lib4.c
445 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_ssymv_4_lib4.c
446 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgetrf_pivot_4_lib4.c
447 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgecp_lib4.c
448 )
449
450 file(GLOB BLAS_SRC
451 ${PROJECT_SOURCE_DIR}/blas/d_blas1_lib4.c
452 ${PROJECT_SOURCE_DIR}/blas/d_blas2_lib4.c
453 ${PROJECT_SOURCE_DIR}/blas/d_blas2_diag_lib.c
454 ${PROJECT_SOURCE_DIR}/blas/d_blas3_lib4.c
455 ${PROJECT_SOURCE_DIR}/blas/d_blas3_diag_lib4.c
456 ${PROJECT_SOURCE_DIR}/blas/d_lapack_lib4.c
457 ${PROJECT_SOURCE_DIR}/blas/s_blas1_lib4.c
458 ${PROJECT_SOURCE_DIR}/blas/s_blas2_lib4.c
459 ${PROJECT_SOURCE_DIR}/blas/s_blas2_diag_lib.c
460 ${PROJECT_SOURCE_DIR}/blas/s_blas3_lib4.c
461 ${PROJECT_SOURCE_DIR}/blas/s_blas3_diag_lib4.c
462 ${PROJECT_SOURCE_DIR}/blas/s_lapack_lib4.c
463 )
464
465 endif(${TARGET} MATCHES ARMV8A_ARM_CORTEX_A57)
466
467 if(${TARGET} MATCHES ARMV7A_ARM_CORTEX_A15)
468
469 file(GLOB AUX_SRC
470 ${PROJECT_SOURCE_DIR}/auxiliary/d_aux_lib4.c
471 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_dgecp_lib4.c
472 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_dgetr_lib4.c
473 ${PROJECT_SOURCE_DIR}/auxiliary/s_aux_lib4.c
474 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_sgetr_lib4.c
475 ${PROJECT_SOURCE_DIR}/auxiliary/m_aux_lib44.c
476 )
477
478 file(GLOB KERNEL_SRC
479 ${PROJECT_SOURCE_DIR}/kernel/armv7a/kernel_dgemm_4x4_lib4.S
480 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemm_4x4_lib4.c
481 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemm_diag_lib4.c
482 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemv_4_lib4.c
483 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dsymv_4_lib4.c
484 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgetrf_pivot_4_lib4.c
485 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgeqrf_4_lib4.c
486 ${PROJECT_SOURCE_DIR}/kernel/armv7a/kernel_sgemm_12x4_lib4.S
487 ${PROJECT_SOURCE_DIR}/kernel/armv7a/kernel_sgemm_8x4_lib4.S
488 ${PROJECT_SOURCE_DIR}/kernel/armv7a/kernel_sgemm_4x4_lib4.S
489 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemm_4x4_lib4.c
490 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemm_diag_lib4.c
491 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemv_4_lib4.c
492 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_ssymv_4_lib4.c
493 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgetrf_pivot_4_lib4.c
494 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgecp_lib4.c
495 )
496
497 file(GLOB BLAS_SRC
498 ${PROJECT_SOURCE_DIR}/blas/d_blas1_lib4.c
499 ${PROJECT_SOURCE_DIR}/blas/d_blas2_lib4.c
500 ${PROJECT_SOURCE_DIR}/blas/d_blas2_diag_lib.c
501 ${PROJECT_SOURCE_DIR}/blas/d_blas3_lib4.c
502 ${PROJECT_SOURCE_DIR}/blas/d_blas3_diag_lib4.c
503 ${PROJECT_SOURCE_DIR}/blas/d_lapack_lib4.c
504 ${PROJECT_SOURCE_DIR}/blas/s_blas1_lib4.c
505 ${PROJECT_SOURCE_DIR}/blas/s_blas2_lib4.c
506 ${PROJECT_SOURCE_DIR}/blas/s_blas2_diag_lib.c
507 ${PROJECT_SOURCE_DIR}/blas/s_blas3_lib4.c
508 ${PROJECT_SOURCE_DIR}/blas/s_blas3_diag_lib4.c
509 ${PROJECT_SOURCE_DIR}/blas/s_lapack_lib4.c
510 )
511
512 endif(${TARGET} MATCHES ARMV7A_ARM_CORTEX_A15)
513
514 if(${TARGET} MATCHES GENERIC)
515
516 file(GLOB AUX_SRC
517 ${PROJECT_SOURCE_DIR}/auxiliary/d_aux_lib4.c
518 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_dgecp_lib4.c
519 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_dgetr_lib4.c
520 ${PROJECT_SOURCE_DIR}/auxiliary/s_aux_lib4.c
521 ${PROJECT_SOURCE_DIR}/auxiliary/c99/kernel_sgetr_lib4.c
522 ${PROJECT_SOURCE_DIR}/auxiliary/m_aux_lib44.c
523 )
524
525 file(GLOB KERNEL_SRC
526 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemm_4x4_lib4.c
527 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemm_diag_lib4.c
528 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgemv_4_lib4.c
529 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dsymv_4_lib4.c
530 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgetrf_pivot_4_lib4.c
531 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_dgeqrf_4_lib4.c
532 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemm_4x4_lib4.c
533 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemm_diag_lib4.c
534 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgemv_4_lib4.c
535 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_ssymv_4_lib4.c
536 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgetrf_pivot_4_lib4.c
537 ${PROJECT_SOURCE_DIR}/kernel/c99/kernel_sgecp_lib4.c
538 )
539
540 file(GLOB BLAS_SRC
541 ${PROJECT_SOURCE_DIR}/blas/d_blas1_lib4.c
542 ${PROJECT_SOURCE_DIR}/blas/d_blas2_lib4.c
543 ${PROJECT_SOURCE_DIR}/blas/d_blas2_diag_lib.c
544 ${PROJECT_SOURCE_DIR}/blas/d_blas3_lib4.c
545 ${PROJECT_SOURCE_DIR}/blas/d_blas3_diag_lib4.c
546 ${PROJECT_SOURCE_DIR}/blas/d_lapack_lib4.c
547 ${PROJECT_SOURCE_DIR}/blas/s_blas1_lib4.c
548 ${PROJECT_SOURCE_DIR}/blas/s_blas2_lib4.c
549 ${PROJECT_SOURCE_DIR}/blas/s_blas2_diag_lib.c
550 ${PROJECT_SOURCE_DIR}/blas/s_blas3_lib4.c
551 ${PROJECT_SOURCE_DIR}/blas/s_blas3_diag_lib4.c
552 ${PROJECT_SOURCE_DIR}/blas/s_lapack_lib4.c
553 )
554
555 endif(${TARGET} MATCHES GENERIC)
556
557else(${LA} MATCHES HIGH_PERFORMANCE) # REFERENCE BLAS
558
559 file(GLOB AUX_SRC
560 ${PROJECT_SOURCE_DIR}/auxiliary/d_aux_lib.c
561 ${PROJECT_SOURCE_DIR}/auxiliary/s_aux_lib.c
562 ${PROJECT_SOURCE_DIR}/auxiliary/m_aux_lib.c
563 )
564
565 file(GLOB BLAS_SRC
566 ${PROJECT_SOURCE_DIR}/blas/d_blas1_lib.c
567 ${PROJECT_SOURCE_DIR}/blas/d_blas2_lib.c
568 ${PROJECT_SOURCE_DIR}/blas/d_blas2_diag_lib.c
569 ${PROJECT_SOURCE_DIR}/blas/d_blas3_lib.c
570 ${PROJECT_SOURCE_DIR}/blas/d_blas3_diag_lib.c
571 ${PROJECT_SOURCE_DIR}/blas/d_lapack_lib.c
572 ${PROJECT_SOURCE_DIR}/blas/s_blas1_lib.c
573 ${PROJECT_SOURCE_DIR}/blas/s_blas2_lib.c
574 ${PROJECT_SOURCE_DIR}/blas/s_blas2_diag_lib.c
575 ${PROJECT_SOURCE_DIR}/blas/s_blas3_lib.c
576 ${PROJECT_SOURCE_DIR}/blas/s_blas3_diag_lib.c
577 ${PROJECT_SOURCE_DIR}/blas/s_lapack_lib.c
578 )
579
580endif(${LA} MATCHES HIGH_PERFORMANCE)
581
582if(${EXT_DEP})
583
584 file(GLOB EXT_SRC
585 ${PROJECT_SOURCE_DIR}/auxiliary/d_aux_ext_dep_lib.c
586 ${PROJECT_SOURCE_DIR}/auxiliary/s_aux_ext_dep_lib.c
587 ${PROJECT_SOURCE_DIR}/auxiliary/v_aux_ext_dep_lib.c
588 ${PROJECT_SOURCE_DIR}/auxiliary/i_aux_ext_dep_lib.c
589 )
590
591endif()
592
593set(BLASFEO_SRC ${AUX_SRC} ${KERNEL_SRC} ${BLAS_SRC} ${EXT_SRC})
594
595# add library
596add_library(blasfeo ${BLASFEO_SRC})
597target_include_directories(blasfeo
598 PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
599
600install(TARGETS blasfeo EXPORT blasfeoConfig
601 LIBRARY DESTINATION lib
602 ARCHIVE DESTINATION lib
603 RUNTIME DESTINATION bin)
604
605install(EXPORT blasfeoConfig DESTINATION cmake)
606
607file(GLOB_RECURSE BLASFEO_HEADERS "include/*.h")
608install(FILES ${BLASFEO_HEADERS} DESTINATION ${BLASFEO_HEADERS_INSTALLATION_DIRECTORY})
609
610# test problems
611# add_subdirectory(test_problems)