From b08a945113e8aca3f91acb7373f23c2e2f2fce9f Mon Sep 17 00:00:00 2001 From: Jean-Marc GRATIEN Date: Mon, 10 Jan 2022 11:52:17 +0100 Subject: [PATCH 1/6] update sphinx alien documentation with ref semantic and sycl usage --- README.md | 30 +++ docs/CMakeLists.txt | 2 +- docs/sphinx/index.rst | 2 + docs/sphinx/sycl/build.rst | 36 ++++ docs/sphinx/sycl/example.rst | 17 ++ docs/sphinx/sycl/index.rst | 10 + docs/sphinx/sycl/install.rst | 86 ++++++++ docs/sphinx/tutorial.rst | 291 ++++++++++++++++++++++++++- docs/sphinx/user/index.rst | 3 +- docs/sphinx/user/ref.rst | 58 ++++++ docs/tutorial/dist_linear_system.cpp | 2 +- docs/tutorial/dist_matrix.cpp | 2 +- docs/tutorial/dist_vector.cpp | 2 +- src/refsemantic/CMakeLists.txt | 47 +++++ tools/python/alien-env.yml | 7 + tools/sycl/install-hipsycl.sh | 57 ++++++ tools/sycl/install-llvm.sh | 57 ++++++ 17 files changed, 702 insertions(+), 7 deletions(-) create mode 100644 docs/sphinx/sycl/build.rst create mode 100644 docs/sphinx/sycl/example.rst create mode 100644 docs/sphinx/sycl/index.rst create mode 100644 docs/sphinx/sycl/install.rst create mode 100644 docs/sphinx/user/ref.rst create mode 100644 tools/python/alien-env.yml create mode 100644 tools/sycl/install-hipsycl.sh create mode 100644 tools/sycl/install-llvm.sh diff --git a/README.md b/README.md index 2ecd9a9a7..6e37eb31a 100644 --- a/README.md +++ b/README.md @@ -82,3 +82,33 @@ git subtree split -P arccore -b arccore cd ../alien git subtree pull --prefix=framework/arccore --squash ../framework arccore ``` + +## Documentation generation + +You need a python version 3 with sphinx and breathe modules + +You can easily create a conda environment as following + +```shell script +cd $ALIEN_ROOT/tools/python +conda env create -f alien-env.yml +conda activate alien-env +``` + +Then the CMAKE OPTIONS has to be activated in the Alien configuration step + +```shell script +cmake -S `pwd`/alien \ + -B `pwd`/build-alien \ + -DALIEN_GENERATE_DOCUMENTATION=ON \ + .... + +make -C `pwd`/build-alien install +make -C `pwd`/build-alien doc_alien +``` + +The documentation is generated in : + +```shell script +firefox `pwd`/build-alien/alien_doc/index.html +``` diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index 740db3b5c..6187599bf 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -13,7 +13,7 @@ if (ALIEN_GENERATE_DOCUMENTATION) sphinx_add_docs( alien_doc - BREATHE_PROJECTS doxygen_api_docs_movesemantic doxygen_api_docs_core_data + BREATHE_PROJECTS doxygen_api_docs_movesemantic doxygen_api_docs_refsemantic doxygen_api_docs_core_data BUILDER html SOURCE_DIRECTORY sphinx OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/alien_doc" diff --git a/docs/sphinx/index.rst b/docs/sphinx/index.rst index 9d45c348b..c10d5c101 100644 --- a/docs/sphinx/index.rst +++ b/docs/sphinx/index.rst @@ -10,6 +10,8 @@ Welcome to Alien's documentation! tutorial developer/index + + sycl/index Indices and tables ================== diff --git a/docs/sphinx/sycl/build.rst b/docs/sphinx/sycl/build.rst new file mode 100644 index 000000000..1fc4b1e19 --- /dev/null +++ b/docs/sphinx/sycl/build.rst @@ -0,0 +1,36 @@ +.. _sycl_build: + +===================================== +Building and using Alien SYCL BackEnd +===================================== + +Building Alien SYCL BackEnd +=========================== + +Alien's build system is based on CMake. + + +Configuring +----------- + + +.. code-block:: bash + + export GCCCORE='path_to_gccroot_compiler' + cmake -S `pwd`/alien \ + -B `pwd`/build-alien \ + -DCMAKE_BUILD_TYPE=Release \ + -DALIEN_WANT_AVX2=ON \ + -DALIEN_USE_LIBXML2=ON \ + -DALIEN_UNIT_TESTS=ON \ + -DALIEN_USE_HDF5=ON -DHIPSYCL_TARGETS=cuda:sm_50 \ + -DALIEN_USE_SYCL=ON \ + -DGCCCORE_ROOT:PATH=${GCCXORE_ROOT} \ + ../alien + cmake --build + cmake --install + + +Concepts +-------- + diff --git a/docs/sphinx/sycl/example.rst b/docs/sphinx/sycl/example.rst new file mode 100644 index 000000000..07f0dac63 --- /dev/null +++ b/docs/sphinx/sycl/example.rst @@ -0,0 +1,17 @@ +.. _sycl_example: + +=================================== +Exemple of Alien SYCL backend usage +=================================== + + +Intro +----- + +This tutorial illustrates how to build a linear system and solve it with various linear solver algorithm with the Alien SYCL BackEnd. + + +Linear Systems resolution +------------------------- + +Todo \ No newline at end of file diff --git a/docs/sphinx/sycl/index.rst b/docs/sphinx/sycl/index.rst new file mode 100644 index 000000000..05cb44071 --- /dev/null +++ b/docs/sphinx/sycl/index.rst @@ -0,0 +1,10 @@ +.. _sycl: + +Alien sycl documentation +======================== + +.. toctree:: + :maxdepth: 2 + install + build + example \ No newline at end of file diff --git a/docs/sphinx/sycl/install.rst b/docs/sphinx/sycl/install.rst new file mode 100644 index 000000000..e80e09bde --- /dev/null +++ b/docs/sphinx/sycl/install.rst @@ -0,0 +1,86 @@ +.. _sycl_install: + +=================== +How to install SYCL +=================== + +Installing SYCL +=============== + +Alien's build system is based on CMake. + +Getting the sources +------------------- + + +.. code-block:: bash + + git clone --recurse-submodules -b stable https://github.com/illuhad/hipSYCL + +Configuring +----------- + +.. code-block:: bash + + export INSTALL_PREFIX=`pwd`/usr/local/gcc102 + export HIPSYCL_INSTALL_PREFIX=${INSTALL_PATH}/sycl2020 + export HIPSYCL_LLVM_INSTALL_PREFIX=${INSTALL_PATH} + export HIPSYCL_WITH_ROCM=OFF + export CC=${GCCCORE_ROOT}/bin/gcc + export CXX=${GCCCORE_ROOT}/bin/g++ + export HIPSYCL_BASE_CC=gcc + export HIPSYCL_BASE_CXX=g++ + export hipSYCL_DIR=${INSTALL_PATH}/sycl2020/lib/cmake/hipSYCL + export HIPSYCL_LLVM_BUILD_DIR=$PWD/llvm + export HIPSYCL_BUILD_DIR=$PWD/sycl2020/hipSYCL + mkdir build-hipSYCL + cmake -S `pwd`/hipSYCL \ + -B `pwd`/build-hipSYCL \ + -DCMAKE_C_COMPILER=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang \ + -DCMAKE_CXX_COMPILER=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang++ \ + -DCMAKE_CXX_FLAGS:STRING='--gcc-toolchain=/work/gratienj/local/expl/eb/centos_7/easybuild/software/Core/GCCcore/10.2.0' \ + -DWITH_CPU_BACKEND=ON \ + -DWITH_CUDA_BACKEND=$HIPSYCL_WITH_CUDA \ + -DWITH_ROCM_BACKEND=$HIPSYCL_WITH_ROCM \ + -DLLVM_DIR=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/lib/cmake/llvm \ + -DROCM_PATH=$HIPSYCL_INSTALL_PREFIX/rocm \ + -DCUDA_TOOLKIT_ROOT_DIR=$HIPSYCL_LLVM_INSTALL_PREFIX/cuda \ + -DCLANG_EXECUTABLE_PATH=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang++ \ + -DCLANG_INCLUDE_PATH=$LLVM_INCLUDE_PATH \ + -DCMAKE_INSTALL_PREFIX=$HIPSYCL_INSTALL_PREFIX \ + -DROCM_LINK_LINE='-rpath $HIPSYCL_ROCM_LIB_PATH -rpath $HIPSYCL_ROCM_PATH/hsa/lib -L$HIPSYCL_ROCM_LIB_PATH -lhip_hcc -lamd_comgr -lamd_hostcall -lhsa-runtime64 -latmi_runtime -rpath $HIPSYCL_ROCM_PATH/hcc/lib -L$HIPSYCL_ROCM_PATH/hcc/lib -lmcwamp -lhc_am' \ + + +Installing +---------- + +.. code-block:: bash + + module load GCC/10.2.0 + module load CUDA/10.1 + module load Boost/1.74.0 + module load CMake + #module load LLVM/11.0.0 + #module load Clang/11.0.1 + + export CUDA_TOOLKIT_ROOT_DIR= ... + export CUDA_SDK_ROOT_DIR= ... + export INSTALL_PATH=`pwd`/Install + + export HIPSYCL_PKG_LLVM_VERSION_MAJOR=10 + export INSTALL_PREFIX=`pwd`/usr/local/gcc102 + export HIPSYCL_INSTALL_PREFIX=${INSTALL_PATH}/sycl2020 + export HIPSYCL_LLVM_INSTALL_PREFIX=${INSTALL_PATH} + export HIPSYCL_WITH_ROCM=OFF + export CC=${GCCCORE_ROOT}/bin/gcc + export CXX=${GCCCORE_ROOT}/bin/g++ + export HIPSYCL_BASE_CC=gcc + export HIPSYCL_BASE_CXX=g++ + export hipSYCL_DIR=${INSTALL_PATH}/sycl2020/lib/cmake/hipSYCL + export HIPSYCL_LLVM_BUILD_DIR=$PWD/llvm + export HIPSYCL_BUILD_DIR=$PWD/sycl2020/hipSYCL + export LD_LIBRARY_PATH=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/lib:$LD_LIBRARY_PATH + + sh ${ALIEN_ROOT}/tools/sycl/install-llvm.sh + + sh ${ALIEN_ROOT}/tools/syclinstall-hipsycl.sh diff --git a/docs/sphinx/tutorial.rst b/docs/sphinx/tutorial.rst index bdd3d5bb8..a08898f4a 100644 --- a/docs/sphinx/tutorial.rst +++ b/docs/sphinx/tutorial.rst @@ -5,7 +5,294 @@ Tutorial Intro ----- -Blabla +This tutorial illustrates how to build a linear system and solve it with various linear solver algorithm. + +We consider the Laplacian problem on a 2D square mesh of size :math:`N_X \times N_Y`. Unknowns are related to the mesh nodes +indexed by :math:`(i,j)`. We use a 5-Points stencil to discretize the problem. + +First of all Alien provides tools to initialize the library, the MPI parallel environment to parametrize IO. +The following code illustrates how to initialize : + +- the ParallelMng object + +- the TraceMng object + + +.. code-block:: bash + + // INITIALIZE PARALLEL ENVIRONMENT + Environment::initialize(argc, argv); + + auto parallel_mng = Environment::parallelMng(); + auto trace_mng = Environment::traceMng(); + + auto comm_size = Environment::parallelMng()->commSize(); + auto comm_rank = Environment::parallelMng()->commRank(); + + trace_mng->info() << "NB PROC = " << comm_size; + trace_mng->info() << "RANK = " << comm_rank; + + Arccore::StringBuilder filename("tutorial.log"); + Arccore::ReferenceCounter ofile; + if (comm_size > 1) { + filename += comm_rank; + ofile = Arccore::ITraceStream::createFileStream(filename.toString()); + trace_mng->setRedirectStream(ofile.get()); + } + trace_mng->finishInitialize(); + + Alien::setTraceMng(trace_mng); + Alien::setVerbosityLevel(Alien::Verbosity::Debug); Space ------ \ No newline at end of file +----- + +The Space concept enable to modelize the mathematical algebraic real space :math:`R^N` of dimension :math:`N` + +To build this concept several tools are provided: + +- the `IndexeManager` package provides helper tools to manage `Integer IndexSets` + +- the `Distribution` package provides helper tools to manage the partition of `IndexSets` between MPI processes + +.. code-block:: bash + + int Nx = 10; + int Ny = 10; + + /* + * MESH PARTITION ALONG Y AXIS + * + */ + int local_ny = Ny / comm_size; + int r = Ny % comm_size; + + std::vector y_offset(comm_size + 1); + y_offset[0] = 0; + for (int ip = 0; ip < r; ++ip) + y_offset[ip + 1] = y_offset[ip] + local_ny + 1; + + for (int ip = r; ip < comm_size; ++ip) + y_offset[ip + 1] = y_offset[ip] + local_ny; + + // Define a lambda function to compute node unique ids from the 2D (i,j) coordinates + // (i,j) -> uid = node_uid(i,j) + auto node_uid = [&](int i, int j) { return j * Nx + i; }; + + /* + * DEFINITION of Unknowns Unique Ids and Local Ids + */ + Alien::UniqueArray uid; + Alien::UniqueArray lid; + int first_j = y_offset[comm_rank]; + int last_j = y_offset[comm_rank + 1]; + + int index = 0; + for (int j = first_j; j < last_j; ++j) { + for (int i = 0; i < Nx; ++i) { + uid.add(node_uid(i, j)); + lid.add(index); + ++index; + } + } + + /* + * DEFINITION of an abstract family of unknowns + */ + Alien::DefaultAbstractFamily family(uid, parallel_mng); + Alien::IndexManager index_manager(parallel_mng); + + /* + * Creation of a set of indexes + */ + auto indexSetU = index_manager.buildScalarIndexSet("U", lid, family, 0); + + // Combine all index set and create Linear system index system + index_manager.prepare(); + + auto global_size = index_manager.globalSize(); + auto local_size = index_manager.localSize(); + + trace_mng->info() << "GLOBAL SIZE : " << global_size; + trace_mng->info() << "LOCAL SIZE : " << local_size; + + /* + * DEFINITION of + * - Alien Space, + * - matrix and vector distributions + * to manage the distribution of indexes between all MPI processes + */ + + auto space = Alien::Space(global_size, "MySpace"); + + auto mdist = + Alien::MatrixDistribution(global_size, global_size, local_size, parallel_mng); + auto vdist = Alien::VectorDistribution(global_size, local_size, parallel_mng); + + trace_mng->info() << "MATRIX DISTRIBUTION INFO"; + trace_mng->info() << "GLOBAL ROW SIZE : " << mdist.globalRowSize(); + trace_mng->info() << "LOCAL ROW SIZE : " << mdist.localRowSize(); + trace_mng->info() << "GLOBAL COL SIZE : " << mdist.globalColSize(); + trace_mng->info() << "LOCAL COL SIZE : " << mdist.localColSize(); + + trace_mng->info() << "VECTOR DISTRIBUTION INFO"; + trace_mng->info() << "GLOBAL SIZE : " << vdist.globalSize(); + trace_mng->info() << "LOCAL SIZE : " << vdist.localSize(); + + +Matrix +------ + +The Matrix concept represents a set of :math:`N_i` linear equations (rows) :math:`(y_i)` of :math:`N_j` unknowns :math:`(x_j)` (columns). +This represents a linear application :math:`S_X \mapsto S_Y` with :math:`x \in S_X`, :math:`y \in S_Y` and :math:`x \mapsto y=A*x`. +Usually the dimension of :math:`S_X` and :math:`S_Y` are equal, :math:`N_i=N_j`. In that case the matrix is square. + +.. code-block:: bash + + /* + * MATRIX CONSTRUCTION STEP + */ + auto A = Alien::Matrix(mdist); + + /* FILLING STEP */ + + alien_info([&] { cout() << "DIRECT ONE STEP FILLING PHASE";}) ; + + auto tag = Alien::DirectMatrixOptions::eResetValues; + { + auto builder = Alien::DirectMatrixBuilder(A, tag, Alien::DirectMatrixOptions::SymmetricFlag::eUnSymmetric); + + // RESERVE 5 non zero entries per row + builder.reserve(5); + builder.allocate(); + + // LOOP FOLLOWING Y AXE + for (int j = first_j; j < last_j; ++j) { + // LOOP FOLLOWING X AXE + for (int i = 0; i < Nx; ++i) { + auto n_uid = node_uid(i, j); + auto n_lid = uid2lid[n_uid]; + auto irow = allUIndex[n_lid]; + + // DIAGONAL FILLING + builder(irow, irow) = 4; + + // OFF DIAG FILLING + // On bottom + if (j > 0) { + auto off_uid = node_uid(i, j - 1); + auto off_lid = uid2lid[off_uid]; + auto jcol = allUIndex[off_lid]; + if (jcol != -1) + builder(irow, jcol) = -1; + } + // On the left size + if (i > 0) { + auto off_uid = node_uid(i - 1, j); + auto off_lid = uid2lid[off_uid]; + auto jcol = allUIndex[off_lid]; + if (jcol != -1) + builder(irow, jcol) = -1; + } + // on the right side + if (i < Nx - 1) { + auto off_uid = node_uid(i + 1, j); + auto off_lid = uid2lid[off_uid]; + auto jcol = allUIndex[off_lid]; + if (jcol != -1) + builder(irow, jcol) = -1; + } + // On the top + if (j < Ny - 1) { + auto off_uid = node_uid(i, j + 1); + auto off_lid = uid2lid[off_uid]; + auto jcol = allUIndex[off_lid]; + if (jcol != -1) + builder(irow, jcol) = -1; + } + } + } + } + + +Vector +------ + +The Vector concept represents the set of unknowns :math:`x=(x_i)` element of a linear space :math:`S_X`. + +.. code-block:: bash + + /* + * VECTOR CONSTRUCTION + */ + auto B = Alien::Vector(vdist); + + // VECTOR FILLING STEP + { + Alien::VectorWriter writer(B); + + // LOOP ALONG Y AXE + for (int j = first_j; j < last_j; ++j) { + // LOOP ALONG X AXE + for (int i = 0; i < Nx; ++i) { + auto n_uid = node_uid(i, j); + auto n_lid = uid2lid[n_uid]; + auto irow = allUIndex[n_lid]; + + writer[irow] = 1. / (1. + i + j); + } + } + } + + // VECTOR ACCESSOR + { + Alien::LocalVectorReader reader(B); + for (int i = 0; i < reader.size(); ++i) { + trace_mng->info() << "B[" << i << "]=" << reader[i]; + } + } + + +Linear Systems resolution +------------------------- + +A linear system is reprensented by a matrix :math:`A`, and two vectors :math:`B` and :math:`X` where :math:`B` is the system right hand side and :math:`X` the solution. + +Solving the linear system consists in finding the solution X such that :math:`A*X=B` applying a linear solver algorithm. + + +.. code-block:: bash + + /* + * LINEAR SYSTEM CONSTRUCTION + */ + + auto A = Alien::Matrix(mdist); + auto B = Alien::Vector(vdist); + auto X = Alien::Vector(vdist); + + auto solver = createSolver(/* ... */) ; + + solver->init() ; + + solver->solve(matrixA, vectorB, vectorX); + + Alien::SolverStatus status = solver->getStatus(); + if (status.succeeded) + { + alien_info()([&]{ cout()<<"SOLVER HAS SUCCEEDED";}) ; + + SimpleCSRLinearAlgebra alg; + Alien::Vector vectorR(m_vdist); + alg.mult(matrixA, vectorX, vectorR); + alg.axpy(-1., vectorB, vectorR); + Real res = alg.norm2(vectorR); + alien_info([&] cout() << "RES : " << res;}) ; + } + else + alien_info()([&]{ cout()<<"SOLVER FAILED";}) ; + solver->getSolverStat().print(Universe().traceMng(), status, "Linear Solver : "); + } + + solver->end(); + \ No newline at end of file diff --git a/docs/sphinx/user/index.rst b/docs/sphinx/user/index.rst index 42363eee2..2de54696f 100644 --- a/docs/sphinx/user/index.rst +++ b/docs/sphinx/user/index.rst @@ -7,4 +7,5 @@ Alien user documentation :maxdepth: 2 build concepts - move \ No newline at end of file + move + ref \ No newline at end of file diff --git a/docs/sphinx/user/ref.rst b/docs/sphinx/user/ref.rst new file mode 100644 index 000000000..9a6ee832d --- /dev/null +++ b/docs/sphinx/user/ref.rst @@ -0,0 +1,58 @@ +.. _user_ref_build: + +Building with ref semantic +=========================== + +DirectMatrixBuilder +------------------- + +.. doxygenclass:: Alien::DirectMatrixBuilder + :project: doxygen_api_docs_refsemantic + :members: + :undoc-members: + +ProfiledMatrixBuilder +--------------------- + +.. doxygenclass:: Alien::ProfiledMatrixBuilder + :project: doxygen_api_docs_refsemantic + + +StreamMatrixBuilder +--------------------- + +.. doxygenclass:: Alien::StreamMatrixBuilderT + :project: doxygen_api_docs_refsemantic + +Matrix +------ + +.. doxygenclass:: Alien::Matrix + :project: doxygen_api_docs_refsemantic + :members: + :undoc-members: + +IMatrix +------- + +.. doxygenclass:: Alien::IMatrix + :project: doxygen_api_docs_core_data + :members: + :undoc-members: + + +Vector +------ + +.. doxygenclass:: Alien::Vector + :project: doxygen_api_docs_refsemantic + :members: + :undoc-members: + +IVector +------- + +.. doxygenclass:: Alien::IVector + :project: doxygen_api_docs_core_data + :members: + :undoc-members: diff --git a/docs/tutorial/dist_linear_system.cpp b/docs/tutorial/dist_linear_system.cpp index 1896fd1b2..83dfd59c9 100644 --- a/docs/tutorial/dist_linear_system.cpp +++ b/docs/tutorial/dist_linear_system.cpp @@ -111,7 +111,7 @@ int main(int argc, char** argv) // Define a lambda function to compute node uids from the 2D (i,j) coordinates // (i,j) -> uid = node_uid(i,j) - auto node_uid = [&](int i, int j) { return j * Ny + i; }; + auto node_uid = [&](int i, int j) { return j * Nx + i; }; /* * DEFINITION of Unknowns Unique Ids and Local Ids diff --git a/docs/tutorial/dist_matrix.cpp b/docs/tutorial/dist_matrix.cpp index 71608615c..fdb480dd6 100644 --- a/docs/tutorial/dist_matrix.cpp +++ b/docs/tutorial/dist_matrix.cpp @@ -110,7 +110,7 @@ int main(int argc, char** argv) // Define a lambda function to compute node uids from the 2D (i,j) coordinates // (i,j) -> uid = node_uid(i,j) - auto node_uid = [&](int i, int j) { return j * Ny + i; }; + auto node_uid = [&](int i, int j) { return j * Nx + i; }; /* * DEFINITION of Unknowns Unique Ids and Local Ids diff --git a/docs/tutorial/dist_vector.cpp b/docs/tutorial/dist_vector.cpp index 6ceca8e2b..052ec06a0 100644 --- a/docs/tutorial/dist_vector.cpp +++ b/docs/tutorial/dist_vector.cpp @@ -109,7 +109,7 @@ int main(int argc, char** argv) // Define a lambda function to compute node uids from the 2D (i,j) coordinates // (i,j) -> uid = node_uid(i,j) - auto node_uid = [&](int i, int j) { return j * Ny + i; }; + auto node_uid = [&](int i, int j) { return j * Nx + i; }; /* * DEFINITION of Unknowns Unique Ids and Local Ids diff --git a/src/refsemantic/CMakeLists.txt b/src/refsemantic/CMakeLists.txt index 6c501cc5d..e602d1189 100644 --- a/src/refsemantic/CMakeLists.txt +++ b/src/refsemantic/CMakeLists.txt @@ -14,6 +14,44 @@ # # SPDX-License-Identifier: Apache-2.0 + +set(alien_refsemantic_public_header + alien/ref/AlienImportExport.h + alien/ref/AlienRefSemantic.h + alien/ref/AlienRefSemanticPrecomp.h + alien/ref/data/block/BlockMatrix.h + alien/ref/data/block/BlockVector.h + alien/ref/data/block/VBlockMatrix.h + alien/ref/data/block/VBlockVector.h + alien/ref/data/scalar/Matrix.h + alien/ref/data/scalar/RedistributedMatrix.h + alien/ref/data/scalar/RedistributedVector.h + alien/ref/data/scalar/Vector.h + alien/ref/functional/Ones.h + alien/ref/functional/Zeros.h + alien/ref/handlers/block/ProfiledBlockMatrixBuilder.h + alien/ref/handlers/profiler/MatrixProfiler.h + alien/ref/handlers/scalar/DirectMatrixBuilder.h + alien/ref/handlers/scalar/ProfiledMatrixBuilder.h + alien/ref/handlers/stream/StreamMatrixBuilder.h + alien/ref/handlers/stream/StreamMatrixBuilderInserter.h + alien/ref/handlers/stream/StreamMatrixBuilderInserterT.h + alien/ref/handlers/stream/StreamMatrixBuilderT.h + alien/ref/handlers/stream/StreamVBlockMatrixBuilder.h + alien/ref/handlers/stream/StreamVBlockMatrixBuilderInserter.h + alien/ref/handlers/stream/StreamVBlockMatrixBuilderInserterT.h + alien/ref/handlers/stream/StreamVBlockMatrixBuilderT.h + alien/ref/handlers/block/BlockVectorReader.h + alien/ref/handlers/block/BlockVectorWriter.h + alien/ref/handlers/block/VBlockVectorReader.h + alien/ref/handlers/block/VBlockVectorWriter.h + alien/ref/handlers/scalar/VectorReader.h + alien/ref/handlers/scalar/VectorWriter.h + alien/ref/import_export/SystemInfo.h + alien/ref/import_export/SystemReader.h + alien/ref/import_export/SystemWriter.h + alien/ref/import_export/HDF5Tools.h) + add_library(alien_semantic_ref alien/ref/AlienImportExport.h alien/ref/AlienRefSemantic.h @@ -65,6 +103,15 @@ add_library(alien_semantic_ref alien/ref/import_export/SystemWriter.h alien/ref/import_export/HDF5Tools.h) +if (ALIEN_GENERATE_DOCUMENTATION) + set(DOXYGEN_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") + doxygen_add_docs(doxygen_api_docs_refsemantic + ${alien_refsemantic_public_header} + USE_STAMP_FILE + COMMENT "Generate API-documents for Alien." + ) +endif (ALIEN_GENERATE_DOCUMENTATION) + if (ALIEN_USE_LIBXML2) find_package(LibXml2 REQUIRED) diff --git a/tools/python/alien-env.yml b/tools/python/alien-env.yml new file mode 100644 index 000000000..3ba8c2155 --- /dev/null +++ b/tools/python/alien-env.yml @@ -0,0 +1,7 @@ +name: alien-env +channels: +- conda-forge/label/cf202003 +- anaconda +dependencies: +- sphinx +- breathe diff --git a/tools/sycl/install-hipsycl.sh b/tools/sycl/install-hipsycl.sh new file mode 100644 index 000000000..682756413 --- /dev/null +++ b/tools/sycl/install-hipsycl.sh @@ -0,0 +1,57 @@ +#!/bin/bash +set -o xtrace +HIPSYCL_PKG_LLVM_VERSION_MAJOR=${HIPSYCL_PKG_LLVM_VERSION_MAJOR:-11} +HIPSYCL_PKG_LLVM_VERSION_MINOR=${HIPSYCL_PKG_LLVM_VERSION_MINOR:-0} +HIPSYCL_PKG_LLVM_VERSION_PATCH=${HIPSYCL_PKG_LLVM_VERSION_PATCH:-0} +HIPSYCL_PKG_LLVM_REPO_BRANCH=${HIPSYCL_PKG_LLVM_REPO_BRANCH:-release/${HIPSYCL_PKG_LLVM_VERSION_MAJOR}.x} + +export HIPSYCL_INSTALL_PREFIX=${HIPSYCL_INSTALL_PREFIX:-/opt/hipSYCL} + +set -e +HIPSYCL_BUILD_DIR=${HIPSYCL_BUILD_DIR:-/tmp/hipSYCL-installer} +HIPSYCL_REPO_USER=${HIPSYCL_REPO_USER:-illuhad} +HIPSYCL_REPO_BRANCH=${HIPSYCL_REPO_BRANCH:-stable} +HIPSYCL_WITH_CUDA=${HIPSYCL_WITH_CUDA:-ON} +HIPSYCL_WITH_ROCM=${HIPSYCL_WITH_ROCM:-ON} + +LLVM_INCLUDE_PATH=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/lib/clang/${HIPSYCL_PKG_LLVM_VERSION_MAJOR}.\ +${HIPSYCL_PKG_LLVM_VERSION_MINOR}.\ +${HIPSYCL_PKG_LLVM_VERSION_PATCH}/include +if [ -d "$HIPSYCL_BUILD_DIR" ]; then + read -p "The build directory already exists, do you want to use $HIPSYCL_BUILD_DIR anyways?[y]" -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Please specify a different directory, exiting" + [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 + else + echo "Using the exisiting directory" + fi +else +echo "Cloning hipSYCL" +git clone --recurse-submodules -b $HIPSYCL_REPO_BRANCH https://github.com/$HIPSYCL_REPO_USER/hipSYCL $HIPSYCL_BUILD_DIR + +fi + +mkdir -p $HIPSYCL_BUILD_DIR/build-2020 +cd $HIPSYCL_BUILD_DIR/build-2020 + +#-DCMAKE_C_COMPILER=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang \ +#-DCMAKE_CXX_COMPILER=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang++ \ +#-DCMAKE_C_COMPILER=gcc \ +#-DCMAKE_CXX_COMPILER=g++ \ +cmake \ +-DCMAKE_C_COMPILER=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang \ +-DCMAKE_CXX_COMPILER=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang++ \ +-DCMAKE_CXX_FLAGS:STRING='--gcc-toolchain=/work/gratienj/local/expl/eb/centos_7/easybuild/software/Core/GCCcore/10.2.0' \ +-DWITH_CPU_BACKEND=ON \ +-DWITH_CUDA_BACKEND=$HIPSYCL_WITH_CUDA \ +-DWITH_ROCM_BACKEND=$HIPSYCL_WITH_ROCM \ +-DLLVM_DIR=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/lib/cmake/llvm \ +-DROCM_PATH=$HIPSYCL_INSTALL_PREFIX/rocm \ +-DCUDA_TOOLKIT_ROOT_DIR=$HIPSYCL_LLVM_INSTALL_PREFIX/cuda \ +-DCLANG_EXECUTABLE_PATH=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang++ \ +-DCLANG_INCLUDE_PATH=$LLVM_INCLUDE_PATH \ +-DCMAKE_INSTALL_PREFIX=$HIPSYCL_INSTALL_PREFIX \ +-DROCM_LINK_LINE='-rpath $HIPSYCL_ROCM_LIB_PATH -rpath $HIPSYCL_ROCM_PATH/hsa/lib -L$HIPSYCL_ROCM_LIB_PATH -lhip_hcc -lamd_comgr -lamd_hostcall -lhsa-runtime64 -latmi_runtime -rpath $HIPSYCL_ROCM_PATH/hcc/lib -L$HIPSYCL_ROCM_PATH/hcc/lib -lmcwamp -lhc_am' \ +.. +make install diff --git a/tools/sycl/install-llvm.sh b/tools/sycl/install-llvm.sh new file mode 100644 index 000000000..a82b66b59 --- /dev/null +++ b/tools/sycl/install-llvm.sh @@ -0,0 +1,57 @@ +#!/bin/bash +HIPSYCL_PKG_LLVM_VERSION_MAJOR=${HIPSYCL_PKG_LLVM_VERSION_MAJOR:-9} +HIPSYCL_PKG_LLVM_VERSION_MINOR=${HIPSYCL_PKG_LLVM_VERSION_MINOR:-0} +HIPSYCL_PKG_LLVM_VERSION_PATCH=${HIPSYCL_PKG_LLVM_VERSION_PATCH:-1} +HIPSYCL_PKG_LLVM_REPO_BRANCH=${HIPSYCL_PKG_LLVM_REPO_BRANCH:-release/${HIPSYCL_PKG_LLVM_VERSION_MAJOR}.x} + +HIPSYCL_PKG_LLVM_VERSION=${HIPSYCL_PKG_LLVM_VERSION_MAJOR}.${HIPSYCL_PKG_LLVM_VERSION_MINOR}.${HIPSYCL_PKG_LLVM_VERSION_PATCH} + + +HIPSYCL_PKG_LLVM_REPO_BRANCH=${HIPSYCL_PKG_LLVM_REPO_BRANCH:-release/9.x} +export HIPSYCL_INSTALL_PREFIX=${INSTALL_PREFIX:-/opt/hipSYCL} +HIPSYCL_LLVM_BUILD_DIR=${HIPSYCL_LLVM_BUILD_DIR:-$HOME/git/llvm-vanilla} + + +set -e +if [ -d "$HIPSYCL_LLVM_BUILD_DIR" ]; then + read -p "The build directory already exists, do you want to use $HIPSYCL_LLVM_BUILD_DIR anyways?[y]" -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Using the exisiting directory" + else + echo "Please specify a different directory, exiting" + [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 + fi +else + +echo "Cloning LLVM $HIPSYCL_PKG_LLVM_REPO_BRANCH" +git clone -b $HIPSYCL_PKG_LLVM_REPO_BRANCH https://github.com/llvm/llvm-project $HIPSYCL_LLVM_BUILD_DIR +fi + +case $HIPSYCL_PKG_LLVM_VERSION in + 9.0.1) + echo "Applying patch on $HIPSYCL_PKG_LLVM_VERSION" + sed -i 's/CHECK_SIZE_AND_OFFSET(ipc_perm, mode);//g' $HIPSYCL_LLVM_BUILD_DIR/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc + ;; +esac + + +export CC=${HIPSYCL_BASE_CC:-clang} +export CXX=${HIPSYCL_BASE_CXX:-clang++} +export BUILD_TYPE=Release +export HIPSYCL_LLVM_INSTALL_PREFIX=$INSTALL_PREFIX/llvm +export TARGETS_TO_BUILD="AMDGPU;NVPTX;X86" +export NUMTHREADS=`nproc` + +CMAKE_OPTIONS="-DLLVM_ENABLE_PROJECTS=clang;compiler-rt;lld;openmp -DOPENMP_ENABLE_LIBOMPTARGET=OFF -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=$HIPSYCL_LLVM_INSTALL_PREFIX -DLLVM_ENABLE_ASSERTIONS=OFF -DLLVM_TARGETS_TO_BUILD=$TARGETS_TO_BUILD -DCLANG_ANALYZER_ENABLE_Z3_SOLVER=0 -DLLVM_INCLUDE_BENCHMARKS=0 -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON -DCMAKE_INSTALL_RPATH=$INSTALL_PREFIX/lib -DLLVM_ENABLE_OCAMLDOC=OFF -DLLVM_ENABLE_BINDINGS=OFF -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON -DLLVM_ENABLE_DUMP=ON" + +mkdir -p $HIPSYCL_LLVM_BUILD_DIR/buildgcc93 +cd $HIPSYCL_LLVM_BUILD_DIR/buildgcc93 +cmake $CMAKE_OPTIONS $HIPSYCL_LLVM_BUILD_DIR/llvm +make -j $NUMTHREADS +make install +cp -p $HIPSYCL_LLVM_BUILD_DIR/build/bin/llvm-lit $HIPSYCL_LLVM_INSTALL_PREFIX/bin/llvm-lit +cp -p $HIPSYCL_LLVM_BUILD_DIR/build/bin/FileCheck $HIPSYCL_LLVM_INSTALL_PREFIX/bin/FileCheck +cp -p $HIPSYCL_LLVM_BUILD_DIR/build/bin/count $HIPSYCL_LLVM_INSTALL_PREFIX/bin/count +cp -p $HIPSYCL_LLVM_BUILD_DIR/build/bin/not $HIPSYCL_LLVM_INSTALL_PREFIX/bin/not +cp -p $HIPSYCL_LLVM_BUILD_DIR/build/bin/yaml-bench $HIPSYCL_LLVM_INSTALL_PREFIX/yaml-bench From 69d0bae2500b3b6bcff554885fdda22a9d6af1c2 Mon Sep 17 00:00:00 2001 From: Jean-Marc GRATIEN Date: Mon, 10 Jan 2022 14:38:09 +0100 Subject: [PATCH 2/6] update SYCL documentation --- docs/sphinx/sycl/SYCL.rst | 22 +++++++ docs/sphinx/sycl/build.rst | 4 +- docs/sphinx/sycl/example.rst | 107 ++++++++++++++++++++++++++++++++--- docs/sphinx/sycl/index.rst | 3 +- 4 files changed, 126 insertions(+), 10 deletions(-) create mode 100644 docs/sphinx/sycl/SYCL.rst diff --git a/docs/sphinx/sycl/SYCL.rst b/docs/sphinx/sycl/SYCL.rst new file mode 100644 index 000000000..75d7bb95f --- /dev/null +++ b/docs/sphinx/sycl/SYCL.rst @@ -0,0 +1,22 @@ +.. _sycl_SYCL: + +===================== +SYCL backend in ALIEN +===================== + +Introduction +============ + +Alien provide a SYCL backend to handle NVidia, AMD and Intel GP-GPUs + +It is based on the hipSYCL implementation of the SYCL 2020 API. + +It depends on : + +- LLVM and Clang +- CUDA 10 to handle NVidia GP-GPUs +- ROCM to handle AMD GP-GPUs +- OneAPI and DPC++ for Intel GP-GPUs + +It provides a Block EllPack Matrix implementation and a Linear Algebra with all +the Blas 1 and 2 operations required to implement the CG and BiCGStab krylov algorithms. \ No newline at end of file diff --git a/docs/sphinx/sycl/build.rst b/docs/sphinx/sycl/build.rst index 1fc4b1e19..65a9baa7c 100644 --- a/docs/sphinx/sycl/build.rst +++ b/docs/sphinx/sycl/build.rst @@ -1,10 +1,10 @@ .. _sycl_build: ===================================== -Building and using Alien SYCL BackEnd +Building and using Alien SYCL backend ===================================== -Building Alien SYCL BackEnd +Building Alien SYCL backend =========================== Alien's build system is based on CMake. diff --git a/docs/sphinx/sycl/example.rst b/docs/sphinx/sycl/example.rst index 07f0dac63..6af2d83b2 100644 --- a/docs/sphinx/sycl/example.rst +++ b/docs/sphinx/sycl/example.rst @@ -1,17 +1,110 @@ .. _sycl_example: -=================================== -Exemple of Alien SYCL backend usage -=================================== +======================================= +Exemple : how to use Alien SYCL backend +======================================= -Intro ------ +Introduction +------------ -This tutorial illustrates how to build a linear system and solve it with various linear solver algorithm with the Alien SYCL BackEnd. +This tutorial illustrates how to build vectors and matrices, to apply linear algebra operations +and to solve linear systems with solver supporting the Alien SYCL BackEnd. +Using SYCL Linear Algebra +------------------------- + +.. code-block:: bash + + /* + * LINEAR SYSTEM CONSTRUCTION + */ + + auto A = Alien::Matrix(mdist); + auto B = Alien::Vector(vdist); + auto X = Alien::Vector(vdist); + auto Y = Alien::Vector(vdist); + auto R = Alien::Vector(vdist); + + /* + * Create a SYCL LinearAlgebra object + */ + Alien::SYCLLinearAlgebra sycl_alg; + + /* + * Apply Blas operation to compute R = B - A*X + */ + sycl_alg.mult(A,X,Y) ; + sycl_alg.copy(B,R) + sycl_alg.axpy(-1,Y,R) + auto residual = sycl_alg.dot(R,R) ; + Linear Systems resolution ------------------------- -Todo \ No newline at end of file +.. code-block:: bash + + /* + * LINEAR SYSTEM CONSTRUCTION + */ + auto trace_mng = Alien::Universe.traceMng() ; + + auto A = Alien::Matrix(mdist); + auto B = Alien::Vector(vdist); + auto X = Alien::Vector(vdist); + + /* + * Create a SYCLInternalLinearAlgebra instance + * and get true SYCL Matrix and vectors implementations + */ + typedef Alien::SYCLInternalLinearAlgebra AlgebraType ; + typedef typename AlgebraType::BackEndType BackEndType ; + typedef Alien::Iteration StopCriteriaType ; + + AlgebraType sycl_alg; + + auto const& true_A = A.impl()->get() ; + auto const& true_b = b.impl()->get() ; + auto& true_x = x.impl()->get(true) ; + + /* + * Create a CG solver and stop criteria + */ + StopCriteriaType stop_criteria{alg,true_b,tol,max_iteration,output_level>0?trace_mng:nullptr} ; + + typedef Alien::CG SolverType ; + + SolverType solver{alg,trace_mng} ; + solver.setOutputLevel(output_level) ; + + /* + *Create a Chebyshev polynomial preconditioner + */ + trace_mng->info()<<"CHEBYSHEV PRECONDITIONER"; + double polynom_factor = 0.5 ; + int polynom_order = 3 ; + int polynom_factor_max_iter = 10 ; + + typedef Alien::ChebyshevPreconditioner PrecondType ; + PrecondType precond{alg,true_A,polynom_factor,polynom_order,polynom_factor_max_iter,trace_mng} ; + precond.init() ; + + /* + * Solve the Linear System A*x=B + */ + solver.solve(precond,stop_criteria,true_A,true_b,true_x) ; + + /* + * Analyze the solution + */ + if(stop_criteria.getStatus()) + { + trace_mng->info()<<"Solver has converged"; + trace_mng->info()<<"Nb iterations : "<info()<<"Criteria value : "<info()<<"Solver convergence failed"; + } diff --git a/docs/sphinx/sycl/index.rst b/docs/sphinx/sycl/index.rst index 05cb44071..df0c8bff3 100644 --- a/docs/sphinx/sycl/index.rst +++ b/docs/sphinx/sycl/index.rst @@ -1,10 +1,11 @@ .. _sycl: -Alien sycl documentation +Alien SYCL documentation ======================== .. toctree:: :maxdepth: 2 + SYCL install build example \ No newline at end of file From 203a6031313574ca74a75ab0d3bda5a50f82ee2c Mon Sep 17 00:00:00 2001 From: Jean-Marc GRATIEN Date: Mon, 10 Jan 2022 14:57:05 +0100 Subject: [PATCH 3/6] update SYCL documentation --- tools/sycl/install-hipsycl.sh | 30 +++++++++++++----------------- tools/sycl/install-llvm.sh | 20 ++++++++++---------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/tools/sycl/install-hipsycl.sh b/tools/sycl/install-hipsycl.sh index 682756413..80d4a208c 100644 --- a/tools/sycl/install-hipsycl.sh +++ b/tools/sycl/install-hipsycl.sh @@ -28,30 +28,26 @@ if [ -d "$HIPSYCL_BUILD_DIR" ]; then fi else echo "Cloning hipSYCL" -git clone --recurse-submodules -b $HIPSYCL_REPO_BRANCH https://github.com/$HIPSYCL_REPO_USER/hipSYCL $HIPSYCL_BUILD_DIR +git clone --recurse-submodules -b "$HIPSYCL_REPO_BRANCH" https://github.com/"$HIPSYCL_REPO_USER"/hipSYCL "$HIPSYCL_BUILD_DIR" fi -mkdir -p $HIPSYCL_BUILD_DIR/build-2020 -cd $HIPSYCL_BUILD_DIR/build-2020 +mkdir -p "$HIPSYCL_BUILD_DIR"/build-2020 +cd "$HIPSYCL_BUILD_DIR"/build-2020 -#-DCMAKE_C_COMPILER=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang \ -#-DCMAKE_CXX_COMPILER=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang++ \ -#-DCMAKE_C_COMPILER=gcc \ -#-DCMAKE_CXX_COMPILER=g++ \ cmake \ --DCMAKE_C_COMPILER=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang \ --DCMAKE_CXX_COMPILER=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang++ \ --DCMAKE_CXX_FLAGS:STRING='--gcc-toolchain=/work/gratienj/local/expl/eb/centos_7/easybuild/software/Core/GCCcore/10.2.0' \ +-DCMAKE_C_COMPILER="$HIPSYCL_LLVM_INSTALL_PREFIX"/llvm/bin/clang \ +-DCMAKE_CXX_COMPILER="$HIPSYCL_LLVM_INSTALL_PREFIX"/llvm/bin/clang++ \ +-DCMAKE_CXX_FLAGS:STRING="--gcc-toolchain=$GCCCORE_ROOT" \ -DWITH_CPU_BACKEND=ON \ -DWITH_CUDA_BACKEND=$HIPSYCL_WITH_CUDA \ -DWITH_ROCM_BACKEND=$HIPSYCL_WITH_ROCM \ --DLLVM_DIR=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/lib/cmake/llvm \ --DROCM_PATH=$HIPSYCL_INSTALL_PREFIX/rocm \ --DCUDA_TOOLKIT_ROOT_DIR=$HIPSYCL_LLVM_INSTALL_PREFIX/cuda \ --DCLANG_EXECUTABLE_PATH=$HIPSYCL_LLVM_INSTALL_PREFIX/llvm/bin/clang++ \ --DCLANG_INCLUDE_PATH=$LLVM_INCLUDE_PATH \ --DCMAKE_INSTALL_PREFIX=$HIPSYCL_INSTALL_PREFIX \ --DROCM_LINK_LINE='-rpath $HIPSYCL_ROCM_LIB_PATH -rpath $HIPSYCL_ROCM_PATH/hsa/lib -L$HIPSYCL_ROCM_LIB_PATH -lhip_hcc -lamd_comgr -lamd_hostcall -lhsa-runtime64 -latmi_runtime -rpath $HIPSYCL_ROCM_PATH/hcc/lib -L$HIPSYCL_ROCM_PATH/hcc/lib -lmcwamp -lhc_am' \ +-DLLVM_DIR="$HIPSYCL_LLVM_INSTALL_PREFIX"/llvm/lib/cmake/llvm \ +-DROCM_PATH="$HIPSYCL_INSTALL_PREFIX"/rocm \ +-DCUDA_TOOLKIT_ROOT_DIR="$HIPSYCL_LLVM_INSTALL_PREFIX"/cuda \ +-DCLANG_EXECUTABLE_PATH="$HIPSYCL_LLVM_INSTALL_PREFIX"/llvm/bin/clang++ \ +-DCLANG_INCLUDE_PATH="$LLVM_INCLUDE_PATH" \ +-DCMAKE_INSTALL_PREFIX="$HIPSYCL_INSTALL_PREFIX" \ +-DROCM_LINK_LINE="-rpath $HIPSYCL_ROCM_LIB_PATH -rpath $HIPSYCL_ROCM_PATH/hsa/lib -L$HIPSYCL_ROCM_LIB_PATH -lhip_hcc -lamd_comgr -lamd_hostcall -lhsa-runtime64 -latmi_runtime -rpath $HIPSYCL_ROCM_PATH/hcc/lib -L$HIPSYCL_ROCM_PATH/hcc/lib -lmcwamp -lhc_am" \ .. make install diff --git a/tools/sycl/install-llvm.sh b/tools/sycl/install-llvm.sh index a82b66b59..472c83281 100644 --- a/tools/sycl/install-llvm.sh +++ b/tools/sycl/install-llvm.sh @@ -25,7 +25,7 @@ if [ -d "$HIPSYCL_LLVM_BUILD_DIR" ]; then else echo "Cloning LLVM $HIPSYCL_PKG_LLVM_REPO_BRANCH" -git clone -b $HIPSYCL_PKG_LLVM_REPO_BRANCH https://github.com/llvm/llvm-project $HIPSYCL_LLVM_BUILD_DIR +git clone -b "$HIPSYCL_PKG_LLVM_REPO_BRANCH" https://github.com/llvm/llvm-project "$HIPSYCL_LLVM_BUILD_DIR" fi case $HIPSYCL_PKG_LLVM_VERSION in @@ -45,13 +45,13 @@ export NUMTHREADS=`nproc` CMAKE_OPTIONS="-DLLVM_ENABLE_PROJECTS=clang;compiler-rt;lld;openmp -DOPENMP_ENABLE_LIBOMPTARGET=OFF -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=$HIPSYCL_LLVM_INSTALL_PREFIX -DLLVM_ENABLE_ASSERTIONS=OFF -DLLVM_TARGETS_TO_BUILD=$TARGETS_TO_BUILD -DCLANG_ANALYZER_ENABLE_Z3_SOLVER=0 -DLLVM_INCLUDE_BENCHMARKS=0 -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON -DCMAKE_INSTALL_RPATH=$INSTALL_PREFIX/lib -DLLVM_ENABLE_OCAMLDOC=OFF -DLLVM_ENABLE_BINDINGS=OFF -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON -DLLVM_ENABLE_DUMP=ON" -mkdir -p $HIPSYCL_LLVM_BUILD_DIR/buildgcc93 -cd $HIPSYCL_LLVM_BUILD_DIR/buildgcc93 -cmake $CMAKE_OPTIONS $HIPSYCL_LLVM_BUILD_DIR/llvm -make -j $NUMTHREADS +mkdir -p "$HIPSYCL_LLVM_BUILD_DIR"/buildgcc93 +cd "$HIPSYCL_LLVM_BUILD_DIR"/build +cmake "$CMAKE_OPTIONS" "$HIPSYCL_LLVM_BUILD_DIR"/llvm +make -j "$NUMTHREADS" make install -cp -p $HIPSYCL_LLVM_BUILD_DIR/build/bin/llvm-lit $HIPSYCL_LLVM_INSTALL_PREFIX/bin/llvm-lit -cp -p $HIPSYCL_LLVM_BUILD_DIR/build/bin/FileCheck $HIPSYCL_LLVM_INSTALL_PREFIX/bin/FileCheck -cp -p $HIPSYCL_LLVM_BUILD_DIR/build/bin/count $HIPSYCL_LLVM_INSTALL_PREFIX/bin/count -cp -p $HIPSYCL_LLVM_BUILD_DIR/build/bin/not $HIPSYCL_LLVM_INSTALL_PREFIX/bin/not -cp -p $HIPSYCL_LLVM_BUILD_DIR/build/bin/yaml-bench $HIPSYCL_LLVM_INSTALL_PREFIX/yaml-bench +cp -p "$HIPSYCL_LLVM_BUILD_DIR"/build/bin/llvm-lit "$HIPSYCL_LLVM_INSTALL_PREFIX"/bin/llvm-lit +cp -p "$HIPSYCL_LLVM_BUILD_DIR"/build/bin/FileCheck "$HIPSYCL_LLVM_INSTALL_PREFIX"/bin/FileCheck +cp -p "$HIPSYCL_LLVM_BUILD_DIR"/build/bin/count "$HIPSYCL_LLVM_INSTALL_PREFIX"/bin/count +cp -p "$HIPSYCL_LLVM_BUILD_DIR"/build/bin/not "$HIPSYCL_LLVM_INSTALL_PREFIX"/bin/not +cp -p "$HIPSYCL_LLVM_BUILD_DIR"/build/bin/yaml-bench "$HIPSYCL_LLVM_INSTALL_PREFIX"/yaml-bench From ce8b275a9b0a9dc5ec3a4eb8412249e4716d9d2c Mon Sep 17 00:00:00 2001 From: Jean-Marc GRATIEN Date: Mon, 10 Jan 2022 15:10:21 +0100 Subject: [PATCH 4/6] update SYCL documentation --- tools/sycl/install-hipsycl.sh | 4 ++-- tools/sycl/install-llvm.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/sycl/install-hipsycl.sh b/tools/sycl/install-hipsycl.sh index 80d4a208c..4c5c4358f 100644 --- a/tools/sycl/install-hipsycl.sh +++ b/tools/sycl/install-hipsycl.sh @@ -40,8 +40,8 @@ cmake \ -DCMAKE_CXX_COMPILER="$HIPSYCL_LLVM_INSTALL_PREFIX"/llvm/bin/clang++ \ -DCMAKE_CXX_FLAGS:STRING="--gcc-toolchain=$GCCCORE_ROOT" \ -DWITH_CPU_BACKEND=ON \ --DWITH_CUDA_BACKEND=$HIPSYCL_WITH_CUDA \ --DWITH_ROCM_BACKEND=$HIPSYCL_WITH_ROCM \ +-DWITH_CUDA_BACKEND="$HIPSYCL_WITH_CUDA" \ +-DWITH_ROCM_BACKEND="$HIPSYCL_WITH_ROCM" \ -DLLVM_DIR="$HIPSYCL_LLVM_INSTALL_PREFIX"/llvm/lib/cmake/llvm \ -DROCM_PATH="$HIPSYCL_INSTALL_PREFIX"/rocm \ -DCUDA_TOOLKIT_ROOT_DIR="$HIPSYCL_LLVM_INSTALL_PREFIX"/cuda \ diff --git a/tools/sycl/install-llvm.sh b/tools/sycl/install-llvm.sh index 472c83281..d89e70c8b 100644 --- a/tools/sycl/install-llvm.sh +++ b/tools/sycl/install-llvm.sh @@ -31,7 +31,7 @@ fi case $HIPSYCL_PKG_LLVM_VERSION in 9.0.1) echo "Applying patch on $HIPSYCL_PKG_LLVM_VERSION" - sed -i 's/CHECK_SIZE_AND_OFFSET(ipc_perm, mode);//g' $HIPSYCL_LLVM_BUILD_DIR/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc + sed -i 's/CHECK_SIZE_AND_OFFSET(ipc_perm, mode);//g' "$HIPSYCL_LLVM_BUILD_DIR"/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc ;; esac @@ -41,7 +41,7 @@ export CXX=${HIPSYCL_BASE_CXX:-clang++} export BUILD_TYPE=Release export HIPSYCL_LLVM_INSTALL_PREFIX=$INSTALL_PREFIX/llvm export TARGETS_TO_BUILD="AMDGPU;NVPTX;X86" -export NUMTHREADS=`nproc` +export NUMTHREADS=$(nproc) CMAKE_OPTIONS="-DLLVM_ENABLE_PROJECTS=clang;compiler-rt;lld;openmp -DOPENMP_ENABLE_LIBOMPTARGET=OFF -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=$HIPSYCL_LLVM_INSTALL_PREFIX -DLLVM_ENABLE_ASSERTIONS=OFF -DLLVM_TARGETS_TO_BUILD=$TARGETS_TO_BUILD -DCLANG_ANALYZER_ENABLE_Z3_SOLVER=0 -DLLVM_INCLUDE_BENCHMARKS=0 -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON -DCMAKE_INSTALL_RPATH=$INSTALL_PREFIX/lib -DLLVM_ENABLE_OCAMLDOC=OFF -DLLVM_ENABLE_BINDINGS=OFF -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON -DLLVM_ENABLE_DUMP=ON" From 7ecb80b4f666c698fa70250d472535cb8c97deea Mon Sep 17 00:00:00 2001 From: Jean-Marc GRATIEN Date: Tue, 11 Jan 2022 11:15:45 +0100 Subject: [PATCH 5/6] update doc --- docs/sphinx/sycl/install.rst | 12 ++++++++++- docs/sphinx/tutorial.rst | 41 ++++++++++++++++++++++++------------ 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/docs/sphinx/sycl/install.rst b/docs/sphinx/sycl/install.rst index e80e09bde..53b87f420 100644 --- a/docs/sphinx/sycl/install.rst +++ b/docs/sphinx/sycl/install.rst @@ -7,7 +7,17 @@ How to install SYCL Installing SYCL =============== -Alien's build system is based on CMake. +Alien SYCL backend has been developped on top of the hipSYCL implementation of the SYCL API 2020 specification. + +hipSYCL depend on the LLVM infrastructure, Clang compiler to compile device codes. +Our implementation still indevelopement has been tested with: + +- LLVM 10.0 +- Clang with GCC 10.2 +- CUDA 10.1 + +AMD devices with ROCM and Intel device with OneAPI and DPC++ have not been already tested. + Getting the sources ------------------- diff --git a/docs/sphinx/tutorial.rst b/docs/sphinx/tutorial.rst index a08898f4a..e7f3836b0 100644 --- a/docs/sphinx/tutorial.rst +++ b/docs/sphinx/tutorial.rst @@ -51,10 +51,12 @@ The Space concept enable to modelize the mathematical algebraic real space :math To build this concept several tools are provided: -- the `IndexeManager` package provides helper tools to manage `Integer IndexSets` +- the `IndexManager` package provides helper tools to manage `Integer IndexSets` - the `Distribution` package provides helper tools to manage the partition of `IndexSets` between MPI processes +The following code illustrates how to build with an `IndexManager` object, families of unique indexes and different `IndexSet` objects. + .. code-block:: bash int Nx = 10; @@ -110,24 +112,24 @@ To build this concept several tools are provided: // Combine all index set and create Linear system index system index_manager.prepare(); + +Once some `IndexSet` are built and enregistred in the `IndexManager`, matrix and vector `Distribution` objects +are built to manage the distribution of indexes between MPI processes. + +The following code illustrates how to build theses objects. + +.. code-block:: bash + auto global_size = index_manager.globalSize(); auto local_size = index_manager.localSize(); trace_mng->info() << "GLOBAL SIZE : " << global_size; trace_mng->info() << "LOCAL SIZE : " << local_size; - /* - * DEFINITION of - * - Alien Space, - * - matrix and vector distributions - * to manage the distribution of indexes between all MPI processes - */ - - auto space = Alien::Space(global_size, "MySpace"); - - auto mdist = - Alien::MatrixDistribution(global_size, global_size, local_size, parallel_mng); - auto vdist = Alien::VectorDistribution(global_size, local_size, parallel_mng); + auto mdist = Alien::MatrixDistribution(global_size, global_size, + local_size, parallel_mng); + auto vdist = Alien::VectorDistribution(global_size, + local_size, parallel_mng); trace_mng->info() << "MATRIX DISTRIBUTION INFO"; trace_mng->info() << "GLOBAL ROW SIZE : " << mdist.globalRowSize(); @@ -140,6 +142,19 @@ To build this concept several tools are provided: trace_mng->info() << "LOCAL SIZE : " << vdist.localSize(); +Then `Space` objects can be built as follows: + +.. code-block:: bash + + /* + * DEFINITION of + * - Alien Space, + * - matrix and vector distributions + * to manage the distribution of indexes between all MPI processes + */ + + auto space = Alien::Space(global_size, "MySpace"); + Matrix ------ From a25bbb7fdb97f77e7bb780117aefe85af946fa9f Mon Sep 17 00:00:00 2001 From: Jean-Marc GRATIEN Date: Tue, 11 Jan 2022 11:18:04 +0100 Subject: [PATCH 6/6] update doc --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e37eb31a..cc019c2b5 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,8 @@ conda env create -f alien-env.yml conda activate alien-env ``` -Then the CMAKE OPTIONS has to be activated in the Alien configuration step + +Turn ON the ALIEN_GENERATE_DOCUMENTATION Options in the Alien configuration step. ```shell script cmake -S `pwd`/alien \