Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
7bf7fc6
Add the LAPACKE testsuite from Reference-LAPACK PR 1356
martin-frbg Sep 30, 2026
83bde2d
Add the LAPACKE testsuite from Reference-LAPACK PR 1356
martin-frbg Sep 30, 2026
d1d0c41
Add the LAPACKE testsuite from Reference-LAPACK PR 1356
martin-frbg Sep 30, 2026
00c25ed
Add the alloc helper for the LAPACKE testsuite from Reference-LAPACK …
martin-frbg Sep 30, 2026
dd14721
Import the LAPACKE testsuite from Reference-LAPACK PR 1356
martin-frbg Sep 30, 2026
2ef9e20
Import the LAPACKE testsuite from Reference-LAPACK PR 1356
martin-frbg Sep 30, 2026
0e26fa2
Import the LAPACKE testsuite from Reference-LAPACK PR 1356
martin-frbg Sep 30, 2026
b3dcdbd
Import the LAPACKE testsuite from Reference-LAPACK 1356
martin-frbg Sep 30, 2026
c24697d
Import the LAPACKE testsuite from Reference-LAPACK PR 1356
martin-frbg Sep 30, 2026
5ca279a
Import the LAPACKE testsuite from Reference-LAPACK PR 1356
martin-frbg Sep 30, 2026
9276fc6
Fix import of build options
martin-frbg Oct 2, 2026
c172909
Use crealf, cimagf for single-precision complex numbers
martin-frbg Oct 2, 2026
9f2cec7
Implement MSVC complex types (Reference-LAPACK PR 1164)
martin-frbg Oct 3, 2026
d51987d
Implement MSVC complex types (Reference-LAPACK PR 1164)
martin-frbg Oct 3, 2026
a0f008f
Pass LAPACK_ILP64 to the build
martin-frbg Oct 4, 2026
cf8896a
Merge branch 'OpenMathLib:develop' into lapack1356
martin-frbg Oct 5, 2026
04ff569
Don't default to complex_structure on Windows anymore
martin-frbg Oct 7, 2026
8323d67
Merge branch 'OpenMathLib:develop' into lapack1356
martin-frbg Oct 16, 2026
969fd88
Merge branch 'OpenMathLib:develop' into lapack1356
martin-frbg Oct 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,7 @@ if (NOT NOFORTRAN)
endif()
if (BUILD_TESTING AND NOT BUILD_WITHOUT_LAPACK)
add_subdirectory(lapack-netlib/TESTING)
add_subdirectory(lapack-netlib/LAPACKE/testing)
endif()
endif()
if(NOT NO_CBLAS)
Expand Down
8 changes: 8 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -405,13 +405,21 @@ endif


lapack-test :
ifeq ($(NOFORTRAN), $(filter 0,$(NOFORTRAN)))
(cd $(NETLIB_LAPACK_DIR)/TESTING && rm -f x* *.out)
$(MAKE) -j 1 -C $(NETLIB_LAPACK_DIR)/TESTING/EIG xeigtstc xeigtstd xeigtsts xeigtstz
$(MAKE) -j 1 -C $(NETLIB_LAPACK_DIR)/TESTING/LIN xlintstc xlintstd xlintstds xlintstrfd xlintstrfz xlintsts xlintstz xlintstzc xlintstrfs xlintstrfc
endif
ifneq ($(NO_LAPACKE), 1)
(cd $(NETLIB_LAPACK_DIR)/LAPACKE/testing/high_level; $(MAKE) all;)
endif
ifneq ($(CROSS), 1)
( cd $(NETLIB_LAPACK_DIR)/INSTALL; $(MAKE) all; ./testlsame; ./testslamch; ./testdlamch; \
./testsecond; ./testdsecnd; ./testieee; ./testversion )
(cd $(NETLIB_LAPACK_DIR); ./lapack_testing.py -r -b TESTING)
ifneq ($(NO_LAPACKE), 1)
(cd $(NETLIB_LAPACK_DIR)/LAPACKE/testing/high_level; ./slapacke_high_level; ./dlapacke_high_level; ./clapacke_high_level; ./zlapacke_high_level)
endif
endif

