Skip to content

Latest commit

History

6,359 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

OpenSSF ScorecardOpenSSF Best Practiceskokkos-kernels/docs

KokkosKernels

Kokkos Kernels

Kokkos C++ Performance Portability Programming EcoSystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

KokkosKernels implements local computational kernels for linear algebra and graph operations, using the Kokkos shared-memory parallel programming model. "Local" means not using MPI, or running within a single MPI process without knowing about MPI. "Computational kernels" are coarse-grained operations; they take a lot of work and make sense to parallelize inside using Kokkos. KokkosKernels can be the building block of a parallel linear algebra library like Tpetra that uses MPI and threads for parallelism, or it can be used stand-alone in your application.

Computational kernels in this subpackage include the following:

  • (Multi)vector dot products, norms, and updates (AXPY-like operations that add vectors together entry-wise)
  • Sparse matrix-vector multiply and other sparse matrix / dense vector kernels
  • Sparse matrix-matrix multiply
  • Graph coloring
  • Gauss-Seidel with coloring (generalization of red-black)
  • Other linear algebra and graph operations

We organize this directory as follows:

  1. Public interfaces to computational kernels live in each component src/ subdirectories (e.g., blas/src/, sparse/src/):
  • KokkosSparse_CrsMatrix.hpp: Declaration and definition of KokkosSparse::CrsMatrix, the sparse matrix data structure used for the computational kernels below
  • KokkosSparse_spmv.hpp: Sparse matrix-vector multiply with a single vector, stored in a 1-D View + Sparse matrix-vector multiply with multiple vectors at a time (multivectors), stored in a 2-D View
  1. Implementations of computational kernels live in each component impl/ subdirectories (e.g., blas/impl/, sparse/impl/)

  2. Correctness tests live in each component unit_test/ subdirectories (e.g., blas/unit_test/, sparse/unit_test/), and performance tests live in the perf_test/ subdirectory

  3. Simple example scripts to build Kokkoskernels are in example/buildlib/

Do NOT use or rely on anything in the KokkosBlas::Impl namespace, or on anything in the impl/ subdirectory.

This separation of interface and implementation lets the interface assign the users' Views to View types with the desired attributes (e.g., read-only, RandomRead). This also makes it easier to provide full specializations of the implementation. "Full specializations" mean that all the template parameters are fixed, so that the compiler can actually compile the code. This technique keeps your library's or application's build times down, since kernels are already precompiled for certain template parameter combinations. It also improves performance, since compilers have an easier time optimizing code in shorter .cpp files.

Building Kokkoskernels

CMake

Following Kokkos style, all CMake options are of the form

KokkosKernels_ENABLE_OPTION

with options capitalized at the end. Almost all Kokkos Kernels options determine whether ETI is used with a particular datatype, e.g.

-DKokkosKernels_INST_DOUBLE=On

which does explicit instantiation of all kernels for double type. Kokkos Kernels derives most of its CXXFLAGS, C++ standard, architecture flags, and other options from an installed (or in-tree) Kokkos package. Tuning for a particular device or architecture is generally done through Kokkos while tuning which kernels get instantiated is done through Kokkos Kernels.

Kokkos Kernels does supply flags for asserting properties of the linked Kokkos, for example:

-DKokkosKernels_REQUIRE_DEVICES=CUDA
-DKokkosKernels_REQUIRE_OPTIONS=cuda_relocatable_device_code

This does NOT enable CUDA directly, but rather verifies that the underlying Kokkos supports the desired option. If the underlying Kokkos was not built properly, CMake will crash and tell you to re-build Kokkos. The values (unlike the option names) are not case-sensitive. More details can be found in the build instructions or developer instructions.

Spack

An alternative to manually building with the CMake is to use the Spack package manager. To do so, download the kokkos-spack git repo and add to the package list:

spack repo add $path-to-kokkos-spack

A basic installation would be done as:

spack install kokkos-kernels

Spack allows options and compilers to be tuned in the install command.

spack install kokkos-kernels@3.0 +double %gcc@7.3.0 +openmp

This example illustrates the three most common parameters to Spack:

  • Variants: specified with, e.g. +openmp, this activates (or deactivates with, e.g. ~openmp) certain options.
  • Version: immediately following kokkos-kernels the @version can specify a particular Kokkos Kernels to build
  • Compiler: a default compiler will be chosen if not specified, but an exact compiler version can be given with the % option.

For a complete list of Kokkos Kernels options, run:

spack info kokkos-kernels

Tuning Kokkos Options

As discussed above in the CMake section, Kokkos Kernels inherits much of its configuration from the installed Kokkos. Spack gives a mechanism for directly specifying Kokkos dependency options:

spack install kokkos-kernels ^kokkos@5.0+cuda

The carat ^ specifies an exact dependency configuration, which in this case activates CUDA For a complete list of tunable Kokkos options, run

spack info kokkos

Setting up a development environment with Spack

Spack is generally most useful for installing packages to use. If you want to install all dependencies of Kokkos Kernels first so that you can actively develop a given Kokkos Kernels source this can still be done. Go to the Kokkos Kernels source code folder and run:

spack diy -u cmake kokkos-kernels@{version} ...

specifying the exact version you want to develop and giving any spec options in .... This creates a folder spack-build where you can make.

Trilinos

For Trilinos builds with the Cuda backend and complex double enabled with ETI, the cmake option below may need to be set to avoid Error 127 errors: CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON

If the option above is not set, a warning will be issued during configuration:

"The CMake option CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS is either undefined or OFF. Please set CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON when building with CUDA and complex double enabled."

Using Kokkoskernels Test Drivers

In perf_test there are test drivers.

  • KokkosGraph_triangle.exe : Triangle counting driver.
  • KokkosSparse_spgemm.exe : Sparse Matrix Sparse Matrix Multiply:
  • *NOTE: KKMEM is outdated. Use default algorithm: KKSPGEMM = KKDEFAULT = DEFAULT
  • Or within the code:
  • kh.create_spgemm_handle(KokkosSparse::SPGEMM_KK);
    
  • KokkosSparse_spmv.exe : Sparse matvec.
  • KokkosSparse_pcg.exe : CG method with Gauss Seidel as preconditioner.
  • KokkosGraph_color.exe : Distance-1 Graph coloring
  • KokkosKernels_MatrixConverter.exe : given a matrix market format, converts it ".bin" binary format for fast input output readings, which can be read by other test drivers.

Please report bugs or performance issues to: https://github.com/kokkos/kokkos-kernels/issues

License

Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software.

The full license statement used in all headers is available here or here.

About

Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

Topics

Resources

Security policy

Stars

401 stars

Watchers

28 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - kokkos/kokkos-kernels: Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels · GitHub
Skip to content

