Skip to content

Commit

Permalink
Merge pull request #148 from neil-lindquist/alt-apis
Browse files Browse the repository at this point in the history
Fix C and Fortran APIs plus add svd, eig, rcondest, and copy functions
  • Loading branch information
neil-lindquist authored Dec 14, 2023
2 parents f2b0cda + ef96e28 commit a82bcc1
Show file tree
Hide file tree
Showing 12 changed files with 503 additions and 133 deletions.
3 changes: 2 additions & 1 deletion .github/workflows/configure.sh
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ elif [ "${maker}" = "cmake" ]; then
cmake -Dcolor=no \
-DCMAKE_CXX_FLAGS="-Werror -Wno-unused-command-line-argument" \
-DCMAKE_INSTALL_PREFIX=${top}/install \
-Dgpu_backend=${gpu_backend} .. \
-Dgpu_backend=${gpu_backend} \
-Dc_api=1 -Dfortran_api=1 .. \
|| exit 12
fi

Expand Down
16 changes: 9 additions & 7 deletions .github/workflows/setup_env.sh
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,15 @@ export color=no

# For simplicity, create make.inc regardless of ${maker}
cat > make.inc << END
CXXFLAGS = -Werror -Dslate_omp_default_none='default(none)'
CXX = mpicxx
CC = mpicc
FC = mpif90
blas = mkl
prefix = ${top}/install
md5sum = md5sum
CXXFLAGS = -Werror -Dslate_omp_default_none='default(none)'
CXX = mpicxx
CC = mpicc
FC = mpif90
blas = mkl
prefix = ${top}/install
md5sum = md5sum
c_api = 1
fortran_api = 1
END

#----------------------------------------------------------------- Compiler
Expand Down
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,19 @@ build*
docs/doxygen/errors.txt
docs/html/
files.txt
include/slate/c_api/matrix.h
include/slate/c_api/util.hh
include/slate/c_api/wrappers.h
issues/
lib/*.a
lib/*.so
lib/pkgconfig/*.pc
make.inc
src/c_api/matrix.cc
src/c_api/util.cc
src/c_api/wrappers_precisions.cc
src/cuda/*.md5
src/fortran/slate_module.f90
slate-*
test/tester
unit_test/run_tests.py
Expand Down
201 changes: 103 additions & 98 deletions include/slate/c_api/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,59 +15,64 @@ extern "C" {
//------------------------------------------------------------------------------
// slate/include/slate/Tile.hh

typedef enum slate_TileKind {
slate_TileKind_Workspace, ///< slate::TileKind::Workspace
slate_TileKind_SlateOwned, ///< slate::TileKind::SlateOwned
slate_TileKind_UserOwned, ///< slate::TileKind::UserOwned
} slate_TileKind; ///< slate::TileKind
typedef char slate_TileKind; /* enum */ ///< slate::TileKind
const slate_TileKind slate_TileKind_Workspace = 'w'; ///< slate::TileKind::Workspace
const slate_TileKind slate_TileKind_SlateOwned = 'o'; ///< slate::TileKind::SlateOwned
const slate_TileKind slate_TileKind_UserOwned = 'u'; ///< slate::TileKind::UserOwned
// end slate_TileKind

//------------------------------------------------------------------------------
// slate/include/slate/enums.hh

typedef enum slate_Target {
slate_Target_Host = 'H', ///< slate::Target::Host
slate_Target_HostTask = 'T', ///< slate::Target::HostTask
slate_Target_HostNest = 'N', ///< slate::Target::HostNest
slate_Target_HostBatch = 'B', ///< slate::Target::HostBatch
slate_Target_Devices = 'D', ///< slate::Target::Devices
} slate_Target; ///< slate::Target

typedef enum slate_TileReleaseStrategy {
slate_TileReleaseStrategy_None = 'N', ///< slate::TileReleaseStrategy::None
slate_TileReleaseStrategy_Internal = 'I', ///< slate::TileReleaseStrategy::Internal
slate_TileReleaseStrategy_Slate = 'S', ///< slate::TileReleaseStrategy::Slate
slate_TileReleaseStrategy_All = 'A', ///< slate::TileReleaseStrategy::All
} slate_TileReleaseStrategy; ///< slate::TileReleaseStrategy

typedef enum slate_MethodEig {
slate_MethodEig_QR = 'Q', ///< slate::MethodEig::QR
slate_MethodEig_DC = 'D', ///< slate::MethodEig::DC
} slate_MethodEig;
typedef char slate_Target; /* enum */ ///< slate::Target
const slate_Target slate_Target_Host = 'H'; ///< slate::Target::Host
const slate_Target slate_Target_HostTask = 'T'; ///< slate::Target::HostTask
const slate_Target slate_Target_HostNest = 'N'; ///< slate::Target::HostNest
const slate_Target slate_Target_HostBatch = 'B'; ///< slate::Target::HostBatch
const slate_Target slate_Target_Devices = 'D'; ///< slate::Target::Devices
// end slate_Target