lapack-runtest: lapack-test
Expand Down
113 changes: 113 additions & 0 deletions cmake/ExtendedAPIHelpers.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
include_guard(GLOBAL)

set(EXTENDED_API_GENERATOR
"${CMAKE_CURRENT_LIST_DIR}/GenerateSuffixedSource.cmake" CACHE INTERNAL
"Script that generates suffixed sources for extended APIs")

if(BUILD_INDEX64_EXT_API)
add_custom_target(64bit_codegen ALL
COMMENT "Generating 64-bit suffixed sources for extended API")
endif()

# Generate suffixed sources for an extended API. The generation happens at
# build time in the GenerateSuffixedSource.cmake script. Arguments:
# SUFFIX <suffix> -- suffix appended to symbols and file names
# (required)
# SYMBOL_ALLOWLIST <sym>... -- only rename the listed symbols
# (case-insensitive); by default every symbol
# defined in the sources is renamed
# NO_STRING_REPLACEMENTS -- do not rename symbols inside string literals
function(generate_suffixed_sources target source_list generated_sources)
set(options NO_STRING_REPLACEMENTS)
set(oneValueArgs SUFFIX)
set(multiValueArgs SYMBOL_ALLOWLIST)
cmake_parse_arguments(PARSE_ARGV 3 extended_api "${options}" "${oneValueArgs}" "${multiValueArgs}")

if(NOT DEFINED extended_api_SUFFIX)
message(FATAL_ERROR "generate_suffixed_sources: SUFFIX is required")
endif()