Latest commit

History

6,359 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

OpenSSF ScorecardOpenSSF Best Practiceskokkos-kernels/docs

KokkosKernels

Kokkos Kernels

Kokkos C++ Performance Portability Programming EcoSystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

KokkosKernels implements local computational kernels for linear algebra and graph operations, using the Kokkos shared-memory parallel programming model. "Local" means not using MPI, or running within a single MPI process without knowing about MPI. "Computational kernels" are coarse-grained operations; they take a lot of work and make sense to parallelize inside using Kokkos. KokkosKernels can be the building block of a parallel linear algebra library like Tpetra that uses MPI and threads for parallelism, or it can be used stand-alone in your application.

Computational kernels in this subpackage include the following:

  • (Multi)vector dot products, norms, and updates (AXPY-like operations that add vectors together entry-wise)
  • Sparse matrix-vector multiply and other sparse matrix / dense vector kernels
  • Sparse matrix-matrix multiply
  • Graph coloring
  • Gauss-Seidel with coloring (generalization of red-black)
  • Other linear algebra and graph operations

We organize this directory as follows:

  1. Public interfaces to computational kernels live in each component src/ subdirectories (e.g., blas/src/, sparse/src/):
  • KokkosSparse_CrsMatrix.hpp: Declaration and definition of KokkosSparse::CrsMatrix, the sparse matrix data structure used for the computational kernels below
  • KokkosSparse_spmv.hpp: Sparse matrix-vector multiply with a single vector, stored in a 1-D View + Sparse matrix-vector multiply with multiple vectors at a time (multivectors), stored in a 2-D View
  1. Implementations of computational kernels live in each component impl/ subdirectories (e.g., blas/impl/, sparse/impl/)

  2. Correctness tests live in each component unit_test/ subdirectories (e.g., blas/unit_test/, sparse/unit_test/), and performance tests live in the perf_test/ subdirectory

  3. Simple example scripts to build Kokkoskernels are in example/buildlib/

Do NOT use or rely on anything in the KokkosBlas::Impl namespace, or on anything in the impl/ subdirectory.

This separation of interface and implementation lets the interface assign the users' Views to View types with the desired attributes (e.g., read-only, RandomRead). This also makes it easier to provide full specializations of the implementation. "Full specializations" mean that all the template parameters are fixed, so that the compiler can actually compile the code. This technique keeps your library's or application's build times down, since kernels are already precompiled for certain template parameter combinations. It also improves performance, since compilers have an easier time optimizing code in shorter .cpp files.

Building Kokkoskernels

CMake

Following Kokkos style, all CMake options are of the form

KokkosKernels_ENABLE_OPTION

with options capitalized at the end. Almost all Kokkos Kernels options determine whether ETI is used with a particular datatype, e.g.

-DKokkosKernels_INST_DOUBLE=On

which does explicit instantiation of all kernels for double type. Kokkos Kernels derives most of its CXXFLAGS, C++ standard, architecture flags, and other options from an installed (or in-tree) Kokkos package. Tuning for a particular device or architecture is generally done through Kokkos while tuning which kernels get instantiated is done through Kokkos Kernels.

Kokkos Kernels does supply flags for asserting properties of the linked Kokkos, for example:

-DKokkosKernels_REQUIRE_DEVICES=CUDA
-DKokkosKernels_REQUIRE_OPTIONS=cuda_relocatable_device_code

This does NOT enable CUDA directly, but rather verifies that the underlying Kokkos supports the desired option. If the underlying Kokkos was not built properly, CMake will crash and tell you to re-build Kokkos. The values (unlike the option names) are not case-sensitive. More details can be found in the build instructions or developer instructions.

Spack

An alternative to manually building with the CMake is to use the Spack package manager. To do so, download the kokkos-spack git repo and add to the package list:

spack repo add $path-to-kokkos-spack

A basic installation would be done as:

spack install kokkos-kernels

Spack allows options and compilers to be tuned in the install command.

spack install kokkos-kernels@3.0 +double %gcc@7.3.0 +openmp

This example illustrates the three most common parameters to Spack:

  • Variants: specified with, e.g. +openmp, this activates (or deactivates with, e.g. ~openmp) certain options.
  • Version: immediately following kokkos-kernels the @version can specify a particular Kokkos Kernels to build
  • Compiler: a default compiler will be chosen if not specified, but an exact compiler version can be given with the % option.

For a complete list of Kokkos Kernels options, run:

spack info kokkos-kernels

Tuning Kokkos Options

As discussed above in the CMake section, Kokkos Kernels inherits much of its configuration from the installed Kokkos. Spack gives a mechanism for directly specifying Kokkos dependency options:

spack install kokkos-kernels ^kokkos@5.0+cuda

The carat ^ specifies an exact dependency configuration, which in this case activates CUDA For a complete list of tunable Kokkos options, run

spack info kokkos

Setting up a development environment with Spack

Spack is generally most useful for installing packages to use. If you want to install all dependencies of Kokkos Kernels first so that you can actively develop a given Kokkos Kernels source this can still be done. Go to the Kokkos Kernels source code folder and run:

spack diy -u cmake kokkos-kernels@{version} ...

specifying the exact version you want to develop and giving any spec options in .... This creates a folder spack-build where you can make.

Trilinos

For Trilinos builds with the Cuda backend and complex double enabled with ETI, the cmake option below may need to be set to avoid Error 127 errors: CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON

If the option above is not set, a warning will be issued during configuration:

"The CMake option CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS is either undefined or OFF. Please set CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON when building with CUDA and complex double enabled."

Using Kokkoskernels Test Drivers

In perf_test there are test drivers.

  • KokkosGraph_triangle.exe : Triangle counting driver.
  • KokkosSparse_spgemm.exe : Sparse Matrix Sparse Matrix Multiply:
  • *NOTE: KKMEM is outdated. Use default algorithm: KKSPGEMM = KKDEFAULT = DEFAULT
  • Or within the code:
  • kh.create_spgemm_handle(KokkosSparse::SPGEMM_KK);
    
  • KokkosSparse_spmv.exe : Sparse matvec.
  • KokkosSparse_pcg.exe : CG method with Gauss Seidel as preconditioner.
  • KokkosGraph_color.exe : Distance-1 Graph coloring
  • KokkosKernels_MatrixConverter.exe : given a matrix market format, converts it ".bin" binary format for fast input output readings, which can be read by other test drivers.

Please report bugs or performance issues to: https://github.com/kokkos/kokkos-kernels/issues

License

Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software.

The full license statement used in all headers is available here or here.

About

Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

Topics

Resources

Security policy

Stars

401 stars

Watchers

28 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - kokkos/kokkos-kernels: Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels · GitHub
Skip to content

Latest commit

History