typedef char slate_TileReleaseStrategy; /* enum */ ///< slate::TileReleaseStrategy
const slate_TileReleaseStrategy slate_TileReleaseStrategy_None = 'N'; ///< slate::TileReleaseStrategy::None
const slate_TileReleaseStrategy slate_TileReleaseStrategy_Internal = 'I'; ///< slate::TileReleaseStrategy::Internal
const slate_TileReleaseStrategy slate_TileReleaseStrategy_Slate = 'S'; ///< slate::TileReleaseStrategy::Slate
const slate_TileReleaseStrategy slate_TileReleaseStrategy_All = 'A'; ///< slate::TileReleaseStrategy::All
// end slate_TileReleaseStrategy

typedef char slate_MethodEig; /* enum */ ///< slate::MethodEig
const slate_MethodEig slate_MethodEig_QR = 'Q'; ///< slate::MethodEig::QR
const slate_MethodEig slate_MethodEig_DC = 'D'; ///< slate::MethodEig::DC
// end slate_MethodEig

// todo: auto sync with include/slate/enums.hh
typedef enum slate_Option {
slate_Option_ChunkSize, ///< slate::Option::ChunkSize
slate_Option_Lookahead, ///< slate::Option::Lookahead
slate_Option_BlockSize, ///< slate::Option::BlockSize
slate_Option_InnerBlocking, ///< slate::Option::InnerBlocking
slate_Option_MaxPanelThreads, ///< slate::Option::MaxPanelThreads
slate_Option_Tolerance, ///< slate::Option::Tolerance
slate_Option_Target, ///< slate::Option::Target
slate_Option_TileReleaseStrategy, ///< slate::Option::TileReleaseStrategy
slate_Option_HoldLocalWorkspace, ///< slate::Option::HoldLocalWorkspace
slate_Option_PrintVerbose, ///< slate::Option::PrintVerbose
slate_Option_PrintEdgeItems, ///< slate::Option::PrintEdgeItems
slate_Option_PrintWidth, ///< slate::Option::PrintWidth
slate_Option_PrintPrecision, ///< slate::Option::PrintPrecision
slate_Option_PivotThreshold, ///< slate::Option::PivotThreshold
slate_Option_MethodCholQR, ///< slate::Option::MethodCholQR
slate_Option_MethodEig, ///< slate::Option::MethodEig
slate_Option_MethodGels, ///< slate::Option::MethodGels
slate_Option_MethodGemm, ///< slate::Option::MethodGemm
slate_Option_MethodHemm, ///< slate::Option::MethodHemm
slate_Option_MethodLU, ///< slate::Option::MethodLU
slate_Option_MethodTrsm, ///< slate::Option::MethodTrsm
} slate_Option; ///< slate::Option
typedef char slate_Option; /* enum */ ///< slate::Option
const slate_Option slate_Option_ChunkSize = 0; ///< slate::Option::ChunkSize
const slate_Option slate_Option_Lookahead = 1; ///< slate::Option::Lookahead
const slate_Option slate_Option_BlockSize = 2; ///< slate::Option::BlockSize
const slate_Option slate_Option_InnerBlocking = 3; ///< slate::Option::InnerBlocking
const slate_Option slate_Option_MaxPanelThreads = 4; ///< slate::Option::MaxPanelThreads
const slate_Option slate_Option_Tolerance = 5; ///< slate::Option::Tolerance
const slate_Option slate_Option_Target = 6; ///< slate::Option::Target
const slate_Option slate_Option_TileReleaseStrategy = 7; ///< slate::Option::TileReleaseStrategy
const slate_Option slate_Option_HoldLocalWorkspace = 8; ///< slate::Option::HoldLocalWorkspace
const slate_Option slate_Option_Depth = 9; ///< slate::Option::HoldLocalWorkspace
const slate_Option slate_Option_MaxIterations = 10; ///< slate::Option::HoldLocalWorkspace
const slate_Option slate_Option_UseFallbackSolver = 11; ///< slate::Option::HoldLocalWorkspace
const slate_Option slate_Option_PivotThreshold = 12; ///< slate::Option::PivotThreshold
const slate_Option slate_Option_PrintVerbose = 50; ///< slate::Option::PrintVerbose
const slate_Option slate_Option_PrintEdgeItems = 51; ///< slate::Option::PrintEdgeItems
const slate_Option slate_Option_PrintWidth = 52; ///< slate::Option::PrintWidth
const slate_Option slate_Option_PrintPrecision = 53; ///< slate::Option::PrintPrecision
const slate_Option slate_Option_MethodCholQR = 60; ///< slate::Option::MethodCholQR
const slate_Option slate_Option_MethodEig = 61; ///< slate::Option::MethodEig
const slate_Option slate_Option_MethodGels = 62; ///< slate::Option::MethodGels
const slate_Option slate_Option_MethodGemm = 63; ///< slate::Option::MethodGemm
const slate_Option slate_Option_MethodHemm = 64; ///< slate::Option::MethodHemm
const slate_Option slate_Option_MethodLU = 65; ///< slate::Option::MethodLU
const slate_Option slate_Option_MethodTrsm = 66; ///< slate::Option::MethodTrsm
// end slate_Option

