From 9d8cef113d59349a7b15065cff8b4a421b2b978f Mon Sep 17 00:00:00 2001 From: Rafal Bielski Date: Mon, 13 Jan 2025 18:05:04 +0000 Subject: [PATCH] Rename oneMKL to oneMath in lesson materials * Rename oneMKL to oneMath in the slides. * Rename the relevant files and directory accordingly * Improve the formatting of the slides * Expand the slides to explain what oneMath is --- Lesson_Materials/OneMKL_gemm/index.html | 154 -- .../common-revealjs/images/oneAPI.png | Bin 0 -> 70958 bytes .../images/oneMath-backends.svg | 1427 +++++++++++++++++ .../common-revealjs/images/uxl.svg | 205 +++ Lesson_Materials/oneMath_gemm/index.html | 208 +++ 5 files changed, 1840 insertions(+), 154 deletions(-) delete mode 100644 Lesson_Materials/OneMKL_gemm/index.html create mode 100644 Lesson_Materials/common-revealjs/images/oneAPI.png create mode 100644 Lesson_Materials/common-revealjs/images/oneMath-backends.svg create mode 100644 Lesson_Materials/common-revealjs/images/uxl.svg create mode 100644 Lesson_Materials/oneMath_gemm/index.html diff --git a/Lesson_Materials/OneMKL_gemm/index.html b/Lesson_Materials/OneMKL_gemm/index.html deleted file mode 100644 index 31b95da5..00000000 --- a/Lesson_Materials/OneMKL_gemm/index.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - -
-
-
- - - - -
- -
-
- ## oneAPI Math Kernel Library (oneMKL) Interfaces -
-
- -
- ## Learning Objectives - * Learn about oneMKL library, more specifically oneMKL Interfaces project - * Learn about how to use GEMM APIs from oneMKL with both USM and buffer memory models -
- -
- ## Resources - * oneMKL Interfaces: https://github.com/oneapi-src/oneMKL - * oneMKL specification: https://spec.oneapi.io/versions/latest/elements/oneMKL/source/index.html# - * Important: What is the difference between the following oneMKL terms: - (1) oneAPI Specification for oneMKL - (2) oneAPI's oneMKL Interfaces Project - (3) Intel(R) oneAPI's oneMKL Product - https://github.com/oneapi-src/oneMKL?tab=readme-ov-file#onemkl -
- -
-
- #### Run-time dispatching -
-
-
-
-#include <oneapi/mkl/blas.hpp>
-
-...
-
-sycl::queue cpu_queue(sycl::cpu_selector_v);
-sycl::queue gpu_queue(sycl::gpu_selector_v);
-
-oneapi::mkl::blas::column_major::gemm(cpu_queue, transA, transB, m, ...);
-oneapi::mkl::blas::column_major::gemm(gpu_queue, transA, transB, m, ...);
-				
-
-
- * Backend is loaded at run-time based on device-vendor - * `$> icpx -fsycl –I$ONEMKL/include app.cpp` - * `$> icpx -fsycl app.o –L$ONEMKL/lib –lonemkl` -
-
-
-
-
- #### Compile-time dispatching -
-
-
-
-#include <oneapi/mkl/blas.hpp>
-
-...
-
-sycl::queue cpu_queue(sycl::cpu_selector_v);
-sycl::queue gpu_queue(sycl::gpu_selector_v);
-
-oneapi::mkl::backend_selector<oneapi::mkl::backend::mklcpu> cpu_selector(cpu_queue);
-oneapi::mkl::backend_selector<oneapi::mkl::backend::cublas> gpu_selector(gpu_queue);
-
-oneapi::mkl::blas::column_major::gemm(cpu_selector,
-                                      transA, transB, m, ...);
-oneapi::mkl::blas::column_major::gemm(gpu_selector,
-                                      transA, transB, m, ...);
-				
-
-
- * Uses a templated backend selector APIs, where the template parameters specify the backends - * Application is linked with the required oneMKL backend wrapper libraries - * `$> clang++ -fsycl –I$ONEMKL/include app.cpp` - * `$> clang++ -fsycl app.o –L$ONEMKL/lib –lonemkl_blas_mklcpu –lonemkl_blas_cublas` -
-
-
- -
- ## Exercise - * Objectives: Learn to use oneMKL GEMM buffer, USM APIs - * What is provided: - ** Boiler plate-code provided (a) to perform GEMM on CPU, (b) Helper function to verify results from oneMKL APIs and CPU - ** Please complete the TODO tasks marked in the `source_*.cpp`. - ** Refer to the solutions at `solution_*.cpp` -
-
-
- - - - - - - diff --git a/Lesson_Materials/common-revealjs/images/oneAPI.png b/Lesson_Materials/common-revealjs/images/oneAPI.png new file mode 100644 index 0000000000000000000000000000000000000000..e822aab97632dae8e1d9f38c604abeb8edcd6b83 GIT binary patch literal 70958 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 literal 0 HcmV?d00001 diff --git a/Lesson_Materials/common-revealjs/images/oneMath-backends.svg b/Lesson_Materials/common-revealjs/images/oneMath-backends.svg new file mode 100644 index 00000000..b4269c56 --- /dev/null +++ b/Lesson_Materials/common-revealjs/images/oneMath-backends.svg @@ -0,0 +1,1427 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ oneMath
+
+
+
+ oneMath +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ BLAS
+
+
+
+ BLAS +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
Sparse BLAS
+
+
+
+
+ Sparse BLAS +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ DFT
+
+
+
+ DFT +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ RNG
+
+
+
+ RNG +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ LAPACK
+
+
+
+ LAPACK +
+
+
+
+ + + + + + + + +
+
+
Intel + oneMKL
+
+
+
+ Intel + oneMKL +
+
+
+
+ + + + + + + + +
+
+
+
Netlib
+
+
+
+
+ Netlib +
+
+
+
+ + + + + + + + +
+
+
+
generic SYCL
+
+
+
+
+ generic + SYCL +
+
+
+
+ + + + + + + + +
+
+
+
cuBLAS
+
+
+
+
+ cuBLAS +
+
+
+
+ + + + + + + + +
+
+
+
rocBLAS
+
+
+
+
+ + rocBLAS +
+
+
+
+ + + + + + + + +
+
+
x86 + CPU / Intel GPU
+
+
+
+ x86 + CPU / Intel GPU +
+
+
+
+ + + + + + + + +
+
+
x86 + CPU
+
+
+
+ x86 + CPU +
+
+
+
+ + + + + + + + +
+
+
NVIDIA + GPU
+
+
+
+ NVIDIA + GPU +
+
+
+
+ + + + + + + + +
+
+
AMD + GPU
+
+
+
+ AMD + GPU +
+
+
+
+ + + + + + + + +
+
+
Any + SYCL device
+
+
+
+ Any + SYCL device +
+
+
+
+ + + + + + + + +
+
+
Intel + oneMKL
+
+
+
+ Intel + oneMKL +
+
+
+
+ + + + + + + + +
+
+
x86 + CPU / Intel GPU
+
+
+
+ x86 + CPU / Intel GPU +
+
+
+
+ + + + + + + + +
+
+
+
cuSPARSE
+
+
+
+
+ + cuSPARSE +
+
+
+
+ + + + + + + + +
+
+
+
rocSPARSE
+
+
+
+
+ + rocSPARSE +
+
+
+
+ + + + + + + + +
+
+
NVIDIA + GPU
+
+
+
+ NVIDIA + GPU +
+
+
+
+ + + + + + + + +
+
+
AMD + GPU
+
+
+
+ AMD + GPU +
+
+
+
+ + + + + + + + +
+
+
Intel + oneMKL
+
+
+
+ Intel + oneMKL +
+
+
+
+ + + + + + + + +
+
+
x86 + CPU / Intel GPU
+
+
+
+ x86 + CPU / Intel GPU +
+
+
+
+ + + + + + + + +
+
+
+
cuFFT
+
+
+
+
+ cuFFT +
+
+
+
+ + + + + + + + +
+
+
+
rocFFT
+
+
+
+
+ + rocFFT +
+
+
+
+ + + + + + + + +
+
+
NVIDIA + GPU
+
+
+
+ NVIDIA + GPU +
+
+
+
+ + + + + + + + +
+
+
AMD + GPU
+
+
+
+ AMD + GPU +
+
+
+
+ + + + + + + + +
+
+
+
portFFT
+
+
+
+
+ + portFFT +
+
+
+
+ + + + + + + + +
+
+
Any + SYCL device
+
+
+
+ Any + SYCL device +
+
+
+
+ + + + + + + + +
+
+
Intel + oneMKL
+
+
+
+ Intel + oneMKL +
+
+
+
+ + + + + + + + +
+
+
x86 + CPU / Intel GPU
+
+
+
+ x86 + CPU / Intel GPU +
+
+
+
+ + + + + + + + +
+
+
+
cuRAND
+
+
+
+
+ + cuRAND +
+
+
+
+ + + + + + + + +
+
+
+
rocRAND
+
+
+
+
+ + rocRAND +
+
+
+
+ + + + + + + + +
+
+
NVIDIA + GPU
+
+
+
+ NVIDIA + GPU +
+
+
+
+ + + + + + + + +
+
+
AMD + GPU
+
+
+
+ AMD + GPU +
+
+
+
+ + + + + + + + +
+
+
Intel + oneMKL
+
+
+
+ Intel + oneMKL +
+
+
+
+ + + + + + + + +
+
+
x86 + CPU / Intel GPU
+
+
+
+ x86 + CPU / Intel GPU +
+
+
+
+ + + + + + + + +
+
+
+
cuSOLVER
+
+
+
+
+ + cuSOLVER +
+
+
+
+ + + + + + + + +
+
+
+
rocSOLVER
+
+
+
+
+ + rocSOLVER +
+
+
+
+ + + + + + + + +
+
+
NVIDIA + GPU
+
+
+
+ NVIDIA + GPU +
+
+
+
+ + + + + + + + +
+
+
AMD + GPU
+
+
+
+ AMD + GPU +
+
+
+
+ + + + + + + + +
+
+
+
Vector Math
and Statistics
domains not yet
implemented
+
+
+
+
+ Vector Math and Statistics domains not yet implemented +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/Lesson_Materials/common-revealjs/images/uxl.svg b/Lesson_Materials/common-revealjs/images/uxl.svg new file mode 100644 index 00000000..10ccd074 --- /dev/null +++ b/Lesson_Materials/common-revealjs/images/uxl.svg @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lesson_Materials/oneMath_gemm/index.html b/Lesson_Materials/oneMath_gemm/index.html new file mode 100644 index 00000000..44e278d7 --- /dev/null +++ b/Lesson_Materials/oneMath_gemm/index.html @@ -0,0 +1,208 @@ + + + + + + + + + + + + + +
+
+
+ + + + +
+ +
+