6,359 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

OpenSSF ScorecardOpenSSF Best Practiceskokkos-kernels/docs

KokkosKernels

Kokkos Kernels

Kokkos C++ Performance Portability Programming EcoSystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

KokkosKernels implements local computational kernels for linear algebra and graph operations, using the Kokkos shared-memory parallel programming model. "Local" means not using MPI, or running within a single MPI process without knowing about MPI. "Computational kernels" are coarse-grained operations; they take a lot of work and make sense to parallelize inside using Kokkos. KokkosKernels can be the building block of a parallel linear algebra library like Tpetra that uses MPI and threads for parallelism, or it can be used stand-alone in your application.

Computational kernels in this subpackage include the following:

  • (Multi)vector dot products, norms, and updates (AXPY-like operations that add vectors together entry-wise)
  • Sparse matrix-vector multiply and other sparse matrix / dense vector kernels
  • Sparse matrix-matrix multiply
  • Graph coloring
  • Gauss-Seidel with coloring (generalization of red-black)
  • Other linear algebra and graph operations

We organize this directory as follows:

  1. Public interfaces to computational kernels live in each component src/ subdirectories (e.g., blas/src/, sparse/src/):
  • KokkosSparse_CrsMatrix.hpp: Declaration and definition of KokkosSparse::CrsMatrix, the sparse matrix data structure used for the computational kernels below
  • KokkosSparse_spmv.hpp: Sparse matrix-vector multiply with a single vector, stored in a 1-D View + Sparse matrix-vector multiply with multiple vectors at a time (multivectors), stored in a 2-D View
  1. Implementations of computational kernels live in each component impl/ subdirectories (e.g., blas/impl/, sparse/impl/)

  2. Correctness tests live in each component unit_test/ subdirectories (e.g., blas/unit_test/, sparse/unit_test/), and performance tests live in the perf_test/ subdirectory

  3. Simple example scripts to build Kokkoskernels are in example/buildlib/

Do NOT use or rely on anything in the KokkosBlas::Impl namespace, or on anything in the impl/ subdirectory.

This separation of interface and implementation lets the interface assign the users' Views to View types with the desired attributes (e.g., read-only, RandomRead). This also makes it easier to provide full specializations of the implementation. "Full specializations" mean that all the template parameters are fixed, so that the compiler can actually compile the code. This technique keeps your library's or application's build times down, since kernels are already precompiled for certain template parameter combinations. It also improves performance, since compilers have an easier time optimizing code in shorter .cpp files.

Building Kokkoskernels

CMake

Following Kokkos style, all CMake options are of the form

KokkosKernels_ENABLE_OPTION

with options capitalized at the end. Almost all Kokkos Kernels options determine whether ETI is used with a particular datatype, e.g.

-DKokkosKernels_INST_DOUBLE=On

which does explicit instantiation of all kernels for double type. Kokkos Kernels derives most of its CXXFLAGS, C++ standard, architecture flags, and other options from an installed (or in-tree) Kokkos package. Tuning for a particular device or architecture is generally done through Kokkos while tuning which kernels get instantiated is done through Kokkos Kernels.

Kokkos Kernels does supply flags for asserting properties of the linked Kokkos, for example:

-DKokkosKernels_REQUIRE_DEVICES=CUDA
-DKokkosKernels_REQUIRE_OPTIONS=cuda_relocatable_device_code

This does NOT enable CUDA directly, but rather verifies that the underlying Kokkos supports the desired option. If the underlying Kokkos was not built properly, CMake will crash and tell you to re-build Kokkos. The values (unlike the option names) are not case-sensitive. More details can be found in the build instructions or developer instructions.

Spack

An alternative to manually building with the CMake is to use the Spack package manager. To do so, download the kokkos-spack git repo and add to the package list:

spack repo add $path-to-kokkos-spack

A basic installation would be done as:

spack install kokkos-kernels

Spack allows options and compilers to be tuned in the install command.

spack install kokkos-kernels@3.0 +double %gcc@7.3.0 +openmp

This example illustrates the three most common parameters to Spack:

  • Variants: specified with, e.g. +openmp, this activates (or deactivates with, e.g. ~openmp) certain options.
  • Version: immediately following kokkos-kernels the @version can specify a particular Kokkos Kernels to build
  • Compiler: a default compiler will be chosen if not specified, but an exact compiler version can be given with the % option.

For a complete list of Kokkos Kernels options, run:

spack info kokkos-kernels

Tuning Kokkos Options

As discussed above in the CMake section, Kokkos Kernels inherits much of its configuration from the installed Kokkos. Spack gives a mechanism for directly specifying Kokkos dependency options:

spack install kokkos-kernels ^kokkos@5.0+cuda

The carat ^ specifies an exact dependency configuration, which in this case activates CUDA For a complete list of tunable Kokkos options, run

spack info kokkos

Setting up a development environment with Spack

Spack is generally most useful for installing packages to use. If you want to install all dependencies of Kokkos Kernels first so that you can actively develop a given Kokkos Kernels source this can still be done. Go to the Kokkos Kernels source code folder and run:

spack diy -u cmake kokkos-kernels@{version} ...

specifying the exact version you want to develop and giving any spec options in .... This creates a folder spack-build where you can make.

Trilinos

For Trilinos builds with the Cuda backend and complex double enabled with ETI, the cmake option below may need to be set to avoid Error 127 errors: CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON

If the option above is not set, a warning will be issued during configuration:

"The CMake option CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS is either undefined or OFF. Please set CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON when building with CUDA and complex double enabled."

Using Kokkoskernels Test Drivers

In perf_test there are test drivers.

  • KokkosGraph_triangle.exe : Triangle counting driver.
  • KokkosSparse_spgemm.exe : Sparse Matrix Sparse Matrix Multiply:
  • *NOTE: KKMEM is outdated. Use default algorithm: KKSPGEMM = KKDEFAULT = DEFAULT
  • Or within the code:
  • kh.create_spgemm_handle(KokkosSparse::SPGEMM_KK);
    
  • KokkosSparse_spmv.exe : Sparse matvec.
  • KokkosSparse_pcg.exe : CG method with Gauss Seidel as preconditioner.
  • KokkosGraph_color.exe : Distance-1 Graph coloring
  • KokkosKernels_MatrixConverter.exe : given a matrix market format, converts it ".bin" binary format for fast input output readings, which can be read by other test drivers.

Please report bugs or performance issues to: https://github.com/kokkos/kokkos-kernels/issues

License

Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software.

The full license statement used in all headers is available here or here.

About

Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

Topics

Resources

Security policy

Stars

401 stars

Watchers

28 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - kokkos/kokkos-kernels: Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels · GitHub
Skip to content

Latest commit

History

6,359 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

