Git Product home page Git Product logo

kripke's Introduction

KRIPKE

Kripke is a simple, scalable, 3D Sn deterministic particle transport code. Its primary purpose is to research how data layout, programming paradigms and architectures effect the implementation and performance of Sn transport. A main goal of Kripke is to investigate how different data-layouts affect instruction, thread and task level parallelism, and what the implications are on overall solver performance.

Kripke supports storage of angular fluxes (Psi) using all six striding orders (or "nestings") of Directions (D), Groups (G), and Zones (Z), and provides computational kernels specifically written for each of these nestings. Most Sn transport codes are designed around one of these nestings, which is an inflexibility that leads to software engineering compromises when porting to new architectures and programming paradigms.

Early research has found that the problem dimensions (zones, groups, directions, scattering order) and the scaling (number of threads and MPI tasks), can make a profound difference in the performance of each of these nestings. To our knowledge, this is a capability unique to Kripke, and should provide key insight into how data-layout affects Sn solver performance. An asynchronous MPI-based parallel sweep algorithm is provided, which employs the concepts of Group Sets (GS), Zone Sets (ZS), and Direction Sets (DS), borrowed from the Texas A&M code PDT.

As we explore new architectures and programming paradigms with Kripke, we will be able to incorporate these findings and ideas into our larger codes. The main advantages of using Kripke for this exploration is that it's light-weight (i.e. easily refactored and modified), and it gets us closer to the real question we want answered: "What is the best way to layout and traverse data in parallel in an Sn code on a given architecture+programming-model?" instead of the more commonly asked question "What is the best way to map my existing Sn code to a given architecture+programming-model?".

Mini App or Proxy App?

Kripke is a Mini-App since it has a very small code base consisting of about 5000 lines of C++ code (using cloc v1.67).

Kripke is also a Proxy-App since it is a proxy for the LLNL transport code ARDRA.

Analysis

A major challenge of achieving high-performance in an Sn transport (or any physics) code is choosing a data-layout and a parallel decomposition that lends itself to the targeted architecture. Often the data-layout determines the most efficient nesting of loops in computational kernels, which then determines how well your inner-most-loop SIMD vectorizes, how you add threading (pthreads, OpenMP, etc.), and the efficiency and design of your parallel algorithms. Therefore, each nesting produces a different loop nesting orders with substantially different performance characteristics. We want to explore how easily and efficiently these different nestings map to different architectures. In particular, we are interested in exploring how we can achieve good parallel efficiency while also achieving efficient use of node resources (such as SIMD units, memory systems, and accelerators).

Parallel sweep algorithms can be explored with Kripke in multiple ways. The core MPI algorithm could be modified or rewritten to explore other approaches, domain overloading, or alternate programming models (such as Charm++). The effect of load-imbalance is an understudied aspect of Sn transport sweeps, and could easily be studied with Kripke by artificially adding more work (i.e. unknowns) to a subset of MPI tasks. Block-AMR could be added to Kripke, which would be a useful way to explore the cost-benefit analysis of adding AMR to an Sn code, and would be a way to further study load imbalances and AMR effects on sweeps.

The coupling of the on-node sweep kernel, the parallel sweep algorithm, and the choices of decomposing the problem phase space into GS's, ZS's and DS's impact the performance of the overall sweep. The trade off between large and small "units of work" can be studied. Larger "units of work" provide more opportunity for on-node parallelism, while creating larger messages, less "sends", and less efficient parallel sweeps. Smaller "units of work" make for less efficient on-node kernels, but more efficient parallel sweeps.

We can also study trading MPI tasks for threads, and the effects this has on our programming models and cache efficiency.

A simple timer infrastructure is provided that measure each compute kernels total time.

Physical Models

Kripke solves the Discrete Ordinance and Diamond Difference discretized steady-state linear Boltzmann equation.

    H * Psi = (LPlus * S * L) * Psi + Q

Where:

  • Psi is the unknown angular flux discretized over zones, directions, and energy groups

  • H is the "streaming-collision" operator. (Couples zones)

  • L is the "discrete-to-moments operator. (Couples directions and moments)

  • LPlus is the "moment-to-discrete" operator. (Couples directions and moments)

  • S is the (arbitrary) order scattering operator. (Couples groups)

  • Q is an external source. In Kripke it is represented in moment space, so really "LPlus*Q"

Kripke is hard-coded to setup and solve the 3D Kobayashi radiation benchmark, problem 3i. Since Kripke does not have reflecting boundary conditions, the full-space model is solved. Command line arguments allow the user to modify the total and scattering cross-sections. Since Kripke is a multi-group transport code and the Kobayashi problem is single-group, each energy group is setup to solve the same problem with no group-to-group coupling in the data.

The steady-state solution method uses the source-iteration technique, where each iteration is as follows:

  1. Phi = LTimes(Psi)
  2. PhiOut = Scattering(Phi)
  3. PhiOut = PhiOut + Source()
  4. Rhs = LPlusTimes(PhiOut)
  5. Psi = Sweep(Rhs, Psi) which is solving Psi=(Hinverse * Rhs) a.k.a "Inverting H"