typedef short slate_MOSI_State;

//------------------------------------------------------------------------------
// slate/include/slate/types.hh
Expand All @@ -92,61 +97,61 @@ typedef struct slate_Options {
//------------------------------------------------------------------------------
// blaspp/include/blas_util.hh

typedef enum slate_Op {
slate_Op_NoTrans = 'N', ///< slate::Op::NoTrans
slate_Op_Trans = 'T', ///< slate::Op::Trans
slate_Op_ConjTrans = 'C', ///< slate::Op::ConjTrans
} slate_Op; ///< slate::Op

typedef enum slate_Uplo {
slate_Uplo_Upper = 'U', ///< slate::Uplo::Upper
slate_Uplo_Lower = 'L', ///< slate::Uplo::Lower
slate_Uplo_General = 'G', ///< slate::Uplo::General
} slate_Uplo; ///< slate::Uplo

typedef enum slate_Diag {
slate_Diag_NonUnit = 'N', ///< slate::Diag::NonUnit
slate_Diag_Unit = 'U', ///< slate::Diag::Unit
} slate_Diag; ///< slate::Diag

typedef enum slate_Side {
slate_Side_Left = 'L', ///< slate::Side::Left
slate_Side_Right = 'R', ///< slate::Side::Right
} slate_Side; ///< slate::Side

typedef enum slate_Layout {
slate_Layout_ColMajor = 'C', ///< slate::Layout::ColMajor
slate_Layout_RowMajor = 'R', ///< slate::Layout::RowMajor
} slate_Layout; ///< slate::Layout
typedef char slate_Op; /* enum */ ///< slate::Op
const slate_Op slate_Op_NoTrans = 'N'; ///< slate::Op::NoTrans
const slate_Op slate_Op_Trans = 'T'; ///< slate::Op::Trans
const slate_Op slate_Op_ConjTrans = 'C'; ///< slate::Op::ConjTrans
// end slate_Op

typedef char slate_Uplo; /* enum */ ///< slate::Uplo
const slate_Uplo slate_Uplo_Upper = 'U'; ///< slate::Uplo::Upper
const slate_Uplo slate_Uplo_Lower = 'L'; ///< slate::Uplo::Lower
const slate_Uplo slate_Uplo_General = 'G'; ///< slate::Uplo::General
// end slate_Uplo

typedef char slate_Diag; /* enum */ ///< slate::Diag
const slate_Diag slate_Diag_NonUnit = 'N'; ///< slate::Diag::NonUnit
const slate_Diag slate_Diag_Unit = 'U'; ///< slate::Diag::Unit
// end slate_Diag

typedef char slate_Side; /* enum */ ///< slate_Side
const slate_Side slate_Side_Left = 'L'; ///< slate::Side::Left
const slate_Side slate_Side_Right = 'R'; ///< slate::Side::Right
// end slate_Side

typedef char slate_Layout; /* enum */
const slate_Layout slate_Layout_ColMajor = 'C'; ///< slate::Layout::ColMajor
const slate_Layout slate_Layout_RowMajor = 'R'; ///< slate::Layout::RowMajor
// end slate_Layout

//------------------------------------------------------------------------------
// lapackpp/include/lapack_util.hh

typedef enum slate_Norm {
slate_Norm_One = '1', ///< slate::Norm::One
slate_Norm_Two = '2', ///< slate::Norm::Two
slate_Norm_Inf = 'I', ///< slate::Norm::Inf
slate_Norm_Fro = 'F', ///< slate::Norm::Fro
slate_Norm_Max = 'M', ///< slate::Norm::Max
} slate_Norm; ///< slate::Norm

typedef enum slate_Direction {
slate_Direction_Forward = 'F', ///< slate::Direction::Forward
slate_Direction_Backward = 'B', ///< slate::Direction::Backward
} slate_Direction; ///< slate::Direction

typedef enum slate_Job {
slate_Job_NoVec = 'N', ///< slate::Job::NoVec
slate_Job_Vec = 'V', ///< slate::Job::Vec
slate_Job_UpdateVec = 'U', ///< slate::Job::UpdateVec
slate_Job_AllVec = 'A', ///< slate::Job::AllVec
slate_Job_SomeVec = 'S', ///< slate::Job::SomeVec
slate_Job_OverwriteVec = 'O', ///< slate::Job::OverwriteVec
slate_Job_CompactVec = 'P', ///< slate::Job::CompactVec
slate_Job_SomeVecTol = 'C', ///< slate::Job::SomeVecTol
slate_Job_VecJacobi = 'J', ///< slate::Job::VecJacobi
slate_Job_Workspace = 'W', ///< slate::Job::Workspace
} slate_Job; ///< slate::Job
typedef char slate_Norm; /* enum */ ///< slate::Norm
const slate_Norm slate_Norm_One = '1'; ///< slate::Norm::One
const slate_Norm slate_Norm_Two = '2'; ///< slate::Norm::Two
const slate_Norm slate_Norm_Inf = 'I'; ///< slate::Norm::Inf
const slate_Norm slate_Norm_Fro = 'F'; ///< slate::Norm::Fro
const slate_Norm slate_Norm_Max = 'M'; ///< slate::Norm::Max
// end slate_Norm

typedef char slate_Direction; /* enum */
const slate_Direction slate_Direction_Forward = 'F'; ///< slate::Direction::Forward
const slate_Direction slate_Direction_Backward = 'B'; ///< slate::Direction::Backward
// end slate_Direction

typedef char slate_Job; /* enum */
const slate_Job slate_Job_NoVec = 'N'; ///< slate::Job::NoVec
const slate_Job slate_Job_Vec = 'V'; ///< slate::Job::Vec
const slate_Job slate_Job_UpdateVec = 'U'; ///< slate::Job::UpdateVec
const slate_Job slate_Job_AllVec = 'A'; ///< slate::Job::AllVec
const slate_Job slate_Job_SomeVec = 'S'; ///< slate::Job::SomeVec
const slate_Job slate_Job_OverwriteVec = 'O'; ///< slate::Job::OverwriteVec
const slate_Job slate_Job_CompactVec = 'P'; ///< slate::Job::CompactVec
const slate_Job slate_Job_SomeVecTol = 'C'; ///< slate::Job::SomeVecTol
const slate_Job slate_Job_VecJacobi = 'J'; ///< slate::Job::VecJacobi
const slate_Job slate_Job_Workspace = 'W'; ///< slate::Job::Workspace
// end slate_Job

#ifdef __cplusplus
} // extern "C"
Expand Down
8 changes: 5 additions & 3 deletions include/slate/enums.hh
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,10 @@ enum class Option : char {
Depth, ///< depth for the RBT solver
MaxIterations, ///< maximum iteration count
UseFallbackSolver, ///< whether to fallback to a robust solver if iterations do not converge
PrintVerbose, ///< verbose, 0: no printing,
PivotThreshold, ///< threshold for pivoting, >= 0, <= 1

// Printing parameters
PrintVerbose = 50, ///< verbose, 0: no printing,
///< verbose, 1: print metadata only (dimensions, uplo, etc.)
///< verbose, 2: print first & last PrintEdgeItems rows & cols
///< from the four corner tiles
Expand All @@ -92,10 +95,9 @@ enum class Option : char {
PrintWidth, ///< width print format specifier
PrintPrecision, ///< precision print format specifier
///< For correct printing, PrintWidth = PrintPrecision + 6.
PivotThreshold, ///< threshold for pivoting, >= 0, <= 1

// Methods, listed alphabetically.
MethodCholQR, ///< Select the algorithm to compute A^H * A
MethodCholQR = 60, ///< Select the algorithm to compute A^H * A
MethodEig, ///< Select the algorithm to compute eigenpairs of tridiagonal matrix
MethodGels, ///< Select the gels algorithm
MethodGemm, ///< Select the gemm algorithm
Expand Down
6 changes: 3 additions & 3 deletions include/slate/simplified_api.hh
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ void lu_inverse_using_factor_out_of_place(
}

//-----------------------------------------
// lu_condest_using_factor()
// lu_rcondest_using_factor()

// gecondest
template <typename scalar_t>
Expand Down Expand Up @@ -490,7 +490,7 @@ void chol_inverse_using_factor(
}

//-----------------------------------------
// chol_condest_using_factor()
// chol_rcondest_using_factor()

// pocondest
template <typename scalar_t>
Expand Down Expand Up @@ -678,7 +678,7 @@ void lq_multiply_by_q(
}

//-----------------------------------------
// triangular_condest()
// triangular_rcondest()

// trcondest
template <typename scalar_t>
Expand Down
2 changes: 1 addition & 1 deletion lapackpp
Loading

0 comments on commit a82bcc1

Please sign in to comment.