OpenSSF ScorecardOpenSSF Best Practiceskokkos-kernels/docs

KokkosKernels

Kokkos Kernels

Kokkos C++ Performance Portability Programming EcoSystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

KokkosKernels implements local computational kernels for linear algebra and graph operations, using the Kokkos shared-memory parallel programming model. "Local" means not using MPI, or running within a single MPI process without knowing about MPI. "Computational kernels" are coarse-grained operations; they take a lot of work and make sense to parallelize inside using Kokkos. KokkosKernels can be the building block of a parallel linear algebra library like Tpetra that uses MPI and threads for parallelism, or it can be used stand-alone in your application.

Computational kernels in this subpackage include the following:

  • (Multi)vector dot products, norms, and updates (AXPY-like operations that add vectors together entry-wise)
  • Sparse matrix-vector multiply and other sparse matrix / dense vector kernels
  • Sparse matrix-matrix multiply
  • Graph coloring
  • Gauss-Seidel with coloring (generalization of red-black)
  • Other linear algebra and graph operations

We organize this directory as follows:

  1. Public interfaces to computational kernels live in each component src/ subdirectories (e.g., blas/src/, sparse/src/):
  • KokkosSparse_CrsMatrix.hpp: Declaration and definition of KokkosSparse::CrsMatrix, the sparse matrix data structure used for the computational kernels below
  • KokkosSparse_spmv.hpp: Sparse matrix-vector multiply with a single vector, stored in a 1-D View + Sparse matrix-vector multiply with multiple vectors at a time (multivectors), stored in a 2-D View
  1. Implementations of computational kernels live in each component impl/ subdirectories (e.g., blas/impl/, sparse/impl/)

  2. Correctness tests live in each component unit_test/ subdirectories (e.g., blas/unit_test/, sparse/unit_test/), and performance tests live in the perf_test/ subdirectory

  3. Simple example scripts to build Kokkoskernels are in example/buildlib/

Do NOT use or rely on anything in the KokkosBlas::Impl namespace, or on anything in the impl/ subdirectory.

This separation of interface and implementation lets the interface assign the users' Views to View types with the desired attributes (e.g., read-only, RandomRead). This also makes it easier to provide full specializations of the implementation. "Full specializations" mean that all the template parameters are fixed, so that the compiler can actually compile the code. This technique keeps your library's or application's build times down, since kernels are already precompiled for certain template parameter combinations. It also improves performance, since compilers have an easier time optimizing code in shorter .cpp files.

Building Kokkoskernels

CMake

Following Kokkos style, all CMake options are of the form

KokkosKernels_ENABLE_OPTION

with options capitalized at the end. Almost all Kokkos Kernels options determine whether ETI is used with a particular datatype, e.g.

-DKokkosKernels_INST_DOUBLE=On

which does explicit instantiation of all kernels for double type. Kokkos Kernels derives most of its CXXFLAGS, C++ standard, architecture flags, and other options from an installed (or in-tree) Kokkos package. Tuning for a particular device or architecture is generally done through Kokkos while tuning which kernels get instantiated is done through Kokkos Kernels.

Kokkos Kernels does supply flags for asserting properties of the linked Kokkos, for example:

-DKokkosKernels_REQUIRE_DEVICES=CUDA
-DKokkosKernels_REQUIRE_OPTIONS=cuda_relocatable_device_code

This does NOT enable CUDA directly, but rather verifies that the underlying Kokkos supports the desired option. If the underlying Kokkos was not built properly, CMake will crash and tell you to re-build Kokkos. The values (unlike the option names) are not case-sensitive. More details can be found in the build instructions or developer instructions.

Spack

An alternative to manually building with the CMake is to use the Spack package manager. To do so, download the kokkos-spack git repo and add to the package list:

spack repo add $path-to-kokkos-spack

A basic installation would be done as:

spack install kokkos-kernels

Spack allows options and compilers to be tuned in the install command.

spack install kokkos-kernels@3.0 +double %gcc@7.3.0 +openmp

This example illustrates the three most common parameters to Spack:

  • Variants: specified with, e.g. +openmp, this activates (or deactivates with, e.g. ~openmp) certain options.
  • Version: immediately following kokkos-kernels the @version can specify a particular Kokkos Kernels to build
  • Compiler: a default compiler will be chosen if not specified, but an exact compiler version can be given with the % option.

For a complete list of Kokkos Kernels options, run:

spack info kokkos-kernels

Tuning Kokkos Options

As discussed above in the CMake section, Kokkos Kernels inherits much of its configuration from the installed Kokkos. Spack gives a mechanism for directly specifying Kokkos dependency options:

spack install kokkos-kernels ^kokkos@5.0+cuda

The carat ^ specifies an exact dependency configuration, which in this case activates CUDA For a complete list of tunable Kokkos options, run

spack info kokkos

Setting up a development environment with Spack

Spack is generally most useful for installing packages to use. If you want to install all dependencies of Kokkos Kernels first so that you can actively develop a given Kokkos Kernels source this can still be done. Go to the Kokkos Kernels source code folder and run:

spack diy -u cmake kokkos-kernels@{version} ...

specifying the exact version you want to develop and giving any spec options in .... This creates a folder spack-build where you can make.

Trilinos

For Trilinos builds with the Cuda backend and complex double enabled with ETI, the cmake option below may need to be set to avoid Error 127 errors: CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON

If the option above is not set, a warning will be issued during configuration:

"The CMake option CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS is either undefined or OFF. Please set CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON when building with CUDA and complex double enabled."

Using Kokkoskernels Test Drivers

In perf_test there are test drivers.

  • KokkosGraph_triangle.exe : Triangle counting driver.
  • KokkosSparse_spgemm.exe : Sparse Matrix Sparse Matrix Multiply:
  • *NOTE: KKMEM is outdated. Use default algorithm: KKSPGEMM = KKDEFAULT = DEFAULT
  • Or within the code:
  • kh.create_spgemm_handle(KokkosSparse::SPGEMM_KK);
    
  • KokkosSparse_spmv.exe : Sparse matvec.
  • KokkosSparse_pcg.exe : CG method with Gauss Seidel as preconditioner.
  • KokkosGraph_color.exe : Distance-1 Graph coloring
  • KokkosKernels_MatrixConverter.exe : given a matrix market format, converts it ".bin" binary format for fast input output readings, which can be read by other test drivers.

Please report bugs or performance issues to: https://github.com/kokkos/kokkos-kernels/issues

License

Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software.

The full license statement used in all headers is available here or here.

About

Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

Topics

Resources

Security policy

Stars

401 stars

Watchers

28 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - kokkos/kokkos-kernels: Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels · GitHub
Skip to content

Latest commit

History

6,359 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