Building and Running

Kripke comes with a BLT CMake-based build system based.

Requirements

Basic requirements:

  • CMake 3.20 or later for CUDA, and 3.23 or later for HIP support (minimum respective versions required by RAJA)

  • C++14 Compiler (g++, icpc, etc.)

  • (Optional) MPI 1.0 or later

  • (Optional) OpenMP 3 or later

  • (Optional) Caliper: a performance profiling/analysis library.

Submodule dependencies:

  • BLT v0.5.3: a CMake based build system (required)

  • RAJA v2023.06.1: a loop abstraction library (required)

  • CHAI v2023.06.0: a copy hiding abstraction for moving data between memory spaces (optional)

  • Umpire v2023.06.0: a memory management abstraction (required if using CHAI)

  • Cub: algorithm primitives library for CUDA (required by RAJA if using CUDA)

Getting Kripke

Two options are available:

The following are the instruction for cloning the tarball, and setting up your clone repository.

Clone the latest released version from github:

    git clone https://github.com/LLNL/Kripke.git

Clone all of the submodules. The Kripke build system, BLT, resides in another repository on github so one must initialize and update the "git submodules"

    cd Kripke
    git submodule update --init --recursive

The released source tarball on github is created with all of the submodules included already.

Quick Start

The easiest way to get Kripke running, is to directly invoke CMake and take whatever system defaults you have for compilers and let CMake find MPI for you.

  • Step 1: Create a build space (assuming you are starting in the Kripke root directory)

     mkdir build
    
  • Step 2: Run CMake in that build space

     cd build
     cmake ..
    
     For a number of platforms, we have CMake cache files that make things easier:
    
     cd build
     cmake .. -C ../host-configs/llnl-bgqos-clang.cmake -DCMAKE_BUILD_TYPE=Release
    
  • Step 3: Now make Kripke:

     make -j8
    
  • Step 5: Run Kripke's default problem:

     ./bin/kripke.exe
    

There are a number of cache init files for LLNL machines and operating systems.
These might not meet your needs, but can be a very good starting point for developing your own. The current list of cache init files (located in the ./host-configs/ directory) are:

  • llnl-bgqos-clang.cmake

  • llnl-toss3-clang4.cmake

  • llnl-toss3-intel18.cmake

  • llnl-toss3-gcc7.1.cmake

  • llnl-toss3-gcc8.1.cmake

  • llnl-blueos-P100-nvcc-clang.cmake

  • llnl-blueos-V100-nvcc-clang.cmake

  • llnl-toss4-MI250X-rocm5-vernal.cmake

  • llnl-toss4-intel22.cmake

Running Kripke

Environment Variables

If Kripke is built with OpenMP support, then the environment variable OMP_NUM_THREADS is used to control the number of OpenMP threads. Kripke does not attempt to modify the OpenMP runtime in any way, so other OMP_* environment variables should also work as well.

If Kripke is built with Caliper support, Caliper performance measurements can be configured through Caliper environment variables. For example,

CALI_CONFIG_PROFILE=runtime-report ./kripke ...

will print a time profile of annotated code regions in Kripke. For more information, see https://llln.github.io/Caliper.

If building Kripke on RZVernal, then the rocm and cmake/3.24.2 modules need to be loaded.

Command Line Options

Command line option help can also be viewed by running "./kripke --help"

Problem Size Options:

  • --groups <ngroups>

    Number of energy groups. (Default: --groups 32)

  • --legendre <lorder>

    Scattering Legendre Expansion Order (0, 1, ...). (Default: --legendre 4)

  • --quad <ndirs>, or --quad <polar>:<azim>

    Define the quadrature set to use either a fake S2 with points, OR Gauss-Legendre with by points. (Default: --quad 96)

  • --zones <x>,<y>,<z>

    Number of zones in x,y,z. (Default: --zones 16,16,16)

Physics Parameters:

  • --sigt <sigt0,sigt1,sigt2>

    Total material cross-sections. (Default: --sigt 0.1,0.0001,0.1)

  • --sigs <sigs0,sigs1,sigs2>

    Total material cross-sections. (Default: --sigs 0.05,0.00005,0.05)

On-Node Options:

  • --arch <ARCH>

    Architecture selection. Selects the back-end used for computation, available are Sequential, OpenMP and CUDA. The default depends on capabilities selected by the build system and is selected from list of increasing precedence: Sequential, OpenMP and CUDA.

  • --layout <LAYOUT>

    Data layout selection. This determines the data layout and kernel implementation details (such as loop nesting order). The layouts are determined by the order of unknowns in the angular flux: Direction, Group, and Zone. Available layouts are DGZ, DZG, GDZ, GZD, ZDG, and ZGD. The order is specified left-to-right in longest-to-shortest stride. For example: DGZ means that Directions are the longest stride, and Zones are stride-1. (Default: --nest DGZ)