+ oneAPI Math Library (oneMath) +

+
+ +
+ ## Learning Objectives + * Learn what the oneMath is and how it works + * Learn how to use GEMM APIs from oneMath with both USM and buffer memory models +
+ +
+
+ ## Do you need to write your own kernels? +
+ +
+ * Many computationally intensive applications spend the most of their time in **common operations / algorithms** + * **Numerical libraries** provide reliable solutions to these common problems + * You can focus on solving higher-level problems instead of technical details + * Libraries optimised for specific hardware provide **superior performance** +
+
+ +
+
+ ## Numerical libraries +
+ +
+ * Common APIs like BLAS or LAPACK have multiple CPU implementations and vendor-specific GPU solutions + * **Intel CPU/GPU**: Intel Math Kernels Library (oneMKL) + * **NVIDIA GPU**: cuBLAS, cuSOLVER, cuRAND, cuFFT + * **AMD GPU**: rocBLAS, rocSOLVER, rocRAND, rocFFT + * Imagine being able to use all of them with *single source code* → **oneMath** +
+
+ +
+
+

+ oneAPI and oneMath +

+
+
+ * Open-source [**oneAPI**](https://oneapi.io/) project governed by the [United Acceleration (UXL) Foundation](https://uxlfoundation.org/): + * defines SYCL-based APIs and provides library implementations + * brings performance and ease of development to SYCL applications + * [**oneMath** specification](https://oneapi-spec.uxlfoundation.org/specifications/oneapi/latest/elements/onemath/source/): + * defines SYCL API for numerical computations across several domains + * Linear Algebra, Discrete Fourier Transforms, Random Number Generators, Statistics, Vector Math + * [**oneMath** library](https://github.com/uxlfoundation/oneMath): + * wrapper implementation dispatching SYCL API calls to a multitude of implementations, both generic and vendor-specific +
+
+ +
+ +
+
+ +
+

+ oneMath library backends +

+ +
+ +
+
+ #### Run-time dispatching +
+
+

+#include <oneapi/math.hpp>
+
+sycl::queue q{myDeviceSelector};
+
+sycl::buffer<T,1> a{a_host, m*k};
+sycl::buffer<T,1> b{b_host, k*n};
+sycl::buffer<T,1> c{c_host, m*n};
+
+// Compute C = A*B+C on the device
+oneapi::math::blas::column_major::gemm(q, ..., m, n, k, ..., a, ..., b, ..., c, ... );
+						
+
+
+ * Backend is loaded at run time based on the device associated with the SYCL queue + * Both buffer and USM APIs available (mind the different synchronisation) + * The same binary can run on different hardware with a generic device selector + * Can run on CPU or different GPUs without recompiling + * Link the application with the top-level runtime library: `-lonemath` +
+
+ +
+
+ #### Compile-time dispatching +
+
+

+#include <oneapi/math.hpp>
+
+sycl::queue cpu_queue{sycl::cpu_selector_v};
+
+sycl::buffer<T,1> a{a_host, m*k};
+sycl::buffer<T,1> b{b_host, k*n};
+sycl::buffer<T,1> c{c_host, m*n};
+
+oneapi::math::backend_selector<oneapi::math::backend::mklcpu> cpu_selector(cpu_queue);
+// Select the Intel oneMKL CPU backend specifically ^^^^^^
+
+oneapi::math::blas::column_major::gemm(cpu_selector, ..., m, n, k, ..., a, ..., b, ..., c, ... );
+						
+
+
+ * Specific backend can be selected at compile-time with a `backend_selector` + * Passed into the API in place of the queue + * Reduces the small dispatching overhead at the cost of removed portability + * Link the application with the specific backend library: `-lonemath_blas_mklcpu` +
+
+ +
+
+ ## Exercise +
+
+ * Objectives: Learn to use oneMath GEMM buffer and USM APIs + * Boiler-plate code already provided to: + * Initialize matrices on host + * Compute reference result on host + * Compare the host and device results + * Please **complete the TODO tasks** marked in the `source_*.cpp` + * Create buffers or transfer data with USM + * Compute GEMM by calling the oneMath API + * Use the provided `VerifyResult` function + * If stuck, have a look at `solution_*.cpp` +
+
+
+
+ + + + + + + +