OpenSSF ScorecardOpenSSF Best Practiceskokkos-kernels/docs

KokkosKernels

Kokkos Kernels

Kokkos C++ Performance Portability Programming EcoSystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

KokkosKernels implements local computational kernels for linear algebra and graph operations, using the Kokkos shared-memory parallel programming model. "Local" means not using MPI, or running within a single MPI process without knowing about MPI. "Computational kernels" are coarse-grained operations; they take a lot of work and make sense to parallelize inside using Kokkos. KokkosKernels can be the building block of a parallel linear algebra library like Tpetra that uses MPI and threads for parallelism, or it can be used stand-alone in your application.

Computational kernels in this subpackage include the following:

  • (Multi)vector dot products, norms, and updates (AXPY-like operations that add vectors together entry-wise)
  • Sparse matrix-vector multiply and other sparse matrix / dense vector kernels
  • Sparse matrix-matrix multiply
  • Graph coloring
  • Gauss-Seidel with coloring (generalization of red-black)
  • Other linear algebra and graph operations

We organize this directory as follows:

  1. Public interfaces to computational kernels live in each component src/ subdirectories (e.g., blas/src/, sparse/src/):
  • KokkosSparse_CrsMatrix.hpp: Declaration and definition of KokkosSparse::CrsMatrix, the sparse matrix data structure used for the computational kernels below
  • KokkosSparse_spmv.hpp: Sparse matrix-vector multiply with a single vector, stored in a 1-D View + Sparse matrix-vector multiply with multiple vectors at a time (multivectors), stored in a 2-D View
  1. Implementations of computational kernels live in each component impl/ subdirectories (e.g., blas/impl/, sparse/impl/)

  2. Correctness tests live in each component unit_test/ subdirectories (e.g., blas/unit_test/, sparse/unit_test/), and performance tests live in the perf_test/ subdirectory

  3. Simple example scripts to build Kokkoskernels are in example/buildlib/

Do NOT use or rely on anything in the KokkosBlas::Impl namespace, or on anything in the impl/ subdirectory.

This separation of interface and implementation lets the interface assign the users' Views to View types with the desired attributes (e.g., read-only, RandomRead). This also makes it easier to provide full specializations of the implementation. "Full specializations" mean that all the template parameters are fixed, so that the compiler can actually compile the code. This technique keeps your library's or application's build times down, since kernels are already precompiled for certain template parameter combinations. It also improves performance, since compilers have an easier time optimizing code in shorter .cpp files.

Building Kokkoskernels

CMake

Following Kokkos style, all CMake options are of the form

KokkosKernels_ENABLE_OPTION

with options capitalized at the end. Almost all Kokkos Kernels options determine whether ETI is used with a particular datatype, e.g.

-DKokkosKernels_INST_DOUBLE=On

which does explicit instantiation of all kernels for double type. Kokkos Kernels derives most of its CXXFLAGS, C++ standard, architecture flags, and other options from an installed (or in-tree) Kokkos package. Tuning for a particular device or architecture is generally done through Kokkos while tuning which kernels get instantiated is done through Kokkos Kernels.

Kokkos Kernels does supply flags for asserting properties of the linked Kokkos, for example:

-DKokkosKernels_REQUIRE_DEVICES=CUDA
-DKokkosKernels_REQUIRE_OPTIONS=cuda_relocatable_device_code

This does NOT enable CUDA directly, but rather verifies that the underlying Kokkos supports the desired option. If the underlying Kokkos was not built properly, CMake will crash and tell you to re-build Kokkos. The values (unlike the option names) are not case-sensitive. More details can be found in the build instructions or developer instructions.

Spack

An alternative to manually building with the CMake is to use the Spack package manager. To do so, download the kokkos-spack git repo and add to the package list:

spack repo add $path-to-kokkos-spack

A basic installation would be done as:

spack install kokkos-kernels

Spack allows options and compilers to be tuned in the install command.

spack install kokkos-kernels@3.0 +double %gcc@7.3.0 +openmp

This example illustrates the three most common parameters to Spack:

  • Variants: specified with, e.g. +openmp, this activates (or deactivates with, e.g. ~openmp) certain options.
  • Version: immediately following kokkos-kernels the @version can specify a particular Kokkos Kernels to build
  • Compiler: a default compiler will be chosen if not specified, but an exact compiler version can be given with the % option.

For a complete list of Kokkos Kernels options, run:

spack info kokkos-kernels

Tuning Kokkos Options

As discussed above in the CMake section, Kokkos Kernels inherits much of its configuration from the installed Kokkos. Spack gives a mechanism for directly specifying Kokkos dependency options:

spack install kokkos-kernels ^kokkos@5.0+cuda

The carat ^ specifies an exact dependency configuration, which in this case activates CUDA For a complete list of tunable Kokkos options, run

spack info kokkos

Setting up a development environment with Spack

Spack is generally most useful for installing packages to use. If you want to install all dependencies of Kokkos Kernels first so that you can actively develop a given Kokkos Kernels source this can still be done. Go to the Kokkos Kernels source code folder and run:

spack diy -u cmake kokkos-kernels@{version} ...

specifying the exact version you want to develop and giving any spec options in .... This creates a folder spack-build where you can make.

Trilinos

For Trilinos builds with the Cuda backend and complex double enabled with ETI, the cmake option below may need to be set to avoid Error 127 errors: CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON

If the option above is not set, a warning will be issued during configuration:

"The CMake option CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS is either undefined or OFF. Please set CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON when building with CUDA and complex double enabled."

Using Kokkoskernels Test Drivers

In perf_test there are test drivers.

  • KokkosGraph_triangle.exe : Triangle counting driver.
  • KokkosSparse_spgemm.exe : Sparse Matrix Sparse Matrix Multiply:
  • *NOTE: KKMEM is outdated. Use default algorithm: KKSPGEMM = KKDEFAULT = DEFAULT
  • Or within the code:
  • kh.create_spgemm_handle(KokkosSparse::SPGEMM_KK);
    
  • KokkosSparse_spmv.exe : Sparse matvec.
  • KokkosSparse_pcg.exe : CG method with Gauss Seidel as preconditioner.
  • KokkosGraph_color.exe : Distance-1 Graph coloring
  • KokkosKernels_MatrixConverter.exe : given a matrix market format, converts it ".bin" binary format for fast input output readings, which can be read by other test drivers.

Please report bugs or performance issues to: https://github.com/kokkos/kokkos-kernels/issues

License

Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software.

The full license statement used in all headers is available here or here.

About

Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

Topics

Resources

Security policy

Stars

401 stars

Watchers

28 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - kokkos/kokkos-kernels: Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels · GitHub
Skip to content

Latest commit

History

6,359 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

OpenSSF ScorecardOpenSSF Best Practiceskokkos-kernels/docs