Parallel Decomposition Options:

  • --pdist <lout>

    Layout of spatial subdomains over MPI ranks. 0 for "Blocked" where local zone sets represent adjacent regions of space. 1 for "Scattered" where adjacent regions of space are distributed to adjacent MPI ranks. (Default: --layout 0)

  • --procs <npx,npy,npz>

    Number of MPI ranks in each spatial dimension. (Default: --procs 1,1,1)

  • --dset <ds>

    Number of direction-sets. Must be a factor of 8, and divide evenly the number of quadrature points. (Default: --dset 8)

  • --gset <gs>

    Number of energy group-sets. Must divide evenly the number energy groups. (Default: --gset 1)

  • --zset <zx>,<zy>,<zz>

    Number of zone-sets in x, y, and z. (Default: --zset 1:1:1)

Solver Options:

  • --niter <NITER>

    Number of solver iterations to run. (Default: --niter 10)

  • --pmethod <method>

    Parallel solver method. "sweep" for full up-wind sweep (wavefront algorithm). "bj" for Block Jacobi. (Default: --pmethod sweep)

Future Plans

Some ideas for future study:

  • More tuning of CUDA implementation

  • Block AMR

  • More FLOP intensive spatial discretizations such as DFEM's

Links

Release

Copyright (c) 2014-23, Lawrence Livermore National Security, LLC.

Produced at the Lawrence Livermore National Laboratory.

All rights reserved.

LLNL-CODE-775068

Unlimited Open Source - BSD Distribution

For release details and restrictions, please read the COPYRIGHT, LICENSE, and NOTICE files, also linked here:

kripke's People

Contributors

ajkunen avatar bailey42 avatar daboehme avatar davidbeckingsale avatar davidpoliakoff avatar mdavis36 avatar pgmaginot avatar rchen20 avatar rhornung67 avatar vsrana01 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kripke's Issues

Please tag releases

Good morning,

It would be extremely useful to track stable/released versions with tags in git. For example, I think revision 99a17c9 aligns with "kripke-openmp-1.1.tar.gz - Release v1.1 (September 7, 2015)" on the Co-design site at https://codesign.llnl.gov/kripke.php (with the exception of tarball.py, which is not included in the gzipped tarball).

Cheers.

Incorrect MPI configuration

Hi!

On my system, the build configuration could not detect MPI installation automatically:

/usr/bin/mpic++ --showme     
g++ -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi -I/usr/lib/x86_64-linux-gnu/openmpi/include -pthread -L/usr/lib/x86_64-linux-gnu/openmpi/lib -lmpi_cxx -lmpi

Thus, I inspected the provided config files and the CMakeLists.txt file to figure out the configuration:

set(CMAKE_CXX_FLAGS "-I/usr/lib/x86_64-linux-gnu/openmpi/include -pthread -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi/" CACHE STRING ""
set(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -L/usr/lib/x86_64-linux-gnu/openmpi/lib -lmpi_cxx -lmpi" CACHE STRING "")

However, this generates incorrect linking step:

/usr/bin/c++  -I/usr/lib/x86_64-linux-gnu/openmpi/include -pthread -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi/     -Wall -Wextra  -O3 -ffast-math   -L/usr/lib/x86_64-linux-gnu/openmpi/lib -lmpi_cxx -lmpi CMakeFiles/kripke.exe.dir/src/kripke.cpp.o  -o bin/kripke.exe  lib/libRAJA.a lib/libkripke.a lib/libRAJA.a -ldl

Since linking flags are included before static libraries, the paths are never resolved. The correct approach would be to paste additional linking options at the end of this command.

Furthermore, wouldn't it be simpler to use the default CMake module to provide MPI paths?

find_package(MPI REQUIRED)
include_directories(${MPI_C_INCLUDE_PATH})
SET(MPI_INCLUDE_PATH ${MPI_C_INCLUDE_PATH})
SET(MPI_LINK_FLAGS ${MPI_C_LIBRARIES})

default build fails due to OpenMP not enabled by default everywhere

Kripke assumes OpenMP by default but RAJA doesn't get built with it unless one sets it explicitly.

I'm going to submit a PR with the documentation fix in a moment but wanted to capture the issue here first.

$ git clean -dfx ; cmake .. -DCMAKE_C_COMPILER=gcc-7 -DCMAKE_CXX_COMPILER=g++-7 && make -j4
Removing CMakeCache.txt
Removing CMakeFiles/
Removing include/
Removing tpl/
-- The CXX compiler identification is GNU 7.2.0
-- Checking whether CXX compiler has -isysroot
-- Checking whether CXX compiler has -isysroot - yes
-- Checking whether CXX compiler supports OSX deployment target flag
-- Checking whether CXX compiler supports OSX deployment target flag - yes
-- Check for working CXX compiler: /usr/local/bin/g++-7
-- Check for working CXX compiler: /usr/local/bin/g++-7 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Git: /usr/local/bin/git (found version "2.15.1") 
-- Git Executable: /usr/local/bin/git
-- Git Version: 2.15.1
-- MPI Support is OFF
-- CUDA Support is OFF
-- Failed to locate valgrind executable (missing: VALGRIND_EXECUTABLE) 
-- OpenMP Support is OFF
-- Compiler family is GNU
-- Adding optional BLT definitions and compiler flags
-- Standard C++11 selected
-- Enabling all compiler warnings on all targets.
-- Fortran support disabled.
-- CMAKE_C_FLAGS flags are:    -Wall -Wextra 
-- CMAKE_CXX_FLAGS flags are:    -Wall -Wextra 
-- CMAKE_EXE_LINKER_FLAGS flags are:  
-- The C compiler identification is GNU 7.2.0
-- Checking whether C compiler has -isysroot
-- Checking whether C compiler has -isysroot - yes
-- Checking whether C compiler supports OSX deployment target flag
-- Checking whether C compiler supports OSX deployment target flag - yes
-- Check for working C compiler: /usr/local/bin/gcc-7
-- Check for working C compiler: /usr/local/bin/gcc-7 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Looking for posix_memalign
-- Looking for posix_memalign - found
-- Looking for aligned_alloc
-- Looking for aligned_alloc - not found
-- Looking for _mm_malloc
-- Looking for _mm_malloc - not found
-- Kripke selected architecture 'OpenMP'
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/jrhammon/Work/DOE/LLNL/Kripke/github/build
Scanning dependencies of target RAJA
[  9%] Building CXX object tpl/raja/CMakeFiles/RAJA.dir/src/LockFreeIndexSetBuilders.cpp.o
[  9%] Building CXX object tpl/raja/CMakeFiles/RAJA.dir/src/DepGraphNode.cpp.o
[  9%] Building CXX object tpl/raja/CMakeFiles/RAJA.dir/src/AlignedRangeIndexSetBuilders.cpp.o
[ 12%] Building CXX object tpl/raja/CMakeFiles/RAJA.dir/src/MemUtils_CUDA.cpp.o
[ 15%] Building CXX object tpl/raja/CMakeFiles/RAJA.dir/src/ThreadUtils_CPU.cpp.o
[ 18%] Linking CXX static library ../../lib/libRAJA.a
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: ../../lib/libRAJA.a(MemUtils_CUDA.cpp.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: ../../lib/libRAJA.a(MemUtils_CUDA.cpp.o) has no symbols
[ 18%] Built target RAJA
Scanning dependencies of target kripke
[ 21%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Core/DataStore.cpp.o
[ 25%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Core/DomainVar.cpp.o
[ 28%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Generate/Data.cpp.o
[ 31%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Generate.cpp.o
[ 34%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Generate/Decomp.cpp.o
[ 37%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Generate/Energy.cpp.o
[ 40%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Generate/Quadrature.cpp.o
[ 43%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Generate/Space.cpp.o
[ 46%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/InputVariables.cpp.o
[ 50%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Kernel/LPlusTimes.cpp.o
[ 53%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Kernel/LTimes.cpp.o
In file included from /Users/jrhammon/Work/DOE/LLNL/Kripke/github/src/Kripke/Kernel/LPlusTimes.cpp:34:0:
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/./src/Kripke/Arch/LPlusTimes.h:55:39: error: 'omp_parallel_for_exec' is not a member of 'RAJA'
       RAJA::nested::TypedFor<2, RAJA::omp_parallel_for_exec, Group>,
                                       ^~~~~~~~~~~~~~~~~~~~~
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/./src/Kripke/Arch/LPlusTimes.h:55:39: error: 'omp_parallel_for_exec' is not a member of 'RAJA'
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/./src/Kripke/Arch/LPlusTimes.h:55:67: error: template argument 2 is invalid
       RAJA::nested::TypedFor<2, RAJA::omp_parallel_for_exec, Group>,
                                                                   ^
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/./src/Kripke/Arch/LPlusTimes.h:59:5: error: template argument 1 is invalid
     >;
     ^
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/src/Kripke/Kernel/LPlusTimes.cpp: In member function 'void LPlusTimesSdom::operator()(AL, Kripke::Core::DataStore&, Kripke::SdomId, const Kripke::Core::Set&, const Kripke::Core::Set&, const Kripke::Core::Set&, const Kripke::Core::Set&, Kripke::Field_Moments&, Kripke::Field_Flux&, Kripke::Field_EllPlus&) const':
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/src/Kripke/Kernel/LPlusTimes.cpp:70:23: error: 'Policy_LPlusTimes' is not a member of 'Kripke::Arch'
         Kripke::Arch::Policy_LPlusTimes{},
                       ^~~~~~~~~~~~~~~~~
make[2]: *** [CMakeFiles/kripke.dir/src/Kripke/Kernel/LPlusTimes.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
In file included from /Users/jrhammon/Work/DOE/LLNL/Kripke/github/src/Kripke/Kernel/LTimes.cpp:34:0:
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/./src/Kripke/Arch/LTimes.h:55:41: error: 'omp_parallel_for_exec' is not a member of 'RAJA'
         RAJA::nested::TypedFor<2, RAJA::omp_parallel_for_exec, Group>,
                                         ^~~~~~~~~~~~~~~~~~~~~
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/./src/Kripke/Arch/LTimes.h:55:41: error: 'omp_parallel_for_exec' is not a member of 'RAJA'
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/./src/Kripke/Arch/LTimes.h:55:69: error: template argument 2 is invalid
         RAJA::nested::TypedFor<2, RAJA::omp_parallel_for_exec, Group>,
                                                                     ^
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/./src/Kripke/Arch/LTimes.h:59:7: error: template argument 1 is invalid
       >;
       ^
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/src/Kripke/Kernel/LTimes.cpp: In member function 'void LTimesSdom::operator()(AL, Kripke::Core::DataStore&, Kripke::SdomId, const Kripke::Core::Set&, const Kripke::Core::Set&, const Kripke::Core::Set&, const Kripke::Core::Set&, Kripke::Field_Flux&, Kripke::Field_Moments&, Kripke::Field_Ell&) const':
/Users/jrhammon/Work/DOE/LLNL/Kripke/github/src/Kripke/Kernel/LTimes.cpp:72:23: error: 'Policy_LTimes' is not a member of 'Kripke::Arch'
         Kripke::Arch::Policy_LTimes{},
                       ^~~~~~~~~~~~~
make[2]: *** [CMakeFiles/kripke.dir/src/Kripke/Kernel/LTimes.cpp.o] Error 1
make[1]: *** [CMakeFiles/kripke.dir/all] Error 2
make: *** [all] Error 2

Camp definitions in Kripke and Umpire.

The new Umpire specifies a Camp submodule, which conflicts with the definition of Camp in the Kripke build system. Need the appropriate Cmake to choose one (Umpire uses Camp v0.2.2, Kripke has Camp v0.2.3).

Cannot run CUDA-enabled version

**Issue: ** execution of kripke.exe results in illegal memory access

Tagged release 1.2.4 does not exhibit this behavior. I did not perform any sort of bisection to find the culprit, but I suspect it's an issue with RAJA somewhere.

Build environment:

  • GCC 8.4
  • CUDA Toolkit 11.4
  • AMD CPU (Threadripper 3960X)
  • NVIDIA A6000 GPU (compute capability of 8.6)
  • no warnings when building

host-config file:

set(CMAKE_BUILD_TYPE "Release" CACHE STRING "")

set(CMAKE_CXX_FLAGS "" CACHE STRING "")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffast-math" CACHE STRING "")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -ffast-math" CACHE STRING "")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE STRING "")

set(ENABLE_CHAI On CACHE BOOL "")
set(ENABLE_CUDA On CACHE BOOL "")
set(CUDA_ARCH "sm_86" CACHE STRING "")
set(ENABLE_OPENMP Off CACHE BOOL "")
set(ENABLE_MPI Off CACHE BOOL "")
set(ENABLE_MPI_WRAPPER Off CACHE BOOL "")

set(CMAKE_CUDA_FLAGS "-restrict -gencode=arch=compute_86,code=sm_86" CACHE STRING "")
set(CMAKE_CUDA_FLAGS_RELEASE "-O3 --expt-extended-lambda" CACHE STRING "")
set(CMAKE_CUDA_FLAGS_RELWITHDEBINFO "-O3 -lineinfo --expt-extended-lambda" CACHE STRING "")
set(CMAKE_CUDA_FLAGS_DEBUG "-O0 -g -G --expt-extended-lambda" CACHE STRING "")
set(CMAKE_CUDA_HOST_COMPILER "${CMAKE_CXX_COMPILER}" CACHE STRING "")

Output:

~/kripke$ ./build/bin/kripke.exe

   _  __       _         _
  | |/ /      (_)       | |
  | ' /  _ __  _  _ __  | | __ ___
  |  <  | '__|| || '_ \ | |/ // _ \
  | . \ | |   | || |_) ||   <|  __/
  |_|\_\|_|   |_|| .__/ |_|\_\\___|
                 | |
                 |_|        Version 1.2.5-dev

LLNL-CODE-775068

Copyright (c) 2014-2019, Lawrence Livermore National Security, LLC

Kripke is released under the BSD 3-Clause License, please see the
LICENSE file for the full license

This work was produced under the auspices of the U.S. Department of
Energy by Lawrence Livermore National Laboratory under Contract
DE-AC52-07NA27344.

Author: Adam J. Kunen <[email protected]>

Compilation Options:
  Architecture:           CUDA
  Compiler:               /usr/bin/c++
  Compiler Flags:         "     -Wall -Wextra  "
  Linker Flags:           " "
  CHAI Enabled:           Yes
  CUDA Enabled:           Yes
    NVCC:                 /usr/local/cuda/bin/nvcc
    NVCC Flags:           "-restrict -gencode=arch=compute_86,code=sm_86 -O3 --expt-extended-lambda"
  MPI Enabled:            No
  OpenMP Enabled:         No
  Caliper Enabled:        No

Input Parameters
================

  Problem Size:
    Zones:                 16 x 16 x 16  (4096 total)
    Groups:                32
    Legendre Order:        4
    Quadrature Set:        Dummy S2 with 96 points

  Physical Properties:
    Total X-Sec:           sigt=[0.100000, 0.000100, 0.100000]
    Scattering X-Sec:      sigs=[0.050000, 0.000050, 0.050000]

  Solver Options:
    Number iterations:     10

  MPI Decomposition Options:
    Total MPI tasks:       1
    Spatial decomp:        1 x 1 x 1 MPI tasks
    Block solve method:    Sweep

  Per-Task Options:
    DirSets/Directions:    8 sets, 12 directions/set
    GroupSet/Groups:       2 sets, 16 groups/set
    Zone Sets:             1 x 1 x 1
    Architecture:          CUDA
    Data Layout:           DGZ

Generating Problem
==================

  Decomposition Space:   Procs:      Subdomains (local/global):
  ---------------------  ----------  --------------------------
  (P) Energy:            1           2 / 2
  (Q) Direction:         1           8 / 8
  (R) Space:             1           1 / 1
  (Rx,Ry,Rz) R in XYZ:   1x1x1       1x1x1 / 1x1x1
  (PQR) TOTAL:           1           16 / 16

  Material Volumes=[8.789062e+03, 1.177734e+05, 2.753438e+06]

  Memory breakdown of Field variables:
  Field Variable            Num Elements    Megabytes
  --------------            ------------    ---------
  data/sigs                        15360        0.117
  dx                                  16        0.000
  dy                                  16        0.000
  dz                                  16        0.000
  ell                               2400        0.018
  ell_plus                          2400        0.018
  i_plane                         786432        6.000
  j_plane                         786432        6.000
  k_plane                         786432        6.000
  mixelem_to_fraction               4352        0.033
  phi                            3276800       25.000
  phi_out                        3276800       25.000
  psi                           12582912       96.000
  quadrature/w                        96        0.001
  quadrature/xcos                     96        0.001
  quadrature/ycos                     96        0.001
  quadrature/zcos                     96        0.001
  rhs                           12582912       96.000
  sigt_zonal                      131072        1.000
  volume                            4096        0.031
  --------                  ------------    ---------
  TOTAL                         34238832      261.222

  Generation Complete!

Steady State Solve
==================

CUDAassert: an illegal memory access was encountered /home/williamk/kripke/tpl/raja/include/RAJA/policy/cuda/MemUtils_CUDA.hpp 183
terminate called after throwing an instance of 'std::runtime_error'
  what():  CUDAassert
Aborted (core dumped)

Clang 13.0.0 MPI linking problems on TOSS3.

Linking problems on TOSS3 when using llnl-toss3-clangX.cmake:

cmake -C ../host-configs/llnl-toss3-clang13.cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_CHAI=On -DENABLE_RAJA_PLUGIN=On -DDCHAI_ENABLE_RAJA_PLUGIN=On ..
make -j

[ 65%] Linking CXX executable bin/kripke.exe
/usr/tce/packages/cmake/cmake-3.14.5/bin/cmake -E cmake_link_script CMakeFiles/kripke.exe.dir/link.txt --verbose=1
/usr/tce/bin/clang++-13.0.0 -Wall -Wextra -O3 -ffast-math -Wl,-rpath -Wl,/usr/tce/packages/mvapich2/mvapich2-2.3-clang-13.0.0/lib -fopenmp=libomp CMakeFiles/kripke.exe.dir/src/kripke.cpp.o -o bin/kripke.exe lib/libchai.a lib/libkripke.a lib/libchai.a lib/libumpire.a lib/libRAJA.a -ldl
CMakeFiles/kripke.exe.dir/src/kripke.cpp.o: In function usage()': kripke.cpp:(.text+0x45): undefined reference to MPI_Comm_rank'
kripke.cpp:(.text+0x56): undefined reference to `MPI_Comm_size'

To get here, need to set the following variables in the cmake file (see https://llnl-blt.readthedocs.io/en/develop/tutorial/common_hpc_dependencies.html?highlight=blt_mpi_includes#mpi):

MPI_HOME
MPI_C_COMPILER
MPI_CXX_COMPILER
BLT_MPI_INCLUDES
BLT_MPI_LIBRARIES

Build Failing In quartz

While trying to build Kripke in Quartz. The build is failing, the errors are as follow

[ 31%] Building CXX object CMakeFiles/kripke.dir/src/Kripke/Generate/Data.cpp.o
In file included from /g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/InputVariables.h:37:0,
from /g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/Generate.h:38,
from /g/g92/bhowmik1/Kripke/Kripke/src/Kripke/Generate/Data.cpp:33:
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h: In function 'void Kripke::dispatch(Kripke::ArchLayoutV, const Function&, Args&& ...)':
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:189:32: warning: use of 'auto' in lambda parameter declaration only available with -std=c++1y or -std=gnu++1y
dispatchArch(al_v.arch_v, [&](auto arch_t){
^
In file included from /g/g92/bhowmik1/Kripke/Kripke/src/Kripke/Generate/Data.cpp:41:0:
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/VarTypes.h: In function 'FieldType& Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&)':
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/VarTypes.h:169:38: warning: use of 'auto' in lambda parameter declaration only available with -std=c++1y or -std=gnu++1y
dispatchLayout(al_v.layout_v, [&](auto layout_t){
^
In file included from /g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/InputVariables.h:37:0,
from /g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/Generate.h:38,
from /g/g92/bhowmik1/Kripke/Kripke/src/Kripke/Generate/Data.cpp:33:
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h: In instantiation of 'void Kripke::dispatchLayout(Kripke::LayoutV, const Function&, Args&& ...) [with Function = Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Direction, Kripke::Group, Kripke::Zone>; SetType = Kripke::Core::ProductSet<3ul>; std::string = std::basic_string]::<lambda(auto:2)>; Args = {}]':
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/VarTypes.h:174:6: required from 'FieldType& Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Direction, Kripke::Group, Kripke::Zone>; SetType = Kripke::Core::ProductSet<3ul>; std::string = std::basic_string]'
/g/g92/bhowmik1/Kripke/Kripke/src/Kripke/Generate/Data.cpp:66:61: required from here
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:147:69: error: invalid use of 'auto'
case LayoutV_DGZ: fcn(LayoutT_DGZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:148:69: error: invalid use of 'auto'
case LayoutV_DZG: fcn(LayoutT_DZG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:149:69: error: invalid use of 'auto'
case LayoutV_GDZ: fcn(LayoutT_GDZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:150:69: error: invalid use of 'auto'
case LayoutV_GZD: fcn(LayoutT_GZD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:151:69: error: invalid use of 'auto'
case LayoutV_ZDG: fcn(LayoutT_ZDG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:152:69: error: invalid use of 'auto'
case LayoutV_ZGD: fcn(LayoutT_ZGD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h: In instantiation of 'void Kripke::dispatchLayout(Kripke::LayoutV, const Function&, Args&& ...) [with Function = Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Moment, Kripke::Group, Kripke::Zone>; SetType = Kripke::Core::ProductSet<3ul>; std::string = std::basic_string]::<lambda(auto:2)>; Args = {}]':
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/VarTypes.h:174:6: required from 'FieldType& Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Moment, Kripke::Group, Kripke::Zone>; SetType = Kripke::Core::ProductSet<3ul>; std::string = std::basic_string]'
/g/g92/bhowmik1/Kripke/Kripke/src/Kripke/Generate/Data.cpp:79:70: required from here
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:147:69: error: invalid use of 'auto'
case LayoutV_DGZ: fcn(LayoutT_DGZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:148:69: error: invalid use of 'auto'
case LayoutV_DZG: fcn(LayoutT_DZG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:149:69: error: invalid use of 'auto'
case LayoutV_GDZ: fcn(LayoutT_GDZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:150:69: error: invalid use of 'auto'
case LayoutV_GZD: fcn(LayoutT_GZD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:151:69: error: invalid use of 'auto'
case LayoutV_ZDG: fcn(LayoutT_ZDG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:152:69: error: invalid use of 'auto'
case LayoutV_ZGD: fcn(LayoutT_ZGD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h: In instantiation of 'void Kripke::dispatchLayout(Kripke::LayoutV, const Function&, Args&& ...) [with Function = Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Direction, Kripke::Group, Kripke::ZoneJ, Kripke::ZoneK>; SetType = Kripke::Core::Set; std::string = std::basic_string]::<lambda(auto:2)>; Args = {}]':
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/VarTypes.h:174:6: required from 'FieldType& Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Direction, Kripke::Group, Kripke::ZoneJ, Kripke::ZoneK>; SetType = Kripke::Core::Set; std::string = std::basic_string]'
/g/g92/bhowmik1/Kripke/Kripke/src/Kripke/Generate/Data.cpp:90:68: required from here
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:147:69: error: invalid use of 'auto'
case LayoutV_DGZ: fcn(LayoutT_DGZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:148:69: error: invalid use of 'auto'
case LayoutV_DZG: fcn(LayoutT_DZG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:149:69: error: invalid use of 'auto'
case LayoutV_GDZ: fcn(LayoutT_GDZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:150:69: error: invalid use of 'auto'
case LayoutV_GZD: fcn(LayoutT_GZD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:151:69: error: invalid use of 'auto'
case LayoutV_ZDG: fcn(LayoutT_ZDG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:152:69: error: invalid use of 'auto'
case LayoutV_ZGD: fcn(LayoutT_ZGD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h: In instantiation of 'void Kripke::dispatchLayout(Kripke::LayoutV, const Function&, Args&& ...) [with Function = Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Direction, Kripke::Group, Kripke::ZoneI, Kripke::ZoneK>; SetType = Kripke::Core::Set; std::string = std::basic_string]::<lambda(auto:2)>; Args = {}]':
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/VarTypes.h:174:6: required from 'FieldType& Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Direction, Kripke::Group, Kripke::ZoneI, Kripke::ZoneK>; SetType = Kripke::Core::Set; std::string = std::basic_string]'
/g/g92/bhowmik1/Kripke/Kripke/src/Kripke/Generate/Data.cpp:91:68: required from here
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:147:69: error: invalid use of 'auto'
case LayoutV_DGZ: fcn(LayoutT_DGZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:148:69: error: invalid use of 'auto'
case LayoutV_DZG: fcn(LayoutT_DZG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:149:69: error: invalid use of 'auto'
case LayoutV_GDZ: fcn(LayoutT_GDZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:150:69: error: invalid use of 'auto'
case LayoutV_GZD: fcn(LayoutT_GZD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:151:69: error: invalid use of 'auto'
case LayoutV_ZDG: fcn(LayoutT_ZDG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:152:69: error: invalid use of 'auto'
case LayoutV_ZGD: fcn(LayoutT_ZGD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h: In instantiation of 'void Kripke::dispatchLayout(Kripke::LayoutV, const Function&, Args&& ...) [with Function = Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Direction, Kripke::Group, Kripke::ZoneI, Kripke::ZoneJ>; SetType = Kripke::Core::Set; std::string = std::basic_string]::<lambda(auto:2)>; Args = {}]':
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/VarTypes.h:174:6: required from 'FieldType& Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Direction, Kripke::Group, Kripke::ZoneI, Kripke::ZoneJ>; SetType = Kripke::Core::Set; std::string = std::basic_string]'
/g/g92/bhowmik1/Kripke/Kripke/src/Kripke/Generate/Data.cpp:92:68: required from here
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:147:69: error: invalid use of 'auto'
case LayoutV_DGZ: fcn(LayoutT_DGZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:148:69: error: invalid use of 'auto'
case LayoutV_DZG: fcn(LayoutT_DZG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:149:69: error: invalid use of 'auto'
case LayoutV_GDZ: fcn(LayoutT_GDZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:150:69: error: invalid use of 'auto'
case LayoutV_GZD: fcn(LayoutT_GZD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:151:69: error: invalid use of 'auto'
case LayoutV_ZDG: fcn(LayoutT_ZDG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:152:69: error: invalid use of 'auto'
case LayoutV_ZGD: fcn(LayoutT_ZGD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h: In instantiation of 'void Kripke::dispatchLayout(Kripke::LayoutV, const Function&, Args&& ...) [with Function = Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Material, Kripke::Legendre, Kripke::GlobalGroup, Kripke::GlobalGroup>; SetType = Kripke::Core::ProductSet<4ul>; std::string = std::basic_string]::<lambda(auto:2)>; Args = {}]':
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/VarTypes.h:174:6: required from 'FieldType& Kripke::createField(Kripke::Core::DataStore&, const string&, Kripke::ArchLayoutV, const SetType&) [with FieldType = Kripke::Core::Field<double, Kripke::Material, Kripke::Legendre, Kripke::GlobalGroup, Kripke::GlobalGroup>; SetType = Kripke::Core::ProductSet<4ul>; std::string = std::basic_string]'
/g/g92/bhowmik1/Kripke/Kripke/src/Kripke/Generate/Data.cpp:105:69: required from here
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:147:69: error: invalid use of 'auto'
case LayoutV_DGZ: fcn(LayoutT_DGZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:148:69: error: invalid use of 'auto'
case LayoutV_DZG: fcn(LayoutT_DZG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:149:69: error: invalid use of 'auto'
case LayoutV_GDZ: fcn(LayoutT_GDZ{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:150:69: error: invalid use of 'auto'
case LayoutV_GZD: fcn(LayoutT_GZD{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:151:69: error: invalid use of 'auto'
case LayoutV_ZDG: fcn(LayoutT_ZDG{}, std::forward(args)...); break;
^
/g/g92/bhowmik1/Kripke/Kripke/./src/Kripke/ArchLayout.h:152:69: error: invalid use of 'auto'
case LayoutV_ZGD: fcn(LayoutT_ZGD{}, std::forward(args)...); break;
^
make[2]: *** [CMakeFiles/kripke.dir/src/Kripke/Generate/Data.cpp.o] Error 1
make[1]: *** [CMakeFiles/kripke.dir/all] Error 2
make: *** [all] Error 2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.