get_filename_component(destination "${target}${extended_api_SUFFIX}_sources" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
get_property(_generated_suffixed_source_files GLOBAL PROPERTY EXTENDED_API_GENERATED_SOURCE_FILES)
set(new_generated_source_files)
set(generated_source_files)

foreach(_source IN LISTS ${source_list})
get_filename_component(source_abs "${_source}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
get_filename_component(source_name "${_source}" NAME_WLE)
get_filename_component(source_ext "${_source}" EXT)
set(output_file "${destination}/${source_name}${extended_api_SUFFIX}${source_ext}")

set(_fortran_extensions ".f" ".F" ".f90" ".F90")
if(NOT source_ext IN_LIST _fortran_extensions)
message(WARNING "Skipping non-Fortran source '${_source}' for target '${target}'")
continue()
endif()

# Make sure we only have one custom command generating a given output file
if(NOT "${output_file}" IN_LIST _generated_suffixed_source_files)
set(generator_args
"-DINPUT_FILE=${source_abs}"
"-DOUTPUT_FILE=${output_file}"
"-DSUFFIX=${extended_api_SUFFIX}")
if(extended_api_NO_STRING_REPLACEMENTS)
list(APPEND generator_args "-DREPLACE_IN_STRINGS=OFF")
endif()
if(DEFINED extended_api_SYMBOL_ALLOWLIST)
# Join with $<SEMICOLON> so that the allowlist stays one -D argument
# on the command line but still reaches the script as a CMake list.
# An allowlist change re-runs the generation (the command changes).
list(JOIN extended_api_SYMBOL_ALLOWLIST "$<SEMICOLON>" _symbol_allowlist)
list(APPEND generator_args "-DSYMBOL_ALLOWLIST=${_symbol_allowlist}")
endif()

add_custom_command(
OUTPUT "${output_file}"
COMMAND
"${CMAKE_COMMAND}"
${generator_args}
-P "${EXTENDED_API_GENERATOR}"
DEPENDS
"${source_abs}"
"${EXTENDED_API_GENERATOR}"
COMMENT "Generating ${extended_api_SUFFIX} extended API source for ${_source}"
VERBATIM)

list(APPEND new_generated_source_files "${output_file}")
endif()

list(APPEND generated_source_files "${output_file}")
endforeach()

# Make sure each generated source file is only part of one target to
# avoid multiple targets trying to generate the same file
if(new_generated_source_files)
add_custom_target("${target}${extended_api_SUFFIX}_codegen" ALL
DEPENDS ${new_generated_source_files}
COMMENT "Generating ${extended_api_SUFFIX} suffixed sources for target ${target}")
if(extended_api_SUFFIX STREQUAL "_64" AND TARGET 64bit_codegen)
add_dependencies(64bit_codegen "${target}${extended_api_SUFFIX}_codegen")
endif()

set_property(GLOBAL APPEND PROPERTY EXTENDED_API_GENERATED_SOURCE_FILES ${new_generated_source_files})
endif()

set(${generated_sources} ${generated_source_files} PARENT_SCOPE)
endfunction()

# Generate 64-bit suffixed sources for the extended API. Kept as a thin
# wrapper around generate_suffixed_sources for the Index-64 extended API.
function(generate_64bit_suffixed_sources target source_list generated_sources)
set(options NO_STRING_REPLACEMENTS)
cmake_parse_arguments(PARSE_ARGV 3 extended_api "${options}" "" "")

set(_forwarded_options)
if(extended_api_NO_STRING_REPLACEMENTS)
list(APPEND _forwarded_options NO_STRING_REPLACEMENTS)
endif()

generate_suffixed_sources("${target}" "${source_list}" _generated_source_files
SUFFIX "_64" ${_forwarded_options})

set(${generated_sources} ${_generated_source_files} PARENT_SCOPE)
endfunction()
1 change: 1 addition & 0 deletions cmake/lapacke.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -2473,6 +2473,7 @@ set(MATGEN
lapacke_zlagsy.c
lapacke_zlagsy_work.c
lapacke_nancheck.c
lapacke_alloc.c
)

set(Utils_SRC
Expand Down
2 changes: 1 addition & 1 deletion cmake/system.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DOPENBLAS_OS_WINDOWS")
endif ()

if (${CMAKE_C_COMPILER} STREQUAL "LSB" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
if (${CMAKE_C_COMPILER} STREQUAL "LSB" )
set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_COMPLEX_STRUCTURE")
endif ()
if (${CMAKE_C_COMPILER_ID} MATCHES "IntelLLVM" AND ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
Expand Down
12 changes: 10 additions & 2 deletions lapack-netlib/LAPACKE/include/lapack.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,19 @@
#else
#include <complex>
#endif
#if _MSC_VER
#define lapack_complex_float _Fcomplex
#else
#define lapack_complex_float float _Complex
#endif
#endif

#ifndef lapack_complex_float_real
#define lapack_complex_float_real(z) (creal(z))
#define lapack_complex_float_real(z) (crealf(z))
#endif

#ifndef lapack_complex_float_imag
#define lapack_complex_float_imag(z) (cimag(z))
#define lapack_complex_float_imag(z) (cimagf(z))
#endif

/* Complex type (double precision) */
Expand All @@ -67,8 +71,12 @@
#else
#include <complex>
#endif
#if _MSC_VER
#define lapack_complex_double _Dcomplex
#else
#define lapack_complex_double double _Complex
#endif
#endif

#ifndef lapack_complex_double_real
#define lapack_complex_double_real(z) (creal(z))
Expand Down
17 changes: 15 additions & 2 deletions lapack-netlib/LAPACKE/include/lapacke.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,24 @@
extern "C" {
#endif /* __cplusplus */

/* All LAPACKE-internal allocations (workspaces, row-major transposition
* buffers) go through a replaceable allocator. Defining the LAPACKE_malloc /
* LAPACKE_free macros at compile time replaces the allocator entirely. */

/** Allocate through the installed allocator (malloc by default). */
void *LAPACKE_malloc_proxy(size_t size);

/** Release through the installed deallocator (free by default). */
void LAPACKE_free_proxy(void *ptr);

/** Install a custom allocator for LAPACKE-internal allocations. */
void LAPACKE_set_alloc(void *(*malloc_fn)(size_t), void (*free_fn)(void *));

#ifndef LAPACKE_malloc
#define LAPACKE_malloc( size ) malloc( size )
#define LAPACKE_malloc(size) LAPACKE_malloc_proxy(size)
#endif
#ifndef LAPACKE_free
#define LAPACKE_free( p ) free( p )
#define LAPACKE_free(p) LAPACKE_free_proxy(p)
#endif

#define LAPACK_C2INT( x ) (lapack_int)(*((float*)&x ))
Expand Down
46 changes: 14 additions & 32 deletions lapack-netlib/LAPACKE/include/lapacke_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,34 +67,7 @@ extern "C" {
#define lapack_logical lapack_int
#endif

#if defined(_MSC_VER) && defined(__INTEL_CLANG_COMPILER)
#define LAPACK_COMPLEX_STRUCTURE
#define LAPACK_GLOBAL(lcname,UCNAME) lcname
#define NOCHANGE
#endif

#ifndef LAPACK_COMPLEX_CUSTOM
#if defined(_MSC_VER) && !defined(__INTEL_CLANG_COMPILER)
#if defined(LAPACK_COMPLEX_CPP)
#include <complex>
#define lapack_complex_float std::complex<float>
#define lapack_complex_double std::complex<double>
#define lapack_complex_float_real(z) ((z).real())
#define lapack_complex_float_imag(z) ((z).imag())
#define lapack_complex_double_real(z) ((z).real())
#define lapack_complex_double_imag(z) ((z).imag())
#define _CRT_USE_C_COMPLEX_H
#else
#include <complex.h>
#define LAPACK_COMPLEX_CUSTOM
#define lapack_complex_float _Fcomplex
#define lapack_complex_double _Dcomplex
#define lapack_complex_float_real(z) (creal(z))
#define lapack_complex_float_imag(z) (cimag(z))
#define lapack_complex_double_real(z) (creal(z))
#define lapack_complex_double_imag(z) (cimag(z))
#endif
#else

#if defined(LAPACK_COMPLEX_STRUCTURE)

Expand All @@ -112,8 +85,8 @@ typedef struct { double real, imag; } _lapack_complex_double;
#include <complex.h>
#define lapack_complex_float float _Complex
#define lapack_complex_double double _Complex
#define lapack_complex_float_real(z) (creal(z))
#define lapack_complex_float_imag(z) (cimag(z))
#define lapack_complex_float_real(z) (crealf(z))
#define lapack_complex_float_imag(z) (cimagf(z))
#define lapack_complex_double_real(z) (creal(z))
#define lapack_complex_double_imag(z) (cimag(z))

Expand All @@ -126,17 +99,26 @@ typedef struct { double real, imag; } _lapack_complex_double;
#define lapack_complex_double_real(z) ((z).real())
#define lapack_complex_double_imag(z) ((z).imag())

#elif defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__INTEL_LLVM_COMPILER)

#include <complex.h>
#define lapack_complex_float _Fcomplex
#define lapack_complex_double _Dcomplex
#define lapack_complex_float_real(z) (crealf(z))
#define lapack_complex_float_imag(z) (cimagf(z))
#define lapack_complex_double_real(z) (creal(z))
#define lapack_complex_double_imag(z) (cimag(z))

#else

#include <complex.h>
#define lapack_complex_float float _Complex
#define lapack_complex_double double _Complex
#define lapack_complex_float_real(z) (creal(z))
#define lapack_complex_float_imag(z) (cimag(z))
#define lapack_complex_float_real(z) (crealf(z))
#define lapack_complex_float_imag(z) (cimagf(z))
#define lapack_complex_double_real(z) (creal(z))
#define lapack_complex_double_imag(z) (cimag(z))

#endif
#endif

lapack_complex_float lapack_make_complex_float( float re, float im );
Expand Down
Loading
Loading