KokkosKernels

Kokkos Kernels

Kokkos C++ Performance Portability Programming EcoSystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

KokkosKernels implements local computational kernels for linear algebra and graph operations, using the Kokkos shared-memory parallel programming model. "Local" means not using MPI, or running within a single MPI process without knowing about MPI. "Computational kernels" are coarse-grained operations; they take a lot of work and make sense to parallelize inside using Kokkos. KokkosKernels can be the building block of a parallel linear algebra library like Tpetra that uses MPI and threads for parallelism, or it can be used stand-alone in your application.

Computational kernels in this subpackage include the following:

  • (Multi)vector dot products, norms, and updates (AXPY-like operations that add vectors together entry-wise)
  • Sparse matrix-vector multiply and other sparse matrix / dense vector kernels
  • Sparse matrix-matrix multiply
  • Graph coloring
  • Gauss-Seidel with coloring (generalization of red-black)
  • Other linear algebra and graph operations

We organize this directory as follows:

  1. Public interfaces to computational kernels live in each component src/ subdirectories (e.g., blas/src/, sparse/src/):
  • KokkosSparse_CrsMatrix.hpp: Declaration and definition of KokkosSparse::CrsMatrix, the sparse matrix data structure used for the computational kernels below
  • KokkosSparse_spmv.hpp: Sparse matrix-vector multiply with a single vector, stored in a 1-D View + Sparse matrix-vector multiply with multiple vectors at a time (multivectors), stored in a 2-D View
  1. Implementations of computational kernels live in each component impl/ subdirectories (e.g., blas/impl/, sparse/impl/)

  2. Correctness tests live in each component unit_test/ subdirectories (e.g., blas/unit_test/, sparse/unit_test/), and performance tests live in the perf_test/ subdirectory

  3. Simple example scripts to build Kokkoskernels are in example/buildlib/

Do NOT use or rely on anything in the KokkosBlas::Impl namespace, or on anything in the impl/ subdirectory.

This separation of interface and implementation lets the interface assign the users' Views to View types with the desired attributes (e.g., read-only, RandomRead). This also makes it easier to provide full specializations of the implementation. "Full specializations" mean that all the template parameters are fixed, so that the compiler can actually compile the code. This technique keeps your library's or application's build times down, since kernels are already precompiled for certain template parameter combinations. It also improves performance, since compilers have an easier time optimizing code in shorter .cpp files.

Building Kokkoskernels

CMake

Following Kokkos style, all CMake options are of the form

KokkosKernels_ENABLE_OPTION

with options capitalized at the end. Almost all Kokkos Kernels options determine whether ETI is used with a particular datatype, e.g.

-DKokkosKernels_INST_DOUBLE=On

which does explicit instantiation of all kernels for double type. Kokkos Kernels derives most of its CXXFLAGS, C++ standard, architecture flags, and other options from an installed (or in-tree) Kokkos package. Tuning for a particular device or architecture is generally done through Kokkos while tuning which kernels get instantiated is done through Kokkos Kernels.

Kokkos Kernels does supply flags for asserting properties of the linked Kokkos, for example:

-DKokkosKernels_REQUIRE_DEVICES=CUDA
-DKokkosKernels_REQUIRE_OPTIONS=cuda_relocatable_device_code

This does NOT enable CUDA directly, but rather verifies that the underlying Kokkos supports the desired option. If the underlying Kokkos was not built properly, CMake will crash and tell you to re-build Kokkos. The values (unlike the option names) are not case-sensitive. More details can be found in the build instructions or developer instructions.

Spack

An alternative to manually building with the CMake is to use the Spack package manager. To do so, download the kokkos-spack git repo and add to the package list:

spack repo add $path-to-kokkos-spack

A basic installation would be done as:

spack install kokkos-kernels

Spack allows options and compilers to be tuned in the install command.

spack install kokkos-kernels@3.0 +double %gcc@7.3.0 +openmp

This example illustrates the three most common parameters to Spack:

  • Variants: specified with, e.g. +openmp, this activates (or deactivates with, e.g. ~openmp) certain options.
  • Version: immediately following kokkos-kernels the @version can specify a particular Kokkos Kernels to build
  • Compiler: a default compiler will be chosen if not specified, but an exact compiler version can be given with the % option.

For a complete list of Kokkos Kernels options, run:

spack info kokkos-kernels

Tuning Kokkos Options

As discussed above in the CMake section, Kokkos Kernels inherits much of its configuration from the installed Kokkos. Spack gives a mechanism for directly specifying Kokkos dependency options:

spack install kokkos-kernels ^kokkos@5.0+cuda

The carat ^ specifies an exact dependency configuration, which in this case activates CUDA For a complete list of tunable Kokkos options, run

spack info kokkos

Setting up a development environment with Spack

Spack is generally most useful for installing packages to use. If you want to install all dependencies of Kokkos Kernels first so that you can actively develop a given Kokkos Kernels source this can still be done. Go to the Kokkos Kernels source code folder and run:

spack diy -u cmake kokkos-kernels@{version} ...

specifying the exact version you want to develop and giving any spec options in .... This creates a folder spack-build where you can make.

Trilinos

For Trilinos builds with the Cuda backend and complex double enabled with ETI, the cmake option below may need to be set to avoid Error 127 errors: CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON

If the option above is not set, a warning will be issued during configuration:

"The CMake option CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS is either undefined or OFF. Please set CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON when building with CUDA and complex double enabled."

Using Kokkoskernels Test Drivers

In perf_test there are test drivers.

  • KokkosGraph_triangle.exe : Triangle counting driver.
  • KokkosSparse_spgemm.exe : Sparse Matrix Sparse Matrix Multiply:
  • *NOTE: KKMEM is outdated. Use default algorithm: KKSPGEMM = KKDEFAULT = DEFAULT
  • Or within the code:
  • kh.create_spgemm_handle(KokkosSparse::SPGEMM_KK);
    
  • KokkosSparse_spmv.exe : Sparse matvec.
  • KokkosSparse_pcg.exe : CG method with Gauss Seidel as preconditioner.
  • KokkosGraph_color.exe : Distance-1 Graph coloring
  • KokkosKernels_MatrixConverter.exe : given a matrix market format, converts it ".bin" binary format for fast input output readings, which can be read by other test drivers.

Please report bugs or performance issues to: https://github.com/kokkos/kokkos-kernels/issues

License

Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software.

The full license statement used in all headers is available here or here.

About

Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

Topics

Resources

Security policy

Stars

401 stars

Watchers

28 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - kokkos/kokkos-kernels: Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels · GitHub
Skip to content

Latest commit

History

6,359 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

OpenSSF ScorecardOpenSSF Best Practiceskokkos-kernels/docs

KokkosKernels

Kokkos Kernels

Kokkos C++ Performance Portability Programming EcoSystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

KokkosKernels implements local computational kernels for linear algebra and graph operations, using the Kokkos shared-memory parallel programming model. "Local" means not using MPI, or running within a single MPI process without knowing about MPI. "Computational kernels" are coarse-grained operations; they take a lot of work and make sense to parallelize inside using Kokkos. KokkosKernels can be the building block of a parallel linear algebra library like Tpetra that uses MPI and threads for parallelism, or it can be used stand-alone in your application.

Computational kernels in this subpackage include the following:

  • (Multi)vector dot products, norms, and updates (AXPY-like operations that add vectors together entry-wise)
  • Sparse matrix-vector multiply and other sparse matrix / dense vector kernels
  • Sparse matrix-matrix multiply
  • Graph coloring
  • Gauss-Seidel with coloring (generalization of red-black)
  • Other linear algebra and graph operations

We organize this directory as follows:

  1. Public interfaces to computational kernels live in each component src/ subdirectories (e.g., blas/src/, sparse/src/):
  • KokkosSparse_CrsMatrix.hpp: Declaration and definition of KokkosSparse::CrsMatrix, the sparse matrix data structure used for the computational kernels below
  • KokkosSparse_spmv.hpp: Sparse matrix-vector multiply with a single vector, stored in a 1-D View + Sparse matrix-vector multiply with multiple vectors at a time (multivectors), stored in a 2-D View
  1. Implementations of computational kernels live in each component impl/ subdirectories (e.g., blas/impl/, sparse/impl/)

  2. Correctness tests live in each component unit_test/ subdirectories (e.g., blas/unit_test/, sparse/unit_test/), and performance tests live in the perf_test/ subdirectory

  3. Simple example scripts to build Kokkoskernels are in example/buildlib/

Do NOT use or rely on anything in the KokkosBlas::Impl namespace, or on anything in the impl/ subdirectory.

This separation of interface and implementation lets the interface assign the users' Views to View types with the desired attributes (e.g., read-only, RandomRead). This also makes it easier to provide full specializations of the implementation. "Full specializations" mean that all the template parameters are fixed, so that the compiler can actually compile the code. This technique keeps your library's or application's build times down, since kernels are already precompiled for certain template parameter combinations. It also improves performance, since compilers have an easier time optimizing code in shorter .cpp files.

Building Kokkoskernels

CMake

Following Kokkos style, all CMake options are of the form

KokkosKernels_ENABLE_OPTION

with options capitalized at the end. Almost all Kokkos Kernels options determine whether ETI is used with a particular datatype, e.g.

-DKokkosKernels_INST_DOUBLE=On

which does explicit instantiation of all kernels for double type. Kokkos Kernels derives most of its CXXFLAGS, C++ standard, architecture flags, and other options from an installed (or in-tree) Kokkos package. Tuning for a particular device or architecture is generally done through Kokkos while tuning which kernels get instantiated is done through Kokkos Kernels.

Kokkos Kernels does supply flags for asserting properties of the linked Kokkos, for example:

-DKokkosKernels_REQUIRE_DEVICES=CUDA
-DKokkosKernels_REQUIRE_OPTIONS=cuda_relocatable_device_code

This does NOT enable CUDA directly, but rather verifies that the underlying Kokkos supports the desired option. If the underlying Kokkos was not built properly, CMake will crash and tell you to re-build Kokkos. The values (unlike the option names) are not case-sensitive. More details can be found in the build instructions or developer instructions.

Spack

An alternative to manually building with the CMake is to use the Spack package manager. To do so, download the kokkos-spack git repo and add to the package list:

spack repo add $path-to-kokkos-spack

A basic installation would be done as:

spack install kokkos-kernels

Spack allows options and compilers to be tuned in the install command.

spack install kokkos-kernels@3.0 +double %gcc@7.3.0 +openmp

This example illustrates the three most common parameters to Spack:

  • Variants: specified with, e.g. +openmp, this activates (or deactivates with, e.g. ~openmp) certain options.
  • Version: immediately following kokkos-kernels the @version can specify a particular Kokkos Kernels to build
  • Compiler: a default compiler will be chosen if not specified, but an exact compiler version can be given with the % option.

For a complete list of Kokkos Kernels options, run:

spack info kokkos-kernels

Tuning Kokkos Options

As discussed above in the CMake section, Kokkos Kernels inherits much of its configuration from the installed Kokkos. Spack gives a mechanism for directly specifying Kokkos dependency options:

spack install kokkos-kernels ^kokkos@5.0+cuda

The carat ^ specifies an exact dependency configuration, which in this case activates CUDA For a complete list of tunable Kokkos options, run

spack info kokkos

Setting up a development environment with Spack

Spack is generally most useful for installing packages to use. If you want to install all dependencies of Kokkos Kernels first so that you can actively develop a given Kokkos Kernels source this can still be done. Go to the Kokkos Kernels source code folder and run:

spack diy -u cmake kokkos-kernels@{version} ...

specifying the exact version you want to develop and giving any spec options in .... This creates a folder spack-build where you can make.

Trilinos

For Trilinos builds with the Cuda backend and complex double enabled with ETI, the cmake option below may need to be set to avoid Error 127 errors: CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON

If the option above is not set, a warning will be issued during configuration:

"The CMake option CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS is either undefined or OFF. Please set CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON when building with CUDA and complex double enabled."

Using Kokkoskernels Test Drivers

In perf_test there are test drivers.

  • KokkosGraph_triangle.exe : Triangle counting driver.
  • KokkosSparse_spgemm.exe : Sparse Matrix Sparse Matrix Multiply:
  • *NOTE: KKMEM is outdated. Use default algorithm: KKSPGEMM = KKDEFAULT = DEFAULT
  • Or within the code:
  • kh.create_spgemm_handle(KokkosSparse::SPGEMM_KK);
    
  • KokkosSparse_spmv.exe : Sparse matvec.
  • KokkosSparse_pcg.exe : CG method with Gauss Seidel as preconditioner.
  • KokkosGraph_color.exe : Distance-1 Graph coloring
  • KokkosKernels_MatrixConverter.exe : given a matrix market format, converts it ".bin" binary format for fast input output readings, which can be read by other test drivers.

Please report bugs or performance issues to: https://github.com/kokkos/kokkos-kernels/issues

License

Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software.

The full license statement used in all headers is available here or here.

About

Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

Topics

Resources

Security policy

Stars

401 stars

Watchers

28 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - kokkos/kokkos-kernels: Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels · GitHub
Skip to content

Latest commit

History

6,359 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

OpenSSF ScorecardOpenSSF Best Practiceskokkos-kernels/docs

KokkosKernels

Kokkos Kernels

Kokkos C++ Performance Portability Programming EcoSystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

KokkosKernels implements local computational kernels for linear algebra and graph operations, using the Kokkos shared-memory parallel programming model. "Local" means not using MPI, or running within a single MPI process without knowing about MPI. "Computational kernels" are coarse-grained operations; they take a lot of work and make sense to parallelize inside using Kokkos. KokkosKernels can be the building block of a parallel linear algebra library like Tpetra that uses MPI and threads for parallelism, or it can be used stand-alone in your application.

Computational kernels in this subpackage include the following:

  • (Multi)vector dot products, norms, and updates (AXPY-like operations that add vectors together entry-wise)
  • Sparse matrix-vector multiply and other sparse matrix / dense vector kernels
  • Sparse matrix-matrix multiply
  • Graph coloring
  • Gauss-Seidel with coloring (generalization of red-black)
  • Other linear algebra and graph operations

We organize this directory as follows:

  1. Public interfaces to computational kernels live in each component src/ subdirectories (e.g., blas/src/, sparse/src/):
  • KokkosSparse_CrsMatrix.hpp: Declaration and definition of KokkosSparse::CrsMatrix, the sparse matrix data structure used for the computational kernels below
  • KokkosSparse_spmv.hpp: Sparse matrix-vector multiply with a single vector, stored in a 1-D View + Sparse matrix-vector multiply with multiple vectors at a time (multivectors), stored in a 2-D View
  1. Implementations of computational kernels live in each component impl/ subdirectories (e.g., blas/impl/, sparse/impl/)

  2. Correctness tests live in each component unit_test/ subdirectories (e.g., blas/unit_test/, sparse/unit_test/), and performance tests live in the perf_test/ subdirectory

  3. Simple example scripts to build Kokkoskernels are in example/buildlib/

Do NOT use or rely on anything in the KokkosBlas::Impl namespace, or on anything in the impl/ subdirectory.

This separation of interface and implementation lets the interface assign the users' Views to View types with the desired attributes (e.g., read-only, RandomRead). This also makes it easier to provide full specializations of the implementation. "Full specializations" mean that all the template parameters are fixed, so that the compiler can actually compile the code. This technique keeps your library's or application's build times down, since kernels are already precompiled for certain template parameter combinations. It also improves performance, since compilers have an easier time optimizing code in shorter .cpp files.

Building Kokkoskernels

CMake

Following Kokkos style, all CMake options are of the form

KokkosKernels_ENABLE_OPTION

with options capitalized at the end. Almost all Kokkos Kernels options determine whether ETI is used with a particular datatype, e.g.

-DKokkosKernels_INST_DOUBLE=On

which does explicit instantiation of all kernels for double type. Kokkos Kernels derives most of its CXXFLAGS, C++ standard, architecture flags, and other options from an installed (or in-tree) Kokkos package. Tuning for a particular device or architecture is generally done through Kokkos while tuning which kernels get instantiated is done through Kokkos Kernels.

Kokkos Kernels does supply flags for asserting properties of the linked Kokkos, for example:

-DKokkosKernels_REQUIRE_DEVICES=CUDA
-DKokkosKernels_REQUIRE_OPTIONS=cuda_relocatable_device_code

This does NOT enable CUDA directly, but rather verifies that the underlying Kokkos supports the desired option. If the underlying Kokkos was not built properly, CMake will crash and tell you to re-build Kokkos. The values (unlike the option names) are not case-sensitive. More details can be found in the build instructions or developer instructions.

Spack

An alternative to manually building with the CMake is to use the Spack package manager. To do so, download the kokkos-spack git repo and add to the package list:

spack repo add $path-to-kokkos-spack

A basic installation would be done as:

spack install kokkos-kernels

Spack allows options and compilers to be tuned in the install command.

spack install kokkos-kernels@3.0 +double %gcc@7.3.0 +openmp

This example illustrates the three most common parameters to Spack:

  • Variants: specified with, e.g. +openmp, this activates (or deactivates with, e.g. ~openmp) certain options.
  • Version: immediately following kokkos-kernels the @version can specify a particular Kokkos Kernels to build
  • Compiler: a default compiler will be chosen if not specified, but an exact compiler version can be given with the % option.

For a complete list of Kokkos Kernels options, run:

spack info kokkos-kernels

Tuning Kokkos Options

As discussed above in the CMake section, Kokkos Kernels inherits much of its configuration from the installed Kokkos. Spack gives a mechanism for directly specifying Kokkos dependency options:

spack install kokkos-kernels ^kokkos@5.0+cuda

The carat ^ specifies an exact dependency configuration, which in this case activates CUDA For a complete list of tunable Kokkos options, run

spack info kokkos

Setting up a development environment with Spack

Spack is generally most useful for installing packages to use. If you want to install all dependencies of Kokkos Kernels first so that you can actively develop a given Kokkos Kernels source this can still be done. Go to the Kokkos Kernels source code folder and run:

spack diy -u cmake kokkos-kernels@{version} ...

specifying the exact version you want to develop and giving any spec options in .... This creates a folder spack-build where you can make.

Trilinos

For Trilinos builds with the Cuda backend and complex double enabled with ETI, the cmake option below may need to be set to avoid Error 127 errors: CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON

If the option above is not set, a warning will be issued during configuration:

"The CMake option CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS is either undefined or OFF. Please set CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS:BOOL=ON when building with CUDA and complex double enabled."

Using Kokkoskernels Test Drivers

In perf_test there are test drivers.

  • KokkosGraph_triangle.exe : Triangle counting driver.
  • KokkosSparse_spgemm.exe : Sparse Matrix Sparse Matrix Multiply:
  • *NOTE: KKMEM is outdated. Use default algorithm: KKSPGEMM = KKDEFAULT = DEFAULT
  • Or within the code:
  • kh.create_spgemm_handle(KokkosSparse::SPGEMM_KK);
    
  • KokkosSparse_spmv.exe : Sparse matvec.
  • KokkosSparse_pcg.exe : CG method with Gauss Seidel as preconditioner.
  • KokkosGraph_color.exe : Distance-1 Graph coloring
  • KokkosKernels_MatrixConverter.exe : given a matrix market format, converts it ".bin" binary format for fast input output readings, which can be read by other test drivers.

Please report bugs or performance issues to: https://github.com/kokkos/kokkos-kernels/issues

License

Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software.

The full license statement used in all headers is available here or here.

About

Kokkos C++ Performance Portability Programming Ecosystem: Math Kernels - Provides BLAS, Sparse BLAS and Graph Kernels

Topics

Resources

Security policy

Stars

401 stars

Watchers

28 watching

Forks

Releases

Packages

Used by

Contributors

Languages