diff --git a/.flake8 b/.flake8
deleted file mode 100644
index 1dbc217..0000000
--- a/.flake8
+++ /dev/null
@@ -1,5 +0,0 @@
-[flake8]
-    ignore = E203, E266, E501, W503, F403, F401
-    max-line-length = 89
-    max-complexity = 18
-    select = B,C,E,F,W,T4,B9
diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml
deleted file mode 100644
index 7e3da00..0000000
--- a/.github/workflows/gh-pages.yml
+++ /dev/null
@@ -1,114 +0,0 @@
-name: github pages
-
-# Declare default permissions as read only.
-permissions: read-all
-
-on:
-  push:
-    branches:
-      - main
-  pull_request:
-    types: [opened, synchronize, reopened, closed]
-
-jobs:
-  main:
-    if: ${{ !(github.event.pull_request && github.event.action == 'closed') }}
-    runs-on: ubuntu-latest
-    defaults:
-      run:
-        shell: bash -el {0}
-
-    steps:
-      - uses: actions/checkout@v2
-        with:
-          fetch-depth: 0
-
-      - name: Setup conda
-        uses: conda-incubator/setup-miniconda@v2
-        with:
-          auto-update-conda: true
-          run-post: false
-          miniforge-variant: Mambaforge
-          miniforge-version: latest
-          environment-file: environment.yml
-
-      - name: Conda info
-        run: |
-          conda info
-          conda list
-
-      - name: Sphinx
-        run: |
-          cd docs
-          make html
-
-      - name: GitHub Pages [main]
-        uses: peaceiris/actions-gh-pages@v3
-        if: ${{ github.ref == 'refs/heads/main' }}
-        with:
-          github_token: ${{ secrets.GITHUB_TOKEN }}
-          publish_dir: ./docs/_build/html/
-          destination_dir: ./main
-          allow_empty_commit : true
-          commit_message: ${{ github.event.head_commit.message }}
-          publish_branch: gh-pages
-          user_name: 'github-actions[bot]'
-          user_email: 'github-actions[bot]@users.noreply.github.com'
-
-      - name: GitHub Pages [PR]
-        uses: peaceiris/actions-gh-pages@v3
-        if: ${{ github.event.pull_request && github.event.action != 'closed' }}
-        with:
-          github_token: ${{ secrets.GITHUB_TOKEN }}
-          publish_dir: ./docs/_build/html/
-          destination_dir: ./pull/${{ github.event.number }}
-          allow_empty_commit : true
-          commit_message: ${{ github.event.head_commit.message }}
-          publish_branch: gh-pages
-          user_name: 'github-actions[bot]'
-          user_email: 'github-actions[bot]@users.noreply.github.com'
-
-      - name: Comment PR [docs created]
-        if: ${{ github.event.pull_request && github.event.action != 'closed' }}
-        env:
-          PR_NUM: ${{ github.event.number }}
-        uses: mshick/add-pr-comment@v1
-        with:
-          message: |
-            Documentation preview: [show](https://intelpython.github.io/DPEP/pull/${{ env.PR_NUM }}).
-          repo-token: ${{ secrets.GITHUB_TOKEN }}
-          repo-token-user-login: 'github-actions[bot]'
-          allow-repeats: true
-
-  clean:
-    if: ${{ github.event.pull_request && github.event.action == 'closed' }}
-    runs-on: ubuntu-latest
-
-    steps:
-      - uses: actions/checkout@v2
-        with:
-          fetch-depth: 0
-
-      - name: GitHub Pages [PR closed]
-        env:
-          PR_NUM: ${{ github.event.number }}
-        shell: bash -l {0}
-        run: |
-          git remote add tokened_docs https://IntelPython:${{ secrets.GITHUB_TOKEN }}@github.com/IntelPython/DPEP.git
-          git fetch tokened_docs
-          git checkout --track tokened_docs/gh-pages
-          echo `pwd`
-          [ -d pull/${PR_NUM} ] && git rm -rf pull/${PR_NUM}
-          git config --global user.name 'github-actions[bot]'
-          git config --global user.email 'github-actions[bot]@users.noreply.github.com'
-          git commit -m "Removing docs for closed pull request ${PR_NUM}"
-          git push tokened_docs gh-pages
-
-      - name: Comment PR [docs removed]
-        uses: mshick/add-pr-comment@v1
-        with:
-          message: |
-            Documentation preview removed.
-          repo-token: ${{ secrets.GITHUB_TOKEN }}
-          repo-token-user-login: 'github-actions[bot]'
-          allow-repeats: true
diff --git a/.github/workflows/gol_build_test_upload.yml b/.github/workflows/gol_build_test_upload.yml
deleted file mode 100644
index 32583a8..0000000
--- a/.github/workflows/gol_build_test_upload.yml
+++ /dev/null
@@ -1,342 +0,0 @@
-name: gol package
-
-# Declare default permissions as read only.
-permissions: read-all
-
-on:
-  push:
-    branches:
-      - main
-  pull_request:
-
-env:
-  PACKAGE_NAME: game-of-life-demo
-  MODULE_NAME: game_of_life_demo
-
-jobs:
-  build_linux:
-    runs-on: ubuntu-20.04
-
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-
-      - name: Set pkgs_dirs
-        run: |
-          echo "pkgs_dirs: [~/.conda/pkgs]" >> ~/.condarc
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 4  # Increase to reset cache
-        with:
-          path: ~/.conda/pkgs
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Add conda to system path
-        run: echo $CONDA/bin >> $GITHUB_PATH
-      - name: Install conda-build
-        run: conda install conda-build -c conda-forge --override-channels
-      - name: Build conda package
-        run: |
-          CHANNELS="-c dppy/label/dev -c intel -c conda-forge --override-channels"
-          VERSIONS="--python ${{ matrix.python }}"
-          TEST="--no-test"
-          cd ./demos/game-of-life
-          conda build \
-            $TEST \
-            $VERSIONS \
-            $CHANNELS \
-            conda-recipe
-      - name: Upload artifact
-        uses: actions/upload-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-          path: /usr/share/miniconda/conda-bld/linux-64/${{ env.PACKAGE_NAME }}-*.tar.bz2
-
-  build_windows:
-    runs-on: windows-latest
-
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    env:
-      conda-bld: C:\Miniconda\conda-bld\win-64\
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          use-only-tar-bz2: false
-          auto-activate-base: true
-          conda-build-version: "*"
-          activate-environment: true
-          python-version: ${{ matrix.python }}
-
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 4  # Increase to reset cache
-        with:
-          path: /home/runner/conda_pkgs_dir
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Build conda package
-        run: |
-          cd ./demos/game-of-life
-          conda build --keep-old-work --dirty --no-test --python ${{ matrix.python }} -c dppy/label/dev -c intel -c conda-forge --override-channels conda-recipe
-      - name: Upload artifact
-        uses: actions/upload-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-          path: ${{ env.conda-bld }}${{ env.PACKAGE_NAME }}-*.tar.bz2
-
-  test_linux:
-    needs: build_linux
-    runs-on:  ${{ matrix.runner }}
-
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-        experimental: [false]
-        runner: [ubuntu-20.04]
-    continue-on-error: ${{ matrix.experimental }}
-    env:
-      CHANNELS: -c dppy/label/dev -c intel -c conda-forge --override-channels
-
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-      - name: Add conda to system path
-        run: echo $CONDA/bin >> $GITHUB_PATH
-      - name: Install conda-build
-        # Needed to be able to run conda index
-        run: conda install conda-build -c conda-forge --override-channels
-      - name: Create conda channel
-        run: |
-          mkdir -p $GITHUB_WORKSPACE/channel/linux-64
-          conda index $GITHUB_WORKSPACE/channel || exit 1
-          mv ${PACKAGE_NAME}-*.tar.bz2 $GITHUB_WORKSPACE/channel/linux-64 || exit 1
-          conda index $GITHUB_WORKSPACE/channel || exit 1
-          # Test channel
-          conda search $PACKAGE_NAME -c $GITHUB_WORKSPACE/channel --override-channels --info --json > $GITHUB_WORKSPACE/ver.json
-          cat ver.json
-      - name: Collect dependencies
-        run: |
-          CHANNELS="-c $GITHUB_WORKSPACE/channel ${{ env.CHANNELS }}"
-          conda create -n test-env $PACKAGE_NAME python=${{ matrix.python }} $CHANNELS --only-deps --dry-run > lockfile
-          cat lockfile
-      - name: Set pkgs_dirs
-        run: |
-          echo "pkgs_dirs: [~/.conda/pkgs]" >> ~/.condarc
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 4  # Increase to reset cache
-        with:
-          path: ~/.conda/pkgs
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Install package
-        run: |
-          export CHANNELS="-c $GITHUB_WORKSPACE/channel ${{ env.CHANNELS }}"
-          conda create -n test-env $PACKAGE_NAME ${TEST_DEPENDENCIES} python=${{ matrix.python }} ${CHANNELS}
-          . $CONDA/etc/profile.d/conda.sh
-          conda activate test-env
-          pip install pytest-mock
-          # Test installed packages
-          conda list -n test-env
-      - name: Run tests (numpy)
-        run: |
-          . $CONDA/etc/profile.d/conda.sh
-          conda activate test-env
-          export OCL_ICD_FILENAMES=libintelocl.so
-          pytest ./demos/game-of-life/game_of_life_demo --variant numpy
-      - name: Run tests (dpnp)
-        run: |
-          . $CONDA/etc/profile.d/conda.sh
-          conda activate test-env
-          export OCL_ICD_FILENAMES=libintelocl.so
-          pytest ./demos/game-of-life/game_of_life_demo --variant dpnp
-      - name: Run tests (numba parallel)
-        run: |
-          . $CONDA/etc/profile.d/conda.sh
-          conda activate test-env
-          export OCL_ICD_FILENAMES=libintelocl.so
-          pytest ./demos/game-of-life/game_of_life_demo --variant numba --parallel
-      - name: Run tests (numba no-parallel)
-        run: |
-          . $CONDA/etc/profile.d/conda.sh
-          conda activate test-env
-          export OCL_ICD_FILENAMES=libintelocl.so
-          pytest ./demos/game-of-life/game_of_life_demo --variant numba --no-parallel
-
-  test_windows:
-    needs: build_windows
-    runs-on:  ${{ matrix.runner }}
-    defaults:
-      run:
-        shell: cmd /C CALL {0}
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-        experimental: [false]
-        runner: [windows-latest]
-    continue-on-error: ${{ matrix.experimental }}
-    env:
-      workdir: '${{ github.workspace }}'
-      CHANNELS: -c dppy/label/dev -c intel -c conda-forge --override-channels
-    steps:
-      - name: Checkout sources
-        uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          use-only-tar-bz2: false
-          auto-update-conda: true
-          conda-build-version: '*'
-          miniconda-version: 'latest'
-          activate-environment: test-env
-          python-version: ${{ matrix.python }}
-      - name: Create conda channel with the artifact bit
-        shell: cmd /C CALL {0}
-        run: |
-          echo ${{ env.workdir }}
-          mkdir ${{ env.workdir }}\channel\win-64
-          move ${{ env.PACKAGE_NAME }}-*.tar.bz2 ${{ env.workdir }}\channel\win-64
-          dir ${{ env.workdir }}\channel\win-64
-      - name: Index the channel
-        shell: cmd /C CALL {0}
-        run: conda index ${{ env.workdir }}\channel
-
-      - name: Dump package version info from created channel into ver.json
-        shell: cmd /C CALL {0}
-        run: |
-          conda search ${{ env.PACKAGE_NAME }} -c ${{ env.workdir }}/channel --override-channels --info --json > ${{ env.workdir }}\ver.json
-      - name: Output content of produced ver.json
-        shell: pwsh
-        run: Get-Content -Path ${{ env.workdir }}\ver.json
-      - name: Collect dependencies
-        shell: cmd /C CALL {0}
-        run: |
-          conda install -n test-env ${{ env.PACKAGE_NAME }} python=${{ matrix.python }} -c ${{ env.workdir }}/channel ${{ env.CHANNELS }} --only-deps --dry-run > lockfile && conda activate test-env && pip install pytest-mock
-      - name: Display lockfile content
-        shell: pwsh
-        run: Get-Content -Path .\lockfile
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 4  # Increase to reset cache
-        with:
-          path: /home/runner/conda_pkgs_dir
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Install opencl_rt
-        shell: cmd /C CALL {0}
-        run: conda install -n test-env opencl_rt -c intel --override-channels
-      - name: Install dependencies
-        shell: cmd /C CALL {0}
-        run: |
-          SET "TEST_DEPENDENCIES=pytest pytest-cov"
-          conda install -n test-env ${{ env.PACKAGE_NAME }} %TEST_DEPENDENCIES% python=${{ matrix.python }} -c ${{ env.workdir }}/channel ${{ env.CHANNELS }}
-      - name: Configure Intel OpenCL CPU RT
-        shell: pwsh
-        run: |
-          $script_path="$env:CONDA_PREFIX\Scripts\set-intel-ocl-icd-registry.ps1"
-          &$script_path
-          # Check the variable assisting OpenCL CPU driver to find TBB DLLs which are not located where it expects them by default
-          $cl_cfg="$env:CONDA_PREFIX\Library\lib\cl.cfg"
-          Get-Content -Tail 5 -Path $cl_cfg
-          cd ./demos/game-of-life
-      - name: Run tests (numpy)
-        shell: cmd /C CALL {0}
-        run: >-
-          conda activate test-env && pytest ./demos/game-of-life/game_of_life_demo --variant numpy
-      - name: Run tests (dpnp)
-        shell: cmd /C CALL {0}
-        run: >-
-          conda activate test-env && pytest ./demos/game-of-life/game_of_life_demo --variant dpnp
-      - name: Run tests (numba no-parallel)
-        shell: cmd /C CALL {0}
-        run: >-
-          conda activate test-env && pytest ./demos/game-of-life/game_of_life_demo  --variant numba --no-parallel
-      - name: Run tests (numba parallel)
-        shell: cmd /C CALL {0}
-        run: >-
-          conda activate test-env && pytest ./demos/game-of-life/game_of_life_demo  --variant numba --parallel
-
-
-  upload_linux:
-    needs: test_linux
-    if: ${{github.ref == 'refs/heads/main' || (startsWith(github.ref, 'refs/heads/release') == true) || github.event_name == 'push' && contains(github.ref, 'refs/tags/')}}
-    runs-on: ubuntu-20.04
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    steps:
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-
-      - name: Install anaconda-client
-        run: conda install anaconda-client -c conda-forge --override-channels
-      - name: Add conda to system path
-        run: echo $CONDA/bin >> $GITHUB_PATH
-
-      - name: Upload
-        env:
-          ANACONDA_TOKEN: ${{ secrets.PYCODDIYTOKEN }}
-        run: |
-          anaconda --token $ANACONDA_TOKEN upload --user pycoddiy --label main ${PACKAGE_NAME}-*.tar.bz2
-
-  upload_windows:
-    needs: test_windows
-    if: ${{github.ref == 'refs/heads/main' || (startsWith(github.ref, 'refs/heads/release') == true) || github.event_name == 'push' && contains(github.ref, 'refs/tags/')}}
-    runs-on: windows-latest
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    steps:
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          auto-activate-base: true
-          activate-environment: ""
-      - name: Install anaconda-client
-        run: conda install anaconda-client -c conda-forge --override-channels
-
-      - name: Upload
-        env:
-          ANACONDA_TOKEN: ${{ secrets.PYCODDIYTOKEN }}
-        run: |
-          anaconda --token ${{ env.ANACONDA_TOKEN }} upload --user pycoddiy --label main ${{ env.PACKAGE_NAME }}-*.tar.bz2
diff --git a/.github/workflows/mandelbrot_build_test_deploy.yml b/.github/workflows/mandelbrot_build_test_deploy.yml
deleted file mode 100644
index b13d638..0000000
--- a/.github/workflows/mandelbrot_build_test_deploy.yml
+++ /dev/null
@@ -1,309 +0,0 @@
-name: mandelbrot package
-
-# Declare default permissions as read only.
-permissions: read-all
-
-on:
-  push:
-    branches:
-      - main
-  pull_request:
-
-env:
-  PACKAGE_NAME: mandelbrot-demo
-  MODULE_NAME: mandelbrot_demo
-
-jobs:
-  build_linux:
-    runs-on: ubuntu-20.04
-
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-
-      - name: Set pkgs_dirs
-        run: |
-          echo "pkgs_dirs: [~/.conda/pkgs]" >> ~/.condarc
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 0  # Increase to reset cache
-        with:
-          path: ~/.conda/pkgs
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Add conda to system path
-        run: echo $CONDA/bin >> $GITHUB_PATH
-      - name: Install conda-build
-        run: conda install conda-build -c conda-forge --override-channels
-      - name: Build conda package
-        run: |
-          CHANNELS="-c dppy/label/dev -c intel -c conda-forge --override-channels"
-          VERSIONS="--python ${{ matrix.python }}"
-          TEST=""
-          cd ./demos/mandelbrot
-          conda build $TEST $VERSIONS $CHANNELS conda-recipe
-      - name: Upload artifact
-        uses: actions/upload-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-          path: /usr/share/miniconda/conda-bld/linux-64/${{ env.PACKAGE_NAME }}-*.tar.bz2
-
-  test_linux:
-    needs: build_linux
-    runs-on:  ${{ matrix.runner }}
-
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-        experimental: [true]
-        runner: [ubuntu-20.04]
-    continue-on-error: ${{ matrix.experimental }}
-    env:
-      CHANNELS: -c dppy/label/dev -c intel -c conda-forge --override-channels
-
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-      - name: Add conda to system path
-        run: echo $CONDA/bin >> $GITHUB_PATH
-      - name: Install conda-build
-        # Needed to be able to run conda index
-        run: conda install conda-build -c conda-forge --override-channels
-      - name: Create conda channel
-        run: |
-          mkdir -p $GITHUB_WORKSPACE/channel/linux-64
-          # conda index $GITHUB_WORKSPACE/channel || exit 1
-          mv ${PACKAGE_NAME}-*.tar.bz2 $GITHUB_WORKSPACE/channel/linux-64 || exit 1
-          conda index $GITHUB_WORKSPACE/channel || exit 1
-          # Test channel
-          conda search $PACKAGE_NAME -c $GITHUB_WORKSPACE/channel --override-channels --info --json > $GITHUB_WORKSPACE/ver.json
-          cat ver.json
-      - name: Collect dependencies
-        run: |
-          CHANNELS="-c $GITHUB_WORKSPACE/channel ${{ env.CHANNELS }}"
-          conda create -n test-env $PACKAGE_NAME python=${{ matrix.python }} $CHANNELS --only-deps --dry-run > lockfile
-          cat lockfile
-      - name: Set pkgs_dirs
-        run: |
-          echo "pkgs_dirs: [~/.conda/pkgs]" >> ~/.condarc
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 0  # Increase to reset cache
-        with:
-          path: ~/.conda/pkgs
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Install package
-        run: |
-          export CHANNELS="-c $GITHUB_WORKSPACE/channel ${{ env.CHANNELS }}"
-          conda create -n test-env $PACKAGE_NAME pytest python=${{ matrix.python }} ${CHANNELS}
-          . $CONDA/etc/profile.d/conda.sh
-          conda activate test-env
-          # Test installed packages
-          conda list -n test-env
-      - name: Run tests
-        run: |
-          . $CONDA/etc/profile.d/conda.sh
-          conda activate test-env
-          pushd ./demos/mandelbrot/${{ env.MODULE_NAME }}
-          pytest
-          popd
-
-  upload_linux:
-    needs: test_linux
-    if: ${{github.ref == 'refs/heads/main' || (startsWith(github.ref, 'refs/heads/release') == true) || github.event_name == 'push' && contains(github.ref, 'refs/tags/')}}
-    runs-on: ubuntu-20.04
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    steps:
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-
-      - name: Install anaconda-client
-        run: conda install anaconda-client -c conda-forge --override-channels
-      - name: Add conda to system path
-        run: echo $CONDA/bin >> $GITHUB_PATH
-
-      - name: Upload
-        env:
-          ANACONDA_TOKEN: ${{ secrets.PYCODDIYTOKEN }}
-        run: |
-          anaconda --token ${{ env.ANACONDA_TOKEN }} upload --user pycoddiy --label main ${PACKAGE_NAME}-*.tar.bz2
-
-  build_windows:
-    runs-on: windows-latest
-
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    env:
-      conda-bld: C:\Miniconda\conda-bld\win-64\
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          use-only-tar-bz2: true
-          auto-activate-base: true
-          conda-build-version: "*"
-          activate-environment: true
-          python-version: ${{ matrix.python }}
-
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 0  # Increase to reset cache
-        with:
-          path: /home/runner/conda_pkgs_dir
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Build conda package
-        run: |
-          cd ./demos/mandelbrot
-          conda build --keep-old-work --dirty --no-test --python ${{ matrix.python }} -c dppy/label/dev -c intel -c conda-forge --override-channels conda-recipe
-      - name: Upload artifact
-        uses: actions/upload-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-          path: ${{ env.conda-bld }}${{ env.PACKAGE_NAME }}-*.tar.bz2
-
-  test_windows:
-    needs: build_windows
-    runs-on:  ${{ matrix.runner }}
-    defaults:
-      run:
-        shell: cmd /C CALL {0}
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-        experimental: [false]
-        runner: [windows-latest]
-    continue-on-error: ${{ matrix.experimental }}
-    env:
-      workdir: '${{ github.workspace }}'
-      CHANNELS: -c dppy/label/dev -c intel -c conda-forge --override-channels
-    steps:
-      - name: Checkout sources
-        uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          use-only-tar-bz2: false
-          auto-update-conda: true
-          conda-build-version: '*'
-          miniconda-version: 'latest'
-          activate-environment: test-env
-          python-version: ${{ matrix.python }}
-      - name: conda info
-        shell: cmd /C CALL {0}
-        run: |
-          conda info
-      - name: conda config --show
-        shell: cmd /C CALL {0}
-        run: |
-          conda config --show
-      - name: Create conda channel with the artifact bit
-        shell: cmd /C CALL {0}
-        run: |
-          echo ${{ env.workdir }}
-          mkdir ${{ env.workdir }}\channel\win-64
-          move ${{ env.PACKAGE_NAME }}-*.tar.bz2 ${{ env.workdir }}\channel\win-64
-          dir ${{ env.workdir }}\channel\win-64
-      - name: Index the channel
-        shell: cmd /C CALL {0}
-        run: conda index ${{ env.workdir }}\channel
-      - name: Collect dependencies
-        shell: cmd /C CALL {0}
-        run: |
-          conda install -n test-env ${{ env.PACKAGE_NAME }} python=${{ matrix.python }} -c ${{ env.workdir }}/channel ${{ env.CHANNELS }} --only-deps --dry-run > lockfile && conda activate test-env
-      - name: Display lockfile content
-        shell: pwsh
-        run: Get-Content -Path .\lockfile
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 0  # Increase to reset cache
-        with:
-          path: /home/runner/conda_pkgs_dir
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Install dependencies
-        shell: cmd /C CALL {0}
-        run: |
-          conda install -n test-env ${{ env.PACKAGE_NAME }} pytest python=${{ matrix.python }} -c ${{ env.workdir }}/channel ${{ env.CHANNELS }}
-      - name: Install opencl_rt
-        shell: cmd /C CALL {0}
-        run: conda install -n test-env opencl_rt -c intel --override-channels
-      - name: Configure Intel OpenCL CPU RT
-        shell: pwsh
-        run: |
-          $script_path="$env:CONDA_PREFIX\Scripts\set-intel-ocl-icd-registry.ps1"
-          &$script_path
-          # Check the variable assisting OpenCL CPU driver to find TBB DLLs which are not located where it expects them by default
-          $cl_cfg="$env:CONDA_PREFIX\Library\lib\cl.cfg"
-          Get-Content -Tail 5 -Path $cl_cfg
-      - name: Run tests
-        shell: pwsh
-        run: |
-          ls
-          conda activate test-env
-          pushd ./demos/mandelbrot/${{ env.MODULE_NAME }}
-          pytest
-          popd
-
-  upload_windows:
-    needs: test_windows
-    if: ${{github.ref == 'refs/heads/main' || (startsWith(github.ref, 'refs/heads/release') == true) || github.event_name == 'push' && contains(github.ref, 'refs/tags/')}}
-    runs-on: windows-latest
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    steps:
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          auto-activate-base: true
-          activate-environment: ""
-      - name: Install anaconda-client
-        run: conda install anaconda-client -c conda-forge --override-channels
-
-      - name: Upload
-        env:
-          ANACONDA_TOKEN: ${{ secrets.PYCODDIYTOKEN }}
-        run: |
-          anaconda --token ${{ env.ANACONDA_TOKEN }} upload --user pycoddiy --label main ${{ env.PACKAGE_NAME }}-*.tar.bz2
diff --git a/.github/workflows/mcpi_build_test_upload.yml b/.github/workflows/mcpi_build_test_upload.yml
deleted file mode 100644
index ab888be..0000000
--- a/.github/workflows/mcpi_build_test_upload.yml
+++ /dev/null
@@ -1,313 +0,0 @@
-name: mcpi package
-
-# Declare default permissions as read only.
-permissions: read-all
-
-on:
-  push:
-    branches:
-      - main
-  pull_request:
-
-env:
-  PACKAGE_NAME: mcpi-demo
-  MODULE_NAME: mcpi_demo
-
-jobs:
-  build_linux:
-    runs-on: ubuntu-20.04
-
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-
-      - name: Set pkgs_dirs
-        run: |
-          echo "pkgs_dirs: [~/.conda/pkgs]" >> ~/.condarc
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 0  # Increase to reset cache
-        with:
-          path: ~/.conda/pkgs
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Add conda to system path
-        run: echo $CONDA/bin >> $GITHUB_PATH
-      - name: Install conda-build
-        run: conda install conda-build -c conda-forge --override-channels
-      - name: Build conda package
-        run: |
-          CHANNELS="-c intel -c main --override-channels"
-          VERSIONS="--python ${{ matrix.python }}"
-          TEST=""
-          ls
-          cd ./demos/mcpi
-          conda build $TEST $VERSIONS $CHANNELS conda-recipe
-      - name: Upload artifact
-        uses: actions/upload-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-          path: /usr/share/miniconda/conda-bld/linux-64/${{ env.PACKAGE_NAME }}-*.tar.bz2
-
-  test_linux:
-    needs: build_linux
-    runs-on:  ${{ matrix.runner }}
-
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-        experimental: [true]
-        runner: [ubuntu-20.04]
-    continue-on-error: ${{ matrix.experimental }}
-    env:
-      CHANNELS: -c dppy/label/dev -c intel -c main --override-channels
-
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-      - name: Add conda to system path
-        run: echo $CONDA/bin >> $GITHUB_PATH
-      - name: Install conda-build
-        # Needed to be able to run conda index
-        run: conda install conda-build -c conda-forge --override-channels
-      - name: Create conda channel
-        run: |
-          mkdir -p $GITHUB_WORKSPACE/channel/linux-64
-          # conda index $GITHUB_WORKSPACE/channel || exit 1
-          mv ${PACKAGE_NAME}-*.tar.bz2 $GITHUB_WORKSPACE/channel/linux-64 || exit 1
-          conda index $GITHUB_WORKSPACE/channel || exit 1
-          # Test channel
-          conda search $PACKAGE_NAME -c $GITHUB_WORKSPACE/channel --override-channels --info --json > $GITHUB_WORKSPACE/ver.json
-          cat ver.json
-      - name: Collect dependencies
-        run: |
-          CHANNELS="-c $GITHUB_WORKSPACE/channel ${{ env.CHANNELS }}"
-          conda create -n test-env $PACKAGE_NAME python=${{ matrix.python }} $CHANNELS --only-deps --dry-run > lockfile
-          cat lockfile
-      - name: Set pkgs_dirs
-        run: |
-          echo "pkgs_dirs: [~/.conda/pkgs]" >> ~/.condarc
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 0  # Increase to reset cache
-        with:
-          path: ~/.conda/pkgs
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Install package
-        run: |
-          export CHANNELS="-c $GITHUB_WORKSPACE/channel ${{ env.CHANNELS }}"
-          conda create -n test-env $PACKAGE_NAME pytest python=${{ matrix.python }} ${CHANNELS}
-          . $CONDA/etc/profile.d/conda.sh
-          conda activate test-env
-          # Test installed packages
-          conda list -n test-env
-      - name: Run tests
-        run: |
-          . $CONDA/etc/profile.d/conda.sh
-          conda activate test-env
-          pushd ./demos/mcpi/${{ env.MODULE_NAME }}
-          pytest
-          popd
-
-  upload_linux:
-    needs: test_linux
-    if: ${{github.ref == 'refs/heads/main' || (startsWith(github.ref, 'refs/heads/release') == true) || github.event_name == 'push' && contains(github.ref, 'refs/tags/')}}
-    runs-on: ubuntu-20.04
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    steps:
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-
-      - name: Install anaconda-client
-        run: conda install anaconda-client -c conda-forge --override-channels
-      - name: Add conda to system path
-        run: echo $CONDA/bin >> $GITHUB_PATH
-
-      - name: Upload
-        env:
-          ANACONDA_TOKEN: ${{ secrets.PYCODDIYTOKEN }}
-        run: |
-          anaconda --token ${{ env.ANACONDA_TOKEN }} upload --user pycoddiy --label main ${PACKAGE_NAME}-*.tar.bz2
-
-  build_windows:
-    runs-on: windows-latest
-
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    env:
-      conda-bld: C:\Miniconda\conda-bld\win-64\
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          use-only-tar-bz2: true
-          auto-activate-base: true
-          conda-build-version: "*"
-          activate-environment: true
-          python-version: ${{ matrix.python }}
-
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 0  # Increase to reset cache
-        with:
-          path: /home/runner/conda_pkgs_dir
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Build conda package
-        run: |
-          cd ./demos/mcpi
-          conda build --keep-old-work --dirty --no-test --python ${{ matrix.python }} -c intel -c main --override-channels conda-recipe
-      - name: Upload artifact
-        uses: actions/upload-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-          path: ${{ env.conda-bld }}${{ env.PACKAGE_NAME }}-*.tar.bz2
-
-  test_windows:
-    needs: build_windows
-    runs-on:  ${{ matrix.runner }}
-    defaults:
-      run:
-        shell: cmd /C CALL {0}
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-        experimental: [false]
-        runner: [windows-latest]
-    continue-on-error: ${{ matrix.experimental }}
-    env:
-      workdir: '${{ github.workspace }}'
-      CHANNELS: -c dppy/label/dev -c intel -c main --override-channels
-    steps:
-      - name: Checkout sources
-        uses: actions/checkout@v3
-        with:
-          fetch-depth: 0
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          use-only-tar-bz2: false
-          auto-update-conda: true
-          conda-build-version: '*'
-          miniconda-version: 'latest'
-          activate-environment: test-env
-          python-version: ${{ matrix.python }}
-      - name: conda info
-        shell: cmd /C CALL {0}
-        run: |
-          conda info
-      - name: conda config --show
-        shell: cmd /C CALL {0}
-        run: |
-          conda config --show
-      - name: Create conda channel with the artifact bit
-        shell: cmd /C CALL {0}
-        run: |
-          echo ${{ env.workdir }}
-          mkdir ${{ env.workdir }}\channel\win-64
-          move ${{ env.PACKAGE_NAME }}-*.tar.bz2 ${{ env.workdir }}\channel\win-64
-          dir ${{ env.workdir }}\channel\win-64
-      - name: Index the channel
-        shell: cmd /C CALL {0}
-        run: conda index ${{ env.workdir }}\channel
-      - name: Collect dependencies
-        shell: cmd /C CALL {0}
-        run: |
-          conda install -n test-env ${{ env.PACKAGE_NAME }} python=${{ matrix.python }} -c ${{ env.workdir }}/channel ${{ env.CHANNELS }} --only-deps --dry-run > lockfile && conda activate test-env
-      - name: Display lockfile content
-        shell: pwsh
-        run: Get-Content -Path .\lockfile
-      - name: Cache conda packages
-        uses: actions/cache@v3
-        env:
-          CACHE_NUMBER: 0  # Increase to reset cache
-        with:
-          path: /home/runner/conda_pkgs_dir
-          key:
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
-          restore-keys: |
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
-            ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
-      - name: Install dependencies
-        shell: cmd /C CALL {0}
-        run: |
-          conda install -n test-env ${{ env.PACKAGE_NAME }} pytest python=${{ matrix.python }} -c ${{ env.workdir }}/channel ${{ env.CHANNELS }}
-      - name: Install opencl_rt
-        shell: cmd /C CALL {0}
-        run: conda install -n test-env opencl_rt -c intel --override-channels
-      - name: Configure Intel OpenCL CPU RT
-        shell: pwsh
-        run: |
-          $script_path="$env:CONDA_PREFIX\Scripts\set-intel-ocl-icd-registry.ps1"
-          &$script_path
-          # Check the variable assisting OpenCL CPU driver to find TBB DLLs which are not located where it expects them by default
-          $cl_cfg="$env:CONDA_PREFIX\Library\lib\cl.cfg"
-          Get-Content -Tail 5 -Path $cl_cfg
-      - name: Conda list
-        shell: cmd /C CALL {0}
-        run: conda list -n test-env
-      - name: Run tests
-        shell: pwsh
-        run: |
-          ls
-          conda activate test-env
-          pushd ./demos/mcpi/${{ env.MODULE_NAME }}
-          pytest
-          popd
-
-  upload_windows:
-    needs: test_windows
-    if: ${{github.ref == 'refs/heads/main' || (startsWith(github.ref, 'refs/heads/release') == true) || github.event_name == 'push' && contains(github.ref, 'refs/tags/')}}
-    runs-on: windows-latest
-    strategy:
-      matrix:
-        python: ['3.8', '3.9', '3.10']
-    steps:
-      - name: Download artifact
-        uses: actions/download-artifact@v3
-        with:
-          name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          auto-activate-base: true
-          activate-environment: ""
-      - name: Install anaconda-client
-        run: conda install anaconda-client -c conda-forge --override-channels
-
-      - name: Upload
-        env:
-          ANACONDA_TOKEN: ${{ secrets.PYCODDIYTOKEN }}
-        run: |
-          anaconda --token ${{ env.ANACONDA_TOKEN }} upload --user pycoddiy --label main ${{ env.PACKAGE_NAME }}-*.tar.bz2
diff --git a/.github/workflows/python_style_checks.yml b/.github/workflows/python_style_checks.yml
deleted file mode 100644
index 138394b..0000000
--- a/.github/workflows/python_style_checks.yml
+++ /dev/null
@@ -1,63 +0,0 @@
-# This is a workflow to format Python code with black formatter
-
-name: coding style
-
-# Declare default permissions as read only.
-permissions: read-all
-
-# Controls when the action will run. Triggers the workflow on push or pull request
-# events but only for the master branch
-on:
-  pull_request:
-  push:
-    branches: [main]
-
-# A workflow run is made up of one or more jobs that can run sequentially or in parallel
-jobs:
-  # The isort job sorts all imports in .py, .pyx, .pxd files
-  isort:
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v3
-      - uses: actions/setup-python@v4
-        with:
-          python-version: '3.10'
-      - uses: jamescurtin/isort-action@master
-        with:
-          configuration: "--check-only --profile black --filter-files -sl"
-
-  black:
-    # The type of runner that the job will run on
-    runs-on: ubuntu-latest
-
-    # Steps represent a sequence of tasks that will be executed as part of the job
-    steps:
-      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
-      - uses: actions/checkout@v3
-      # Set up a Python environment for use in actions
-      - uses: actions/setup-python@v4
-        with:
-          python-version: '3.10'
-
-      # Run black code formatter
-      - uses: psf/black@stable
-        with:
-          src: "."
-          options: "--check"
-          version: "22.12.0"
-
-  flake8:
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v3
-    - name: Set up Python
-      uses: actions/setup-python@v4
-      with:
-        python-version: '3.10'
-    - name: Install dependencies
-      run: |
-        python -m pip install --upgrade pip
-        pip install flake8
-    - name: Lint with flake8
-      uses: py-actions/flake8@v2
diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml
deleted file mode 100644
index 34da9bc..0000000
--- a/.github/workflows/scorecard.yml
+++ /dev/null
@@ -1,73 +0,0 @@
-# This workflow uses actions that are not certified by GitHub. They are provided
-# by a third-party and are governed by separate terms of service, privacy
-# policy, and support documentation.
-
-name: Scorecard supply-chain security
-on:
-  # For Branch-Protection check. Only the default branch is supported. See
-  # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
-  branch_protection_rule:
-  # To guarantee Maintained check is occasionally updated. See
-  # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
-  schedule:
-    - cron: '21 1 * * 0'
-  push:
-    branches: [ "main" ]
-
-# Declare default permissions as read only.
-permissions: read-all
-
-jobs:
-  analysis:
-    name: Scorecard analysis
-    runs-on: ubuntu-latest
-    permissions:
-      # Needed to upload the results to code-scanning dashboard.
-      security-events: write
-      # Needed to publish results and get a badge (see publish_results below).
-      id-token: write
-      # Uncomment the permissions below if installing in a private repository.
-      # contents: read
-      # actions: read
-
-    steps:
-      - name: "Checkout code"
-        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
-        with:
-          persist-credentials: false
-
-      - name: "Run analysis"
-        uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1
-        with:
-          results_file: results.sarif
-          results_format: sarif
-          # (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
-          # - you want to enable the Branch-Protection check on a *public* repository, or
-          # - you are installing Scorecard on a *private* repository
-          # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional.
-          # repo_token: ${{ secrets.SCORECARD_TOKEN }}
-
-          # Public repositories:
-          #   - Publish results to OpenSSF REST API for easy access by consumers
-          #   - Allows the repository to include the Scorecard badge.
-          #   - See https://github.com/ossf/scorecard-action#publishing-results.
-          # For private repositories:
-          #   - `publish_results` will always be set to `false`, regardless
-          #     of the value entered here.
-          publish_results: true
-
-      # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
-      # format to the repository Actions tab.
-      # - name: "Upload artifact"
-      #   uses: actions/upload-artifact@97a0fba1372883ab732affbe8f94b823f91727db # v3.pre.node20
-      #   with:
-      #     name: SARIF file
-      #     path: results.sarif
-      #     retention-days: 5
-
-      # # Upload the results to GitHub's code scanning dashboard (optional).
-      # # Commenting out will disable upload of results to your repo's Code Scanning dashboard
-      # - name: "Upload to code-scanning"
-      #   uses: github/codeql-action/upload-sarif@v3
-      #   with:
-      #     sarif_file: results.sarif
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 73a4863..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-
-*.xml
-*.iml
-*.pyc
diff --git a/demos/game-of-life/game_of_life_demo/impl/__init__.py b/.nojekyll
similarity index 100%
rename from demos/game-of-life/game_of_life_demo/impl/__init__.py
rename to .nojekyll
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
deleted file mode 100644
index 8a4eb1e..0000000
--- a/.pre-commit-config.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# See https://pre-commit.com for more information
-# See https://pre-commit.com/hooks.html for more hooks
-repos:
--   repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.3.0
-    hooks:
-    -   id: end-of-file-fixer
-    -   id: trailing-whitespace
--   repo: https://github.com/psf/black
-    rev: 23.1.0
-    hooks:
-    -   id: black
--   repo: https://github.com/pycqa/isort
-    rev: 5.12.0
-    hooks:
-    -   id: isort
-        name: isort (python)
-        args: ["--profile", "black", "--filter-files", "-sl"]
--   repo: https://github.com/pycqa/flake8
-    rev: 3.9.2
-    hooks:
-    -   id: flake8
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 584a142..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Contributing
-
-## Documentation
-
-### Conda environment for documentation
-
-Install miniconda first.
-
-```bash
-conda env create -f environment.yml
-conda activate docs
-```
-
-### Generating documentation
-
-Install Sphinx and plugins:
-```bash
-pip install sphinx autodoc recommonmark sphinx-rtd-theme
-```
-
-Generate HTML:
-```bash
-cd docs
-make html
-```
-
-Run HTTP server:
-```bash
-cd docs/_build/html
-python -m http.server 8000
-```
-
-Don't forget to change the version in `docs/conf.py` before generating.
-```python
-release = "<VERSION>"
-```
-
-Generated documentation will be in `docs/_build/html`.
-
-### Uploading to GitHub Pages
-
-Documentation for GitHub Pages is placed in following branch
-[`gh-pages`](https://github.com/IntelPython/numba-dppy/tree/gh-pages).
-
-Folders:
-- `dev` folder contains current documentation for default branch.
-- `0.12.0` folder and other similar folders contain documentation for releases.
-- `latest` folder is a link to the latest release folder.
-
-Copy generated documentation into corresponding folder and create pull request
-to `gh-pages` branch.
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index bbfb48c..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-BSD 2-Clause License
-
-Copyright (c) 2023, Sergey Maydanov
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
deleted file mode 100644
index 965b1c6..0000000
--- a/README.md
+++ /dev/null
@@ -1,84 +0,0 @@
-![Coding style](https://github.com/IntelPython/DPEP/actions/workflows/python_style_checks.yml/badge.svg?branch=main&event=push)
-![mcpi package](https://github.com/IntelPython/DPEP/actions/workflows/mcpi_build_test_upload.yml/badge.svg?branch=main&event=push)
-![Mandelbrot package](https://github.com/IntelPython/DPEP/actions/workflows/mandelbrot_build_test_deploy.yml/badge.svg?branch=main&event=push)
-![GitHub Pages](https://github.com/IntelPython/DPEP/actions/workflows/gh-pages.yml/badge.svg?branch=main&event=push)
-
-# Data Parallel Extensions for Python*
-
-Data Parallel Extensions for Python* extend numerical Python capabilities beyond CPU and allow even higher performance
-gains on data parallel devices such as GPUs. It consists of three related projects:
-* [**dpnp** – Data Parallel Extensions for Numpy*](https://github.com/IntelPython/dpnp) - a library that implements a subset
-             of Numpy that can be executed on any data parallel device. The subset is a drop-in replacement of core
-             Numpy functions and numerical data types.
-* [**numba-dpex** – Data Parallel Extensions for Numba*](https://github.com/IntelPython/numba-dpex) - extension for Numba
-             compiler that enables programming data parallel devices the same way you program CPU with Numba.
-* [**dpctl** – Data Parallel Control library](https://github.com/IntelPython/dpctl) that provides utilities for device
-              selection, allocation of data on devices, tensor data structure along with Python Array API standard
-              implementation, and support for creation of user-defined data-parallel extensions.
-
-## Learn more
-Read more about [Data Parallel Extensions for Python](https://intelpython.github.io/DPEP/main/)
-
-## Examples
-Examples are located in `./examples`. Their names start with the 2-digit number followed by a descriptive name. You can run examples in any order, however, if
-you are new to **Data Parallel Extensions for Python**, it is recommended to go in the order examples enumerated.
-
-The following command will run the very first example of using **Data Parallel Extensions for Python**
-```
-python ./examples/01-hello_dpnp.py
-```
-## Tutorials
-Jupyter Notebook-based Getting Started tutorials are located in `./notebooks` directory.
-
-To run the tutorial, in the command line prompt type:
-```
-jupyter notebook
-```
-This will print some information about the notebook server in your terminal, including the URL of the web application (by default, `http://localhost:8888`):
-
-```
-
-$ jupyter notebook
-[I 08:58:24.417 NotebookApp] Serving notebooks from local directory: /Users/catherine
-[I 08:58:24.417 NotebookApp] 0 active kernels
-[I 08:58:24.417 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/
-[I 08:58:24.417 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
-```
-
-It will then open your default web browser to this URL.
-
-When the notebook opens in your browser, you will see the **Notebook Dashboard**, which will show a list of the notebooks, files, and subdirectories in the directory where the notebook server was started. Navigate to the notebook of your interest and open it in the dashboard.
-
-For more information please refer to [Jupyter documentation](https://docs.jupyter.org/en/latest/running.html)
-
-## Benchmarks
-Data Parallel Extensions for Python provide a set of [benchmarks](https://github.com/IntelPython/dpbench) illustrating different aspects of implementing the performant code with Data Parallel Extensions for Python.
-Benchmarks represent some real life numerical problem or some important part (kernel) of real life application. Each application/kernel is implemented in several variants (not necessarily all variants):
-- Pure Python: Typically the slowest and used just as a reference implementation
-- `numpy`: Same application/kernel implemented using NumPy library
-- `dpnp`: Modified `numpy` implementation to run on a specific device. You can use `numpy` as a baseline while evaluating the `dpnp` implementation and its performance
-- `numba @njit` array-style: application/kernel implemented using NumPy and compiled with Numba. You can use `numpy` as a baseline when evaluate `numba @njit` array-style implementat and its performance
-- `numba @njit` direct loops (`prange`): Same application/kernel implemented using Numba compiler using direct loops. Sometimes array-style programming is cumbersome and performance inefficient. Using direct loop programming may lead to more readable and performance code. Thus, while evaluating the performance of direct loop implementation it is useful to compare array-style Numba implementation as a baseline
-- `numba-dpex @dpjit` array-style: Modified `numba @njit` array-style implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing `numba-dpex` implementation details and performance. You can also compare it against `dpnp` implementation to see how much extra performance `numba-dpex` can bring when you compile NumPy code for a given device
-- `numba-dpex @dpjit` direct loops (`prange`): Modified `numba @njit` direct loop implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing `numba-dpex` implementation details and performance. You can also compare it against `dpnp` implementation to see how much extra performance `numba-dpex` can bring when you compile NumPy code for a given device
-- `numba-dpex @dpjit` kernel: Kernel-style programming, which is close to `@cuda.jit` programming model used in vanilla Numba
-- `numba-mlir`: Array-style, direct loops and kernel-style implementations for experimental MLIR-based backend for Numba
-- `cupy`: NumPy-like implementation using CuPy to run on CUDA-compatible devices
-- `@cuda.jit`: Kernel-style Numba implementation to run on CUDA-compatible devices
-- Native SYCL: Most applications/kernels also have DPC++ implementation, which can be used to compare performance of above implementations to DPC++ compiled code.
-
-For more details please refer to `dpbench` [documentation](https://github.com/IntelPython/dpbench/blob/main/README.md).
-
-## Demos
-There are several demo applications illustrating the power of the **Data Parallel Extensions for Python**. They are:
-
-- [Monte Carlo Pi](https://github.com/IntelPython/DPEP/tree/main/demos/mcpi>) -
-The Monte Carlo method to estimate the value of $\pi$.
-
-- [Mandelbrot Set](https://github.com/IntelPython/DPEP/tree/main/demos/mandelbrot) -
-Visualization of the breathtaking process of diving in the famous Mandelbrot fractal
-
-- [Game of Life](https://github.com/IntelPython/DPEP/tree/main/demos/game-of-life>) -
-Visualization of the life evolution using famous Conway's model
-
-For more details please refer to the documentation located in the individual demo directory.
diff --git a/SECURITY.md b/SECURITY.md
deleted file mode 100644
index 373608b..0000000
--- a/SECURITY.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Security Policy
-Intel is committed to rapidly addressing security vulnerabilities affecting our customers and providing clear guidance on the solution, impact, severity and mitigation.
-
-## Reporting a Vulnerability
-Please report any security vulnerabilities in this project utilizing the guidelines [here](https://www.intel.com/content/www/us/en/security-center/vulnerability-handling-guidelines.html).
diff --git a/demos/game-of-life/README.md b/demos/game-of-life/README.md
deleted file mode 100644
index bef9fcd..0000000
--- a/demos/game-of-life/README.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Conway's Game Of Life
-[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
-[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
-[![Join the chat at https://matrix.to/#/#Data-Parallel-Python_community:gitter.im](https://badges.gitter.im/Join%20Chat.svg)](https://app.gitter.im/#/room/#Data-Parallel-Python_community:gitter.im)
-
-The Game of Life is a cellular automaton devised by John Horton Conway in 1970.
-It is a zero-player game, meaning that its evolution is determined by its initial state.
-One interacts with the Game of Life by creating an initial configuration and observing how it evolves.
-
-![Game Of Life Demo](https://github.com/samaid/GameOfLife/blob/main/game-of-life-lowres.gif)
-
-The universe of the Game of Life is an infinite, two-dimensional orthogonal grid of square cells, each of which is in one of two possible states,
-live or dead (or populated and unpopulated, respectively). Every cell interacts with its eight neighbours, which are the cells that are horizontally,
-vertically, or diagonally adjacent. At each step in time, the following transitions occur:
-
-* Any live cell with fewer than two live neighbours dies, as if by underpopulation.
-* Any live cell with two or three live neighbours lives on to the next generation.
-* Any live cell with more than three live neighbours dies, as if by overpopulation.
-* Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.
-
-These rules, which compare the behaviour of the automaton to real life, can be condensed into the following:
-
-* Any live cell with two or three live neighbours survives.
-* Any dead cell with three live neighbours becomes a live cell.
-* All other live cells die in the next generation. Similarly, all other dead cells stay dead.
-
-The initial pattern constitutes the seed of the system.
-The first generation is created by applying the above rules simultaneously to every cell in the seed,
-live or dead; births and deaths occur simultaneously, and the discrete moment at which this happens is
-sometimes called a tick.
-Each generation is a pure function of the preceding one.
-The rules continue to be applied repeatedly to create further generations.
-
-For further details please address [Wikipedia](https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life).
-
-Installation
-------------
-`conda install -c "pycoddiy/label/dev" game-of-life-demo`
-
-Also, if you are using GUI, you will need to add
-`opencv-python` to the environment:
-
-`pip install opencv-python`
-
-Running demo
-------------
-
-From command line type:
-`game_of_life  [command line options]`
-
-* `--variant [numba, numpy, dpnp, numba-dpex]` (default `numpy`) - implementation variant
-* `--threading-layer [omp, tbb, workqueue]` (default `omp`) - threading layer for `numba` implementation
-* `--parallel` (default) or `--no-parallel` - keyword argument `parallel=` for `@njit`.
-  Used along with `--variant numba`
-* `--frames-count` - stop rendering after a specified amount of frames. Default 0 meaning that the demo
-  does not stop until user action, e.g. close window
-* `--gui` (default) or `--no-gui` - render the evolution of the grid or do the computation only and
-  print performance statistics in the end.
-* `--stats` (default) or `--no-stats` - Display statistics in gui while running or not
-* `--task-size` - size of the grid WIDTH, HEIGHT. Example: `960,540` (default)
diff --git a/demos/game-of-life/conda-recipe/conda_build_config.yaml b/demos/game-of-life/conda-recipe/conda_build_config.yaml
deleted file mode 100644
index f329234..0000000
--- a/demos/game-of-life/conda-recipe/conda_build_config.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-numpy:
-  - 1.23
diff --git a/demos/game-of-life/conda-recipe/meta.yaml b/demos/game-of-life/conda-recipe/meta.yaml
deleted file mode 100644
index f6f21f1..0000000
--- a/demos/game-of-life/conda-recipe/meta.yaml
+++ /dev/null
@@ -1,48 +0,0 @@
-package:
-  name: game-of-life-demo
-  version: {{ GIT_DESCRIBE_TAG }}
-
-source:
-  path: ../../..
-
-build:
-  entry_points:
-    - game_of_life = game_of_life_demo.game_of_life:main
-  number: {{ GIT_DESCRIBE_NUMBER }}
-  script: {{ PYTHON }} -m pip install ./demos/game-of-life --no-deps --ignore-installed --no-cache-dir -vvv
-
-test:
-  requires:
-    - pytest
-  commands:
-    - game_of_life --help
-    - python -m game_of_life_demo --variant numba --threading-layer tbb --no-parallel --no-gui
-    - game_of_life --frame-count 5 --no-gui --no-stats --task-size 10,10
-  imports:
-    - game_of_life_demo
-    - game_of_life_demo.impl.impl_versioner
-    - game_of_life_demo.impl.arg_parser
-
-requirements:
-  host:
-   - python
-  run:
-    - numpy <1.24
-    - scipy
-    - numba >=0.56.4
-    - opencv =4.6.0
-    - dpnp
-    - numba-dpex
-
-about:
-  home: https://intelpython.github.io/DPEP/main/
-  summary: Conway's Game-Of-Life demo with numpy, numba, dpnp, numba-dpex
-  description: |
-    The Game of Life is a cellular automaton devised by John Horton Conway in 1970.
-    This demo provides multiple implementations using different libraries/tools for CPU and GPU.
-  license: BSD-2
-  license_file: LICENSE
-
-extra:
-  recipe-maintainers:
-    - samaid
diff --git a/demos/game-of-life/game-of-life-lowres.gif b/demos/game-of-life/game-of-life-lowres.gif
deleted file mode 100644
index 7d27751..0000000
Binary files a/demos/game-of-life/game-of-life-lowres.gif and /dev/null differ
diff --git a/demos/game-of-life/game-of-life.gif b/demos/game-of-life/game-of-life.gif
deleted file mode 100644
index 684999a..0000000
Binary files a/demos/game-of-life/game-of-life.gif and /dev/null differ
diff --git a/demos/game-of-life/game_of_life_demo.ipynb b/demos/game-of-life/game_of_life_demo.ipynb
deleted file mode 100644
index 7fb66fd..0000000
--- a/demos/game-of-life/game_of_life_demo.ipynb
+++ /dev/null
@@ -1,98 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "id": "b9309c4f-415d-4e7f-a169-6f9c7e28e018",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import dpctl"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "id": "0a55e346-69e7-4f8e-b395-8d632fcaf558",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Intel(R) OpenCL HD Graphics OpenCL 3.0 \n",
-      "Intel(R) Level-Zero 1.3\n"
-     ]
-    }
-   ],
-   "source": [
-    "dpctl.lsplatform()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "id": "db0abcf7-2308-4869-9bc7-0f70566785ab",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "usage: ipykernel_launcher.py [-h] [--variant {numpy,numba}] [--threading-layer {omp,tbb,workqueue}] [--parallel | --no-parallel] [--frames-count FRAMES_COUNT] [--gui | --no-gui] [--stats | --no-stats] [--task-size TASK_SIZE]\n",
-      "ipykernel_launcher.py: error: unrecognized arguments: -f C:\\Users\\smaidano\\AppData\\Roaming\\jupyter\\runtime\\kernel-6523de26-e036-47b6-9619-07b0e0d470b1.json\n"
-     ]
-    },
-    {
-     "ename": "SystemExit",
-     "evalue": "2",
-     "output_type": "error",
-     "traceback": [
-      "An exception has occurred, use %tb to see the full traceback.\n",
-      "\u001b[1;31mSystemExit\u001b[0m\u001b[1;31m:\u001b[0m 2\n"
-     ]
-    }
-   ],
-   "source": [
-    "import game_of_life_demo"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "81eb3455-dae4-42c1-a1fa-66af205e3021",
-   "metadata": {},
-   "outputs": [],
-   "source": []
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "de662eb4-896b-447e-9fa1-9c7cc39d7178",
-   "metadata": {},
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python [conda env:ndpex-examples] *",
-   "language": "python",
-   "name": "conda-env-ndpex-examples-py"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.9.15"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/demos/game-of-life/game_of_life_demo/__init__.py b/demos/game-of-life/game_of_life_demo/__init__.py
deleted file mode 100644
index 08ef4e1..0000000
--- a/demos/game-of-life/game_of_life_demo/__init__.py
+++ /dev/null
@@ -1,28 +0,0 @@
-from time import time
-
-PROB_ON = 0.2
-MAX_FRAMES = 2000
-
-
-def int_tuple(tuple_str):
-    return tuple(map(int, tuple_str.split(",")))
-
-
-def time_meter(last, total):
-    def _time_meter(func):
-        def impl(self, *args, **kwargs):
-            start = time()
-            res = func(self, *args, **kwargs)
-            end = time()
-            self.time[last] = end - start
-            self.time[total] += end - start
-
-            return res
-
-        return impl
-
-    return _time_meter
-
-
-def get_task_size_string(w, h):
-    return f"Task size {w}x{h}"
diff --git a/demos/game-of-life/game_of_life_demo/__main__.py b/demos/game-of-life/game_of_life_demo/__main__.py
deleted file mode 100644
index 4b83b0f..0000000
--- a/demos/game-of-life/game_of_life_demo/__main__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from game_of_life_demo.game_of_life import main
-
-main()
diff --git a/demos/game-of-life/game_of_life_demo/game_of_life.py b/demos/game-of-life/game_of_life_demo/game_of_life.py
deleted file mode 100644
index 3914544..0000000
--- a/demos/game-of-life/game_of_life_demo/game_of_life.py
+++ /dev/null
@@ -1,115 +0,0 @@
-import numpy as np
-from game_of_life_demo import MAX_FRAMES
-from game_of_life_demo import PROB_ON
-from game_of_life_demo import get_task_size_string
-from game_of_life_demo import time_meter
-from game_of_life_demo.impl.arg_parser import parse_args
-from game_of_life_demo.impl.impl_versioner import get_variant_string
-from game_of_life_demo.impl.impl_versioner import grid_update
-from game_of_life_demo.impl.impl_versioner import init_grid
-from game_of_life_demo.impl.visualization import VISUALIZE_GAME
-from game_of_life_demo.impl.visualization import create_window
-from game_of_life_demo.impl.visualization import draw
-from game_of_life_demo.impl.visualization import test_esc_key_pressed
-from game_of_life_demo.impl.visualization import test_window_closed
-
-
-class Grid:
-    draw_last = "draw_time_last"
-    draw_total = "draw_time_total"
-
-    update_last = "update_time_last"
-    update_total = "update_time_total"
-
-    def __init__(self, w, h, p):
-        self.w = w
-        self.h = h
-        self.time = {
-            self.draw_last: 0,
-            self.draw_total: 0,
-            self.update_last: 0,
-            self.update_total: 0,
-        }
-        self.grid = init_grid(w, h, p)
-
-    def get_statistics(self, frame_count):
-        update_time = self.time[self.update_last]
-        update_tpf = (
-            self.time[self.update_total] / frame_count if frame_count > 0 else 0.0
-        )
-        draw_time = self.time[self.draw_last]
-        draw_tpf = self.time[self.draw_total] / frame_count if frame_count > 0 else 0.0
-        total_time = update_time + draw_time
-        total_tpf = update_tpf + draw_tpf
-        return update_time, update_tpf, draw_time, draw_tpf, total_time, total_tpf
-
-    @time_meter(draw_last, draw_total)
-    def draw(self, show_statistics, frame_count):
-        (
-            update_time,
-            update_tpf,
-            draw_time,
-            draw_tpf,
-            total_time,
-            total_tpf,
-        ) = self.get_statistics(frame_count)
-        draw(
-            self.grid,
-            show_statistics,
-            frame_count,
-            update_time,
-            update_tpf,
-            draw_time,
-            draw_tpf,
-            total_time,
-            total_tpf,
-        )
-
-    @time_meter(update_last, update_total)
-    def update(self):
-        self.grid = grid_update(self.grid)
-
-
-def main(argv=None):
-    np.random.seed(777777777)
-
-    w, h = parse_args(argv).task_size
-    grid = Grid(w, h, PROB_ON)
-
-    create_window()
-
-    frames = 0
-    do_game = True
-
-    stop_frame = parse_args(argv).frames_count
-    if stop_frame == 0:
-        stop_frame = MAX_FRAMES
-
-    print(get_variant_string())
-    print(get_task_size_string(w, h))
-
-    while do_game:
-        # Checks for game termination
-        esc_pressed = test_esc_key_pressed()
-        window_closed = test_window_closed()
-
-        # Draw objects
-        grid.draw(parse_args().stats, frames)
-
-        # Perform updates
-        grid.update()
-
-        frames += 1
-        do_game = (0 < frames <= stop_frame) and not (esc_pressed or window_closed)
-
-    _, update_tpf, _, draw_tpf, _, total_tpf = grid.get_statistics(frames)
-    print(f"Total frames {frames}")
-    print("Average fps:")
-    print(f"    Computation {1/update_tpf:4.1f}")
-    if VISUALIZE_GAME:
-        print(f"    Draw        {1/draw_tpf:4.1f}")
-        print(f"    Total       {1/total_tpf:4.1f}")
-
-
-if __name__ == "__main__":
-    main()
diff --git a/demos/game-of-life/game_of_life_demo/impl/arg_parser.py b/demos/game-of-life/game_of_life_demo/impl/arg_parser.py
deleted file mode 100644
index c4f5d89..0000000
--- a/demos/game-of-life/game_of_life_demo/impl/arg_parser.py
+++ /dev/null
@@ -1,56 +0,0 @@
-import argparse
-
-from game_of_life_demo import int_tuple
-
-
-def parse_args(argv=None):
-    parser = argparse.ArgumentParser(description="Conway's Game of Life")
-    parser.add_argument(
-        "--variant",
-        help="Implementation variant",
-        type=str.casefold,
-        choices=["numpy", "numba", "dpnp", "numba-dpex"],
-        default="numpy",
-    )
-    parser.add_argument(
-        "--threading-layer",
-        help="Threading layer",
-        choices=["omp", "tbb", "workqueue"],
-        default="omp",
-    )
-    parser.add_argument(
-        "--parallel",
-        help="Keyword argument parallel= for @njit. Used along with --variant numba. Default --no-parallel",
-        action="store_true",
-        default=False,
-    )
-    parser.add_argument(
-        "--frames-count",
-        help="Stop game after specified amount of frames (default 0 - no stop frame)",
-        type=int,
-        default=0,
-    )
-    parser.add_argument(
-        "--gui",
-        help="Render the evolution of the grid or do computation only and "
-        "print statistics in the end. Default --no-gui",
-        action="store_true",
-        default=False,
-    )
-    parser.add_argument(
-        "--stats",
-        help="Either display statistics in gui while running or not. Default --no-stats",
-        action="store_true",
-        default=False,
-    )
-    w = 960
-    h = 540
-    parser.add_argument(
-        "--task-size",
-        help=f"Size of the grid. E.g. 1200,800. Default {w},{h}",
-        type=int_tuple,
-        default=int_tuple(f"{w},{h}"),
-    )
-
-    args, _ = parser.parse_known_args(argv)
-    return args
diff --git a/demos/game-of-life/game_of_life_demo/impl/impl_dpnp.py b/demos/game-of-life/game_of_life_demo/impl/impl_dpnp.py
deleted file mode 100644
index b9d213a..0000000
--- a/demos/game-of-life/game_of_life_demo/impl/impl_dpnp.py
+++ /dev/null
@@ -1,45 +0,0 @@
-import dpnp as np
-
-
-def init_grid(w, h, p):
-    u = np.random.random(w * h)  # Working around the lack of random.choice
-    return np.where(u <= p, 1, 0).reshape(h, w)
-
-
-def grid_update(grid):
-    m, n = grid.shape
-
-    grid_neighbor = np.zeros((m + 2, n + 2), dtype=grid.dtype)
-
-    grid_neighbor[0:-2, 0:-2] = grid
-    grid_neighbor[1:-1, 0:-2] += grid
-    grid_neighbor[2:, 0:-2] += grid
-    grid_neighbor[0:-2, 1:-1] += grid
-    grid_neighbor[2:, 1:-1] += grid
-    grid_neighbor[0:-2, 2:] += grid
-    grid_neighbor[1:-1, 2:] += grid
-    grid_neighbor[2:, 2:] += grid
-
-    grid_neighbor[1, 1:-1] += grid_neighbor[-1, 1:-1]
-    grid_neighbor[-2, 1:-1] += grid_neighbor[0, 1:-1]
-    grid_neighbor[1:-1, 1] += grid_neighbor[1:-1, -1]
-    grid_neighbor[1:-1, -2] += grid_neighbor[1:-1, 0]
-
-    grid_neighbor[1, 1] += grid_neighbor[-1, -1]
-    grid_neighbor[-2, -2] += grid_neighbor[0, 0]
-    grid_neighbor[1, -2] += grid_neighbor[-1, 0]
-    grid_neighbor[-2, 1] += grid_neighbor[0, -1]
-
-    dead_rules = np.logical_and(grid == 0, grid_neighbor[1:-1, 1:-1] == 3)
-    alive_rules = np.logical_and(
-        grid == 1,
-        np.logical_or(grid_neighbor[1:-1, 1:-1] == 2, grid_neighbor[1:-1, 1:-1] == 3),
-    )
-
-    grid_out = np.logical_or(alive_rules, dead_rules)
-
-    return grid_out.astype(grid.dtype)
-
-
-def asnumpy(x):
-    return np.asnumpy(x)
diff --git a/demos/game-of-life/game_of_life_demo/impl/impl_numba.py b/demos/game-of-life/game_of_life_demo/impl/impl_numba.py
deleted file mode 100644
index 0add16e..0000000
--- a/demos/game-of-life/game_of_life_demo/impl/impl_numba.py
+++ /dev/null
@@ -1,44 +0,0 @@
-import numpy as np
-from game_of_life_demo.impl.arg_parser import parse_args
-from numba import njit
-from numba import prange
-
-rules = np.array(
-    [
-        # 0  1  2  3  4  5  6  7  8   # Number of alive cell neighbors
-        [0, 0, 0, 1, 0, 0, 0, 0, 0],  # Rule for dead cells
-        [0, 0, 1, 1, 0, 0, 0, 0, 0],  # Rule for alive cells
-    ]
-)
-
-
-def init_grid(w, h, p):
-    return np.random.choice((0, 1), w * h, p=(1.0 - p, p)).reshape(h, w)
-
-
-@njit(
-    ["int32[:,:](int32[:,:])", "int64[:,:](int64[:,:])"], parallel=parse_args().parallel
-)
-def grid_update(grid):
-    m, n = grid.shape
-    grid_out = np.empty_like(grid)
-    grid_padded = np.empty((m + 2, n + 2), dtype=grid.dtype)
-    grid_padded[1:-1, 1:-1] = grid  # copy input grid into the center of padded one
-    grid_padded[0, 1:-1] = grid[-1]  # top row of padded grid
-    grid_padded[-1, 1:-1] = grid[0]  # bottom
-    grid_padded[1:-1, 0] = grid[:, -1]
-    grid_padded[1:-1, -1] = grid[:, 0]
-    grid_padded[0, 0] = grid[-1, -1]
-    grid_padded[-1, -1] = grid[0, 0]
-    grid_padded[0, -1] = grid[-1, 0]
-    grid_padded[-1, 0] = grid[0, -1]
-    for i in prange(m):
-        for j in range(n):
-            v_self = grid[i, j]
-            neighbor_population = grid_padded[i : i + 3, j : j + 3].sum() - v_self
-            grid_out[i, j] = rules[v_self, neighbor_population]
-    return grid_out
-
-
-def asnumpy(x):
-    return x
diff --git a/demos/game-of-life/game_of_life_demo/impl/impl_numba_dpex.py b/demos/game-of-life/game_of_life_demo/impl/impl_numba_dpex.py
deleted file mode 100644
index b3d6c0c..0000000
--- a/demos/game-of-life/game_of_life_demo/impl/impl_numba_dpex.py
+++ /dev/null
@@ -1,45 +0,0 @@
-import dpnp as np
-from game_of_life_demo.impl.arg_parser import parse_args
-from numba_dpex import dpjit as njit
-from numba_dpex import prange
-
-rules = np.array(
-    [
-        # 0  1  2  3  4  5  6  7  8   # Number of alive cell neighbors
-        [0, 0, 0, 1, 0, 0, 0, 0, 0],  # Rule for dead cells
-        [0, 0, 1, 1, 0, 0, 0, 0, 0],  # Rule for alive cells
-    ]
-)
-
-
-def init_grid(w, h, p):
-    u = np.random.random(w * h)  # Working around the lack of random.choice()
-    return np.where(u <= p, 1, 0).reshape(h, w)
-
-
-@njit(
-    ["int32[:,:](int32[:,:])", "int64[:,:](int64[:,:])"], parallel=parse_args().parallel
-)
-def grid_update(grid):
-    m, n = grid.shape
-    grid_out = np.empty_like(grid)
-    grid_padded = np.empty((m + 2, n + 2), dtype=grid.dtype)
-    grid_padded[1:-1, 1:-1] = grid  # copy input grid into the center of padded one
-    grid_padded[0, 1:-1] = grid[-1]  # top row of padded grid
-    grid_padded[-1, 1:-1] = grid[0]  # bottom
-    grid_padded[1:-1, 0] = grid[:, -1]
-    grid_padded[1:-1, -1] = grid[:, 0]
-    grid_padded[0, 0] = grid[-1, -1]
-    grid_padded[-1, -1] = grid[0, 0]
-    grid_padded[0, -1] = grid[-1, 0]
-    grid_padded[-1, 0] = grid[0, -1]
-    for i in prange(m):
-        for j in range(n):
-            v_self = grid[i, j]
-            neighbor_population = grid_padded[i : i + 3, j : j + 3].sum() - v_self
-            grid_out[i, j] = rules[v_self, neighbor_population]
-    return grid_out
-
-
-def asnumpy(x):
-    return np.asnumpy(x)
diff --git a/demos/game-of-life/game_of_life_demo/impl/impl_numpy.py b/demos/game-of-life/game_of_life_demo/impl/impl_numpy.py
deleted file mode 100644
index dc90475..0000000
--- a/demos/game-of-life/game_of_life_demo/impl/impl_numpy.py
+++ /dev/null
@@ -1,44 +0,0 @@
-import numpy as np
-
-
-def init_grid(w, h, p):
-    return np.random.choice((0, 1), w * h, p=(1.0 - p, p)).reshape(h, w)
-
-
-def grid_update(grid):
-    m, n = grid.shape
-
-    grid_neighbor = np.zeros((m + 2, n + 2), dtype=grid.dtype)
-
-    grid_neighbor[0:-2, 0:-2] = grid
-    grid_neighbor[1:-1, 0:-2] += grid
-    grid_neighbor[2:, 0:-2] += grid
-    grid_neighbor[0:-2, 1:-1] += grid
-    grid_neighbor[2:, 1:-1] += grid
-    grid_neighbor[0:-2, 2:] += grid
-    grid_neighbor[1:-1, 2:] += grid
-    grid_neighbor[2:, 2:] += grid
-
-    grid_neighbor[1, 1:-1] += grid_neighbor[-1, 1:-1]
-    grid_neighbor[-2, 1:-1] += grid_neighbor[0, 1:-1]
-    grid_neighbor[1:-1, 1] += grid_neighbor[1:-1, -1]
-    grid_neighbor[1:-1, -2] += grid_neighbor[1:-1, 0]
-
-    grid_neighbor[1, 1] += grid_neighbor[-1, -1]
-    grid_neighbor[-2, -2] += grid_neighbor[0, 0]
-    grid_neighbor[1, -2] += grid_neighbor[-1, 0]
-    grid_neighbor[-2, 1] += grid_neighbor[0, -1]
-
-    dead_rules = np.logical_and(grid == 0, grid_neighbor[1:-1, 1:-1] == 3)
-    alive_rules = np.logical_and(
-        grid == 1,
-        np.logical_or(grid_neighbor[1:-1, 1:-1] == 2, grid_neighbor[1:-1, 1:-1] == 3),
-    )
-
-    grid_out = np.logical_or(alive_rules, dead_rules)
-
-    return grid_out.astype(grid.dtype)
-
-
-def asnumpy(x):
-    return x
diff --git a/demos/game-of-life/game_of_life_demo/impl/impl_versioner.py b/demos/game-of-life/game_of_life_demo/impl/impl_versioner.py
deleted file mode 100644
index d9ddf98..0000000
--- a/demos/game-of-life/game_of_life_demo/impl/impl_versioner.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from game_of_life_demo.impl.arg_parser import parse_args
-
-RUN_VERSION = parse_args().variant
-
-if RUN_VERSION == "Numba".casefold():
-    from game_of_life_demo.impl.impl_numba import asnumpy
-    from game_of_life_demo.impl.impl_numba import grid_update
-    from game_of_life_demo.impl.impl_numba import init_grid
-    from numba import config
-
-    config.THREADING_LAYER = parse_args().threading_layer
-elif RUN_VERSION == "NumPy".casefold():
-    from game_of_life_demo.impl.impl_numpy import asnumpy
-    from game_of_life_demo.impl.impl_numpy import grid_update
-    from game_of_life_demo.impl.impl_numpy import init_grid
-elif RUN_VERSION == "DPNP".casefold():
-    from game_of_life_demo.impl.impl_dpnp import asnumpy
-    from game_of_life_demo.impl.impl_dpnp import grid_update
-    from game_of_life_demo.impl.impl_dpnp import init_grid
-elif RUN_VERSION == "Numba-DPEX".casefold():
-    from game_of_life_demo.impl.impl_numba_dpex import asnumpy
-    from game_of_life_demo.impl.impl_numba_dpex import grid_update
-    from game_of_life_demo.impl.impl_numba_dpex import init_grid
-
-
-def get_variant_string():
-    if RUN_VERSION == "Numba".casefold():
-        return f"Numba, threading layer: {parse_args().threading_layer}, parallel: {parse_args().parallel}"
-    else:
-        return "NumPy"
diff --git a/demos/game-of-life/game_of_life_demo/impl/visualization.py b/demos/game-of-life/game_of_life_demo/impl/visualization.py
deleted file mode 100644
index b799238..0000000
--- a/demos/game-of-life/game_of_life_demo/impl/visualization.py
+++ /dev/null
@@ -1,152 +0,0 @@
-import numpy as np
-from game_of_life_demo import get_task_size_string
-from game_of_life_demo.impl.arg_parser import parse_args
-from game_of_life_demo.impl.impl_versioner import asnumpy
-from game_of_life_demo.impl.impl_versioner import get_variant_string
-
-DISPLAY_RES = DISPLAY_W, DISPLAY_H = 1920, 1080  # Window width and height
-CELL_COLOR = (0, 255, 0)  # Color to be used for alive cells # BGR
-CELL_SIZE = 2  # Cell size in pixels
-
-FONT_SCALE = 0.5
-FONT_COLOR = (255, 255, 255)  # BGR(A)
-FONT_HEIGHT = 15
-FONT_THICKNESS = 1
-FONT = None
-
-# Text box with performance statistics
-TEXT_BOX_TOP_LEFT = (5, 7)  # Top-left corner
-TEXT_BOX_BOTTOM_RIGHT = (420, 110)  # Bottom-right corner
-TEXT_BOX_FONT_OFFSET = 10  # Offset from the top-left corner in pixels for drawing text
-TEXT_BOX_COL2_OFFSET = (
-    150  # Offset from the left (in pixels) for drawing text in second column
-)
-TEXT_BOX_COL3_OFFSET = (
-    300  # Offset from the left (in pixels) for drawing text in third column
-)
-TEXT_BOX_ALPHA = 0.5  # Transparency of the text box background
-
-# Game field size (GRID_W - number of cells horizontally, GRID_H - number of cells vertically)
-GRID_W, GRID_H = DISPLAY_W // CELL_SIZE, DISPLAY_H // CELL_SIZE
-
-ESC_KEYCODE = 27  # Finish demo by pressing Esc key
-WINDOW_NAME = "Conway's Game of life"  # Window name
-
-
-# *********************************************************************************************
-# CONDITIONAL INITIALIZATIONS
-# *********************************************************************************************
-
-GUI_FLAG = parse_args().gui  # If user selected --gui CLI option
-
-if GUI_FLAG:
-    try:  # Importing OpenCV
-        import cv2
-
-        VISUALIZE_GAME = True
-        FONT = cv2.FONT_HERSHEY_TRIPLEX
-    except ModuleNotFoundError:
-        VISUALIZE_GAME = False
-else:
-    VISUALIZE_GAME = False
-
-
-def line_to_y(line_number):
-    return TEXT_BOX_TOP_LEFT[1] + FONT_HEIGHT * line_number + TEXT_BOX_FONT_OFFSET
-
-
-def draw_text(img, text, line_number, x_pos=TEXT_BOX_FONT_OFFSET):
-    y_pos = line_to_y(line_number)
-    cv2.putText(img, text, (x_pos, y_pos), FONT, FONT_SCALE, FONT_COLOR, FONT_THICKNESS)
-
-
-def draw_statistics_line(img, name, line_number, fps, time):
-    # no monospace fonts in OpenCV
-    draw_text(img, name, line_number)
-    draw_text(img, "FPS|time(ms)", line_number, TEXT_BOX_COL2_OFFSET)
-    draw_text(img, f"{fps:4.1f}|{int(1000 * time)}", line_number, TEXT_BOX_COL3_OFFSET)
-
-
-def draw_statistics(
-    img,
-    w,
-    h,
-    frame_count,
-    update_time,
-    update_tpf,
-    draw_time,
-    draw_tpf,
-    total_time,
-    total_tpf,
-):
-    p1 = TEXT_BOX_TOP_LEFT
-    p2 = TEXT_BOX_BOTTOM_RIGHT
-
-    sub_img = img[p1[1] : p2[1], p1[0] : p2[0]]
-    black_bg = np.zeros(sub_img.shape, dtype=np.uint8)
-    img[p1[1] : p2[1], p1[0] : p2[0]] = cv2.addWeighted(
-        sub_img, TEXT_BOX_ALPHA, black_bg, 1.0 - TEXT_BOX_ALPHA, 1.0
-    )
-    draw_text(img, get_variant_string(), 0)
-    draw_text(img, get_task_size_string(w, h), 1)
-    draw_text(img, f"Frames: {(frame_count // 10) * 10}", 2)
-    draw_statistics_line(img, "Computation", 3, 1 / update_tpf, update_time)
-    draw_statistics_line(img, "Draw", 4, 1 / draw_tpf, draw_time)
-    draw_statistics_line(img, "Total", 5, 1 / total_tpf, total_time)
-
-
-def draw(
-    grid,
-    show_statistics,
-    frame_count,
-    update_time,
-    update_tpf,
-    draw_time,
-    draw_tpf,
-    total_time,
-    total_tpf,
-):
-    if VISUALIZE_GAME:
-        h, w = grid.shape
-        img = np.zeros(shape=grid.shape + (3,), dtype=np.uint8)
-        img[:, :, 1] = 255 * asnumpy(
-            grid
-        )  # The asnumpy() transfers data from device to host as needed
-        img = cv2.resize(img, (DISPLAY_W, DISPLAY_H), interpolation=cv2.INTER_NEAREST)
-
-        if show_statistics and frame_count > 0:
-            draw_statistics(
-                img,
-                w,
-                h,
-                frame_count,
-                update_time,
-                update_tpf,
-                draw_time,
-                draw_tpf,
-                total_time,
-                total_tpf,
-            )
-
-        cv2.imshow(WINDOW_NAME, img)
-        cv2.resizeWindow(WINDOW_NAME, DISPLAY_W, DISPLAY_H)
-
-
-def test_esc_key_pressed():
-    if VISUALIZE_GAME:
-        return cv2.pollKey() == ESC_KEYCODE
-    else:
-        return False
-
-
-def test_window_closed():
-    if VISUALIZE_GAME:
-        return not cv2.getWindowProperty(WINDOW_NAME, cv2.WND_PROP_VISIBLE)
-    else:
-        return False
-
-
-def create_window():
-    if VISUALIZE_GAME:
-        cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_GUI_NORMAL | cv2.WINDOW_AUTOSIZE)
-        cv2.resizeWindow(WINDOW_NAME, DISPLAY_W, DISPLAY_H)
diff --git a/demos/game-of-life/game_of_life_demo/tests/conftest.py b/demos/game-of-life/game_of_life_demo/tests/conftest.py
deleted file mode 100644
index e4cd73d..0000000
--- a/demos/game-of-life/game_of_life_demo/tests/conftest.py
+++ /dev/null
@@ -1,8 +0,0 @@
-def pytest_addoption(parser):
-    parser.addoption("--variant", action="store", help="Implementation variant")
-    parser.addoption(
-        "--parallel", action="store_true", help="@njit(parallel=True/False) setting"
-    )
-    parser.addoption(
-        "--no-parallel", action="store_false", help="@njit(parallel=True/False) setting"
-    )
diff --git a/demos/game-of-life/game_of_life_demo/tests/test_grid.py b/demos/game-of-life/game_of_life_demo/tests/test_grid.py
deleted file mode 100644
index ae2c7c7..0000000
--- a/demos/game-of-life/game_of_life_demo/tests/test_grid.py
+++ /dev/null
@@ -1,70 +0,0 @@
-from game_of_life_demo.impl.impl_versioner import RUN_VERSION
-from game_of_life_demo.impl.impl_versioner import asnumpy
-
-if RUN_VERSION in ["dpnp", "numba-dpex"]:
-    import dpnp as np
-    import numpy.testing as testing
-else:
-    import numpy as np
-    import numpy.testing as testing
-
-import pytest
-from game_of_life_demo.game_of_life import Grid
-
-grids = [
-    (
-        # Input
-        [[0, 1, 0], [1, 0, 0], [0, 1, 0]],
-        # Expected
-        [[1, 1, 1], [1, 1, 1], [1, 1, 1]],
-    ),
-    (
-        # Input
-        [[0, 1, 0], [0, 0, 0], [0, 1, 0]],
-        # Expected
-        [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
-    ),
-    (
-        # Input
-        [[0, 1, 0], [1, 1, 1], [0, 1, 0]],
-        # Expected
-        [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
-    ),
-    (
-        # Input
-        [[0, 1, 0], [0, 1, 0], [0, 1, 0]],
-        # Expected
-        [[1, 1, 1], [1, 1, 1], [1, 1, 1]],
-    ),
-    (
-        # Input
-        [[1, 1, 1], [0, 1, 0], [1, 1, 1]],
-        # Expected
-        [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
-    ),
-    (
-        # Input
-        [[0, 0, 1], [0, 1, 0], [1, 0, 0]],
-        # Expected
-        [[1, 1, 1], [1, 1, 1], [1, 1, 1]],
-    ),
-    (
-        # Input
-        [[1, 0, 1], [0, 1, 0], [1, 0, 0]],
-        # Expected
-        [[1, 0, 1], [0, 1, 0], [1, 0, 0]],
-    ),
-]
-
-
-@pytest.mark.parametrize("input_grid, expected_grid", grids)
-def test_grid(mocker, input_grid, expected_grid):
-    def mock_init_grid(w, h, p):
-        return np.array(input_grid).reshape(h, w)
-
-    mocker.patch("game_of_life_demo.game_of_life.init_grid", mock_init_grid)
-
-    grid = Grid(3, 3, 1.0)
-    grid.update()
-
-    testing.assert_array_equal(asnumpy(grid.grid), asnumpy(expected_grid))
diff --git a/demos/game-of-life/game_of_life_demo/tests/test_parser.py b/demos/game-of-life/game_of_life_demo/tests/test_parser.py
deleted file mode 100644
index 1f3616b..0000000
--- a/demos/game-of-life/game_of_life_demo/tests/test_parser.py
+++ /dev/null
@@ -1,57 +0,0 @@
-import pytest
-from game_of_life_demo import int_tuple
-from game_of_life_demo.impl.arg_parser import parse_args
-
-
-@pytest.mark.parametrize("variant_str", ["numpy", "numba", "dpnp", "numba-dpex"])
-def test_variant(variant_str):
-    args = parse_args(["--variant", variant_str])
-    assert args.variant == variant_str
-
-
-@pytest.mark.parametrize("threading_str", ["omp", "tbb", "workqueue"])
-def test_threading(threading_str):
-    args = parse_args(["--threading-layer", threading_str])
-    assert args.threading_layer == threading_str
-
-
-@pytest.mark.parametrize("frames_count", [0, 100])
-def _test_frames_count(frames_count):
-    args = parse_args(["--frames-count", frames_count])
-    assert args.frames_count == frames_count
-
-
-@pytest.mark.parametrize("task_size", ["3, 3", "100, 100"])
-def test_task_size(task_size):
-    args = parse_args(["--task-size", task_size])
-    assert args.task_size == int_tuple(task_size)
-
-
-def test_parallel_true():
-    args = parse_args(["--parallel"])
-    assert args.parallel
-
-
-def test_parallel_false():
-    args = parse_args(["--no-parallel"])
-    assert not args.parallel
-
-
-def test_gui_true():
-    args = parse_args(["--gui"])
-    assert args.gui
-
-
-def test_gui_false():
-    args = parse_args(["--no-gui"])
-    assert not args.gui
-
-
-def test_stats_true():
-    args = parse_args(["--stats"])
-    assert args.stats
-
-
-def test_stats_false():
-    args = parse_args(["--no-stats"])
-    assert not args.stats
diff --git a/demos/game-of-life/setup.py b/demos/game-of-life/setup.py
deleted file mode 100644
index 7f1a176..0000000
--- a/demos/game-of-life/setup.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from setuptools import setup
-
-if __name__ == "__main__":
-    setup()
diff --git a/demos/mandelbrot/README.md b/demos/mandelbrot/README.md
deleted file mode 100644
index b24b651..0000000
--- a/demos/mandelbrot/README.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# Mandelbrot Set
-
-[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
-[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
-[![Join the chat at https://matrix.to/#/#Data-Parallel-Python_community:gitter.im](https://badges.gitter.im/Join%20Chat.svg)](https://app.gitter.im/#/room/#Data-Parallel-Python_community:gitter.im)
-
-Mandelbrot set demo implemented using NumPy, Numba, DPNP, and Numba-DPEx.
-
-## What it is
-
-The Mandelbrot set is the set of complex numbers $c$ for which the function
-$f_{c}(z)=z^{2}+c$ does not diverge to infinity when iterated from  $z=0$, i.e.,
-for which the sequence $f_{c}(0)$, $f_{c}(f_{c}(0))$, etc., remains bounded in absolute value.
-
-Images of the Mandelbrot set exhibit an elaborate and infinitely complicated boundary
-that reveals progressively ever-finer recursive detail at increasing magnifications
-
-For further details please visit respective [Wikipedia article](https://en.wikipedia.org/wiki/Mandelbrot_set).
-
-## How to run demo
-
-### Running from installed conda package
-
-Install the demo as follows:
-`conda install -c pycoddiy/label/dev mandelbrot-demo`
-
-From command line type:
-`mandelbrot  [command line options]`
-
-* `--variant [numba, numpy, dpnp, numba-dpex]` (default `numpy`) - implementation variant
-* `--frames-count` - stop rendering after a specified amount of frames. Default 0 meaning that the demo
-  does not stop until user action, e.g. close window
-* `--gui` (default) or `--no-gui` - render the evolution of the grid or do the computation only and
-  print performance statistics in the end.
-* `--task-size` - window size WIDTH, HEIGHT. Example: 1024,800
-
-### Running from GitHub sources
-Clone repository to a local project directory:
-```
-git clone https://github.com/samaid/Mandelbrot.git
-cd ./Mandelbrot
-```
-
-From the command line type:
-`python mandelbrot_demo.py [command line options]`
-
-* `--variant [numba, numpy, dpnp, numba-dpex]` (default `numpy`) - implementation variant
-* `--frames-count` - stop rendering after a specified amount of frames. Default 0 meaning that the demo
-  does not stop until user action, e.g. close window
-* `--gui` (default) or `--no-gui` - render the evolution of the grid or do the computation only and
-  print performance statistics in the end.
-* `--task-size` - window size WIDTH, HEIGHT. Example: 1024,800
diff --git a/demos/mandelbrot/conda-recipe/conda_build_config.yaml b/demos/mandelbrot/conda-recipe/conda_build_config.yaml
deleted file mode 100644
index 801d7cf..0000000
--- a/demos/mandelbrot/conda-recipe/conda_build_config.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-python:
-  - 3.8
-  - 3.9
-  - 3.10
-numpy:
-  - 1.23
diff --git a/demos/mandelbrot/conda-recipe/meta.yaml b/demos/mandelbrot/conda-recipe/meta.yaml
deleted file mode 100644
index c3ad6f7..0000000
--- a/demos/mandelbrot/conda-recipe/meta.yaml
+++ /dev/null
@@ -1,56 +0,0 @@
-package:
-  name: mandelbrot-demo
-  version: {{ GIT_DESCRIBE_TAG }}
-
-source:
-  path: ../../..
-
-build:
-  entry_points:
-    - mandelbrot = mandelbrot_demo.mandelbrot:main
-  number: {{ GIT_DESCRIBE_NUMBER }}
-  script: {{ PYTHON }} -m pip install ./demos/mandelbrot --no-deps --ignore-installed --no-cache-dir -vvv
-
-requirements:
-  host:
-    - python
-  run:
-    - python
-    - pygame >=2.1
-    - numpy >=1.21
-    - numba >=0.55
-    - dpnp
-    - numba-dpex
-
-test:
-  requires:
-    - pytest
-  commands:
-    - mandelbrot --help
-    - python -m mandelbrot_demo --variant numba  --max-frames 1
-    - mandelbrot --gui --max-frames 1
-    - mandelbrot --no-gui --max-frames 1
-  imports:
-    - mandelbrot_demo
-    - mandelbrot_demo.impl
-    - mandelbrot_demo.impl.impl_versioner
-    - mandelbrot_demo.impl.visualization
-    - mandelbrot_demo.impl.arg_parser
-
-about:
-  home: https://intelpython.github.io/DPEP/main/
-  license: BSD-2-Clause
-  license_family: BSD
-  license_file:
-    - LICENSE
-  summary: Mandelbort Set demo using numpy, numba, dpnp, numba-dpex
-  description: |
-    The Mandelbrot set is the set of complex numbers c for which the function f(z)=z*z + c
-    does not diverge to infinity when iterated from z=0, i.e., for which the sequence
-    f(0), f(f(0)), etc., remains bounded in absolute value. Images of the Mandelbrot set exhibit
-    an elaborate and infinitely complicated boundary that reveals progressively ever-finer
-    recursive detail at increasing magnifications
-
-extra:
-  recipe-maintainers:
-    - samaid
diff --git a/demos/mandelbrot/mandelbrot_demo.py b/demos/mandelbrot/mandelbrot_demo.py
deleted file mode 100644
index 8bcd65b..0000000
--- a/demos/mandelbrot/mandelbrot_demo.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from mandelbrot_demo.mandelbrot import main
-
-main()
diff --git a/demos/mandelbrot/mandelbrot_demo/__init__.py b/demos/mandelbrot/mandelbrot_demo/__init__.py
deleted file mode 100644
index e065369..0000000
--- a/demos/mandelbrot/mandelbrot_demo/__init__.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from time import time
-
-
-def time_meter(last, total):
-    def _time_meter(func):
-        def impl(self, *args, **kwargs):
-            start = time()
-            res = func(self, *args, **kwargs)
-            end = time()
-            self.time[last] = end - start
-            self.time[total] += end - start
-
-            return res
-
-        return impl
-
-    return _time_meter
diff --git a/demos/mandelbrot/mandelbrot_demo/__main__.py b/demos/mandelbrot/mandelbrot_demo/__main__.py
deleted file mode 100644
index 8bcd65b..0000000
--- a/demos/mandelbrot/mandelbrot_demo/__main__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from mandelbrot_demo.mandelbrot import main
-
-main()
diff --git a/demos/mandelbrot/mandelbrot_demo/impl/arg_parser.py b/demos/mandelbrot/mandelbrot_demo/impl/arg_parser.py
deleted file mode 100644
index 36f41e8..0000000
--- a/demos/mandelbrot/mandelbrot_demo/impl/arg_parser.py
+++ /dev/null
@@ -1,41 +0,0 @@
-import argparse
-
-
-def int_tuple(tuple_str):
-    return tuple(map(int, tuple_str.split(",")))
-
-
-def parse_args(argv=None):
-    parser = argparse.ArgumentParser(description="Mandelbrot Set")
-    parser.add_argument(
-        "--variant",
-        help="Implementation variant",
-        type=str.casefold,
-        choices=["numpy", "numba", "dpnp", "numba-dpex"],
-        default="numpy",
-    )
-    parser.add_argument(
-        "--max-frames",
-        help="Stop game after specified amount of frames "
-        "(default 0 - no stop frame)",
-        type=int,
-        default=0,
-    )
-    parser.add_argument(
-        "--gui",
-        help="Render the evolution of the grid or do computation only and "
-        "print statistics in the end. Default --no-gui",
-        action="store_true",
-        default=False,
-    )
-    w = 1024
-    h = 800
-    parser.add_argument(
-        "--task-size",
-        help=f"Window size. E.g. 800,600. Default {w},{h}",
-        type=int_tuple,
-        default=int_tuple(f"{w},{h}"),
-    )
-
-    args, _ = parser.parse_known_args(argv)
-    return args
diff --git a/demos/mandelbrot/mandelbrot_demo/impl/impl_dpnp.py b/demos/mandelbrot/mandelbrot_demo/impl/impl_dpnp.py
deleted file mode 100644
index 89cf949..0000000
--- a/demos/mandelbrot/mandelbrot_demo/impl/impl_dpnp.py
+++ /dev/null
@@ -1,43 +0,0 @@
-import dpnp as np
-from mandelbrot_demo.impl.settings import MAX_ITER
-
-c1 = np.asarray([0.0, 0.0, 0.2])
-c2 = np.asarray([1.0, 0.7, 0.9])
-c3 = np.asarray([0.6, 1.0, 0.2])
-
-
-def color_by_intensity(intensity):
-    intensity = np.broadcast_to(intensity[:, :, np.newaxis], intensity.shape + (3,))
-    return np.where(
-        intensity < 0.5,
-        c3 * intensity + c2 * (1.0 - intensity),
-        c1 * intensity + c2 * (1.0 - intensity),
-    )
-
-
-def mandelbrot(w, h, zoom, offset, values):
-    x = np.linspace(0, w, num=w, dtype=np.float32)
-    y = np.linspace(0, h, num=h, dtype=np.float32)
-    xx = (x - offset[0]) * zoom
-    yy = (y - offset[1]) * zoom
-    c = xx + 1j * yy[:, np.newaxis]
-
-    n_iter = np.full(c.shape, 0)  # 2d array
-    z = np.zeros(c.shape, dtype=np.csingle)  # 2d array too
-    mask = n_iter < MAX_ITER  # Initialize with True
-    for i in range(MAX_ITER):
-        z[mask] = z[mask] ** 2 + c[mask]
-        mask = mask & (np.abs(z) <= 2.0)
-        n_iter[mask] = i
-
-    intensity = n_iter.T / MAX_ITER
-    values = (color_by_intensity(intensity) * 255).astype(np.int32)
-    return values
-
-
-def init_values(w, h):
-    return np.full((w, h, 3), 0, dtype=np.int32)
-
-
-def asnumpy(values):
-    return np.asnumpy(values)
diff --git a/demos/mandelbrot/mandelbrot_demo/impl/impl_numba.py b/demos/mandelbrot/mandelbrot_demo/impl/impl_numba.py
deleted file mode 100644
index 322019a..0000000
--- a/demos/mandelbrot/mandelbrot_demo/impl/impl_numba.py
+++ /dev/null
@@ -1,50 +0,0 @@
-import numba as nb
-import numpy as np
-from mandelbrot_demo.impl.settings import MAX_ITER
-
-nb.config.THREADING_LAYER = "omp"
-
-
-@nb.jit(fastmath=True, nopython=True)
-def color_by_intensity(intensity, c1, c2, c3):
-    if intensity < 0.5:
-        return c3 * intensity + c2 * (1.0 - intensity)
-    else:
-        return c1 * intensity + c2 * (1.0 - intensity)
-
-
-@nb.jit(fastmath=True, nopython=True)
-def mandel(x, y):
-    c = complex(x, y)
-    z = 0.0j
-    for i in range(MAX_ITER):
-        z = z * z + c
-        if (z.real * z.real + z.imag * z.imag) > 4.0:
-            return i
-    return MAX_ITER
-
-
-@nb.jit(fastmath=True, nopython=True, parallel=True)
-def mandelbrot(w, h, zoom, offset, values):
-    c1 = np.asarray([0.0, 0.0, 0.2])
-    c2 = np.asarray([1.0, 0.7, 0.9])
-    c3 = np.asarray([0.6, 1.0, 0.2])
-
-    for x in nb.prange(w):
-        for y in range(h):
-            xx = (x - offset[0]) * zoom
-            yy = (y - offset[1]) * zoom
-            intensity = mandel(xx, yy) / MAX_ITER
-            for c in range(3):
-                color = color_by_intensity(intensity, c1[c], c2[c], c3[c])
-                color = int(color * 255.0)
-                values[x, y, c] = color
-    return values
-
-
-def init_values(w, h):
-    return np.full((w, h, 3), 0, dtype=np.uint8)
-
-
-def asnumpy(values):
-    return values
diff --git a/demos/mandelbrot/mandelbrot_demo/impl/impl_numba_dpex.py b/demos/mandelbrot/mandelbrot_demo/impl/impl_numba_dpex.py
deleted file mode 100644
index 8e05a54..0000000
--- a/demos/mandelbrot/mandelbrot_demo/impl/impl_numba_dpex.py
+++ /dev/null
@@ -1,50 +0,0 @@
-import dpnp as np
-import numba_dpex as nb
-from mandelbrot_demo.impl.settings import MAX_ITER
-
-nb.config.THREADING_LAYER = "omp"
-
-
-@nb.dpjit(fastmath=True, nopython=True)
-def color_by_intensity(intensity, c1, c2, c3):
-    if intensity < 0.5:
-        return c3 * intensity + c2 * (1.0 - intensity)
-    else:
-        return c1 * intensity + c2 * (1.0 - intensity)
-
-
-@nb.dpjit(fastmath=True, nopython=True)
-def mandel(x, y):
-    c = complex(x, y)
-    z = 0.0j
-    for i in range(MAX_ITER):
-        z = z * z + c
-        if (z.real * z.real + z.imag * z.imag) > 4.0:
-            return i
-    return MAX_ITER
-
-
-@nb.dpjit(fastmath=True, nopython=True, parallel=True)
-def mandelbrot(w, h, zoom, offset, values):
-    c1 = np.asarray([0.0, 0.0, 0.2])
-    c2 = np.asarray([1.0, 0.7, 0.9])
-    c3 = np.asarray([0.6, 1.0, 0.2])
-
-    for x in nb.prange(w):
-        for y in range(h):
-            xx = (x - offset[0]) * zoom
-            yy = (y - offset[1]) * zoom
-            intensity = mandel(xx, yy) / MAX_ITER
-            for c in range(3):
-                color = color_by_intensity(intensity, c1[c], c2[c], c3[c])
-                color = int(color * 255.0)
-                values[x, y, c] = color
-    return values
-
-
-def init_values(w, h):
-    return np.full((w, h, 3), 0, dtype=np.uint8)
-
-
-def asnumpy(values):
-    return np.asnumpy(values)
diff --git a/demos/mandelbrot/mandelbrot_demo/impl/impl_numpy.py b/demos/mandelbrot/mandelbrot_demo/impl/impl_numpy.py
deleted file mode 100644
index 9cf5d7a..0000000
--- a/demos/mandelbrot/mandelbrot_demo/impl/impl_numpy.py
+++ /dev/null
@@ -1,43 +0,0 @@
-import numpy as np
-from mandelbrot_demo.impl.settings import MAX_ITER
-
-c1 = np.asarray([0.0, 0.0, 0.2])
-c2 = np.asarray([1.0, 0.7, 0.9])
-c3 = np.asarray([0.6, 1.0, 0.2])
-
-
-def color_by_intensity(intensity):
-    intensity = np.broadcast_to(intensity[:, :, np.newaxis], intensity.shape + (3,))
-    return np.where(
-        intensity < 0.5,
-        c3 * intensity + c2 * (1.0 - intensity),
-        c1 * intensity + c2 * (1.0 - intensity),
-    )
-
-
-def mandelbrot(w, h, zoom, offset, values):
-    x = np.linspace(0, w, num=w, dtype=np.float32)
-    y = np.linspace(0, h, num=h, dtype=np.float32)
-    xx = (x - offset[0]) * zoom
-    yy = (y - offset[1]) * zoom
-    c = xx + 1j * yy[:, np.newaxis]
-
-    n_iter = np.full(c.shape, 0)  # 2d array
-    z = np.zeros(c.shape, np.csingle)  # 2d array too
-    mask = n_iter < MAX_ITER  # Initialize with True
-    for i in range(MAX_ITER):
-        z[mask] = z[mask] ** 2 + c[mask]
-        mask = mask & (np.abs(z) <= 2.0)
-        n_iter[mask] = i
-
-    intensity = n_iter.T / MAX_ITER
-    values = (color_by_intensity(intensity) * 255).astype(np.uint8)
-    return values
-
-
-def init_values(w, h):
-    return np.full((w, h, 3), 0, dtype=np.uint8)
-
-
-def asnumpy(values):
-    return values
diff --git a/demos/mandelbrot/mandelbrot_demo/impl/impl_versioner.py b/demos/mandelbrot/mandelbrot_demo/impl/impl_versioner.py
deleted file mode 100644
index e7d0235..0000000
--- a/demos/mandelbrot/mandelbrot_demo/impl/impl_versioner.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from mandelbrot_demo.impl.arg_parser import parse_args
-
-RUN_VERSION = parse_args().variant
-
-if RUN_VERSION == "Numba".casefold():
-    from mandelbrot_demo.impl.impl_numba import asnumpy
-    from mandelbrot_demo.impl.impl_numba import init_values
-    from mandelbrot_demo.impl.impl_numba import mandelbrot
-elif RUN_VERSION == "NumPy".casefold():
-    from mandelbrot_demo.impl.impl_numpy import asnumpy
-    from mandelbrot_demo.impl.impl_numpy import init_values
-    from mandelbrot_demo.impl.impl_numpy import mandelbrot
-elif RUN_VERSION == "DPNP".casefold():
-    from mandelbrot_demo.impl.impl_dpnp import asnumpy
-    from mandelbrot_demo.impl.impl_dpnp import init_values
-    from mandelbrot_demo.impl.impl_dpnp import mandelbrot
-elif RUN_VERSION == "Numba-DPEX".casefold():
-    from mandelbrot_demo.impl.impl_numba_dpex import asnumpy
-    from mandelbrot_demo.impl.impl_numba_dpex import init_values
-    from mandelbrot_demo.impl.impl_numba_dpex import mandelbrot
diff --git a/demos/mandelbrot/mandelbrot_demo/impl/settings.py b/demos/mandelbrot/mandelbrot_demo/impl/settings.py
deleted file mode 100644
index 6e43d20..0000000
--- a/demos/mandelbrot/mandelbrot_demo/impl/settings.py
+++ /dev/null
@@ -1 +0,0 @@
-MAX_ITER = 30
diff --git a/demos/mandelbrot/mandelbrot_demo/impl/visualization.py b/demos/mandelbrot/mandelbrot_demo/impl/visualization.py
deleted file mode 100644
index 335266c..0000000
--- a/demos/mandelbrot/mandelbrot_demo/impl/visualization.py
+++ /dev/null
@@ -1,82 +0,0 @@
-import os
-
-from mandelbrot_demo.impl.arg_parser import parse_args
-from mandelbrot_demo.impl.impl_versioner import asnumpy
-
-GUI = parse_args().gui
-
-if GUI:
-    import pygame as pg
-
-DISPLAY_RES = DISPLAY_W, DISPLAY_H = 1024, 800
-FPS = 60
-
-frames = parse_args().max_frames
-if frames > 0:
-    N_FRAMES = frames
-else:
-    N_FRAMES = 1000000
-
-OFFSET_X = 1.4 * DISPLAY_W // 2
-OFFSET_Y = DISPLAY_H // 2
-OFFSET = (OFFSET_X, OFFSET_Y)
-ZOOM = 2.5 / DISPLAY_H
-
-if GUI:
-
-    def set_display():
-        os.environ["SDL_VIDEO_CENTERED"] = "1"
-
-        pg.init()
-        surface = pg.display.set_mode(DISPLAY_RES, pg.SCALED)
-        clock = pg.time.Clock()
-
-        return surface, clock
-
-    def pg_init():
-        surface, clock = set_display()
-        return surface, clock
-
-    def pg_draw(surface, fractal):
-        surface.fill(pg.Color("black"))
-        pg.surfarray.blit_array(surface, asnumpy(fractal.values))
-
-    def pg_test_quit():
-        do_game = True
-        for event in pg.event.get():
-            if event.type == pg.QUIT:
-                do_game = False
-        return do_game
-
-    def pg_update_fps(clk, frames):
-        pg.display.set_caption(f"FPS: {clk.get_fps():2.1f}, FRAMES:{frames}")
-
-    def pg_prep_next_frame(frames, clk):
-        pg.display.flip()
-        clk.tick(FPS)
-        frames += 1
-        return frames, frames < N_FRAMES
-
-    def pg_finalize():
-        pg.quit()
-
-else:
-
-    def pg_init():
-        return None, None
-
-    def pg_draw(surface, fractal):
-        pass
-
-    def pg_test_quit():
-        return True
-
-    def pg_update_fps(clk, frames):
-        pass
-
-    def pg_prep_next_frame(frames, clk):
-        frames += 1
-        return frames, frames < N_FRAMES
-
-    def pg_finalize():
-        pass
diff --git a/demos/mandelbrot/mandelbrot_demo/mandelbrot.py b/demos/mandelbrot/mandelbrot_demo/mandelbrot.py
deleted file mode 100644
index 4feb7bb..0000000
--- a/demos/mandelbrot/mandelbrot_demo/mandelbrot.py
+++ /dev/null
@@ -1,92 +0,0 @@
-import time
-
-from mandelbrot_demo.impl.impl_versioner import init_values
-from mandelbrot_demo.impl.impl_versioner import mandelbrot
-from mandelbrot_demo.impl.visualization import DISPLAY_H
-from mandelbrot_demo.impl.visualization import DISPLAY_W
-from mandelbrot_demo.impl.visualization import OFFSET
-from mandelbrot_demo.impl.visualization import ZOOM
-from mandelbrot_demo.impl.visualization import pg_draw
-from mandelbrot_demo.impl.visualization import pg_finalize
-from mandelbrot_demo.impl.visualization import pg_init
-from mandelbrot_demo.impl.visualization import pg_prep_next_frame
-from mandelbrot_demo.impl.visualization import pg_test_quit
-from mandelbrot_demo.impl.visualization import pg_update_fps
-
-
-class Fractal:
-    def __init__(self, w, h, zoom, offset):
-        self.w = w
-        self.h = h
-        self.values = init_values(w, h)
-        self.zoom = zoom
-        self.offset = offset
-        self.need_recalculate = True
-
-    def set_zoom(self, zoom):
-        old_zoom = self.zoom
-        if self.zoom != zoom:
-            self.need_recalculate = True
-            self.zoom = zoom
-        return old_zoom
-
-    def set_offset(self, offset):
-        old_offset = self.offset
-        if self.offset != offset:
-            self.need_recalculate = True
-            self.offset = offset
-        return old_offset
-
-    def calculate(self):
-        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)
-        self.need_recalculate = False
-
-    def update(self):
-        if self.need_recalculate:
-            self.calculate()
-
-
-def main():
-    ds, clk = pg_init()
-
-    zoom = ZOOM
-    scale = 1.01
-    incr = -5.0
-    offset_x = OFFSET[0]
-    offset_y = OFFSET[1]
-
-    fractal = Fractal(DISPLAY_W, DISPLAY_H, zoom, (offset_x, offset_y))
-
-    frames = 0
-    do_game = True
-    t1 = time.time()
-    while do_game:
-        # Test for windows close event
-        do_game = pg_test_quit()
-
-        # Draw objects
-        pg_draw(ds, fractal)
-
-        # Perform updates
-        if frames % 300 == 0:
-            scale = 1.0 / scale
-            incr = -incr
-        zoom *= scale
-        offset_x += incr
-        offset_y += incr
-
-        fractal.set_zoom(zoom)
-        fractal.set_offset((offset_x, offset_y))
-        fractal.update()
-        pg_update_fps(clk, frames)
-
-        # Prepare for next frame
-        frames, more_frames_flag = pg_prep_next_frame(frames, clk)
-        do_game = do_game and more_frames_flag
-    t2 = time.time()
-    pg_finalize()
-    print("Avg.fps:", frames / (t2 - t1))
-
-
-if __name__ == "__main__":
-    main()
diff --git a/demos/mandelbrot/mandelbrot_demo/tests/test_dpnp.py b/demos/mandelbrot/mandelbrot_demo/tests/test_dpnp.py
deleted file mode 100644
index cd4f2b0..0000000
--- a/demos/mandelbrot/mandelbrot_demo/tests/test_dpnp.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import dpnp as np
-from mandelbrot_demo.impl.impl_dpnp import mandelbrot
-
-
-def test_dpnp():
-    w = 2
-    h = 2
-    zoom = 1.0
-    offset = (0.0, 0.0)
-    colors = np.full((w, h, 3), 0, dtype=np.int32)
-
-    colors = mandelbrot(w, h, zoom, offset, colors)
-    s = colors.astype(np.int32).sum()
-    assert np.asnumpy(s) == 2055
diff --git a/demos/mandelbrot/mandelbrot_demo/tests/test_numba.py b/demos/mandelbrot/mandelbrot_demo/tests/test_numba.py
deleted file mode 100644
index 6766b48..0000000
--- a/demos/mandelbrot/mandelbrot_demo/tests/test_numba.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import numpy as np
-from mandelbrot_demo.impl.impl_numba import mandelbrot
-
-
-def test_numba():
-    w = 2
-    h = 2
-    zoom = 1.0
-    offset = (0.0, 0.0)
-    colors = np.full((w, h, 3), 0, dtype=np.uint8)
-
-    colors = mandelbrot(w, h, zoom, offset, colors)
-    s = colors.astype(np.int32).sum()
-    assert s == 1405
diff --git a/demos/mandelbrot/mandelbrot_demo/tests/test_numba_dpex.py b/demos/mandelbrot/mandelbrot_demo/tests/test_numba_dpex.py
deleted file mode 100644
index 5d74766..0000000
--- a/demos/mandelbrot/mandelbrot_demo/tests/test_numba_dpex.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import dpnp as np
-from mandelbrot_demo.impl.impl_numba_dpex import mandelbrot
-
-
-def _test_numba_dpex():
-    w = 2
-    h = 2
-    zoom = 1.0
-    offset = (0.0, 0.0)
-    colors = np.full((w, h, 3), 0, dtype=np.int32)
-
-    colors = mandelbrot(w, h, zoom, offset, colors)
-    s = colors.astype(np.int32).sum()
-    assert np.asnumpy(s) == 1405
diff --git a/demos/mandelbrot/mandelbrot_demo/tests/test_numpy.py b/demos/mandelbrot/mandelbrot_demo/tests/test_numpy.py
deleted file mode 100644
index 77c0071..0000000
--- a/demos/mandelbrot/mandelbrot_demo/tests/test_numpy.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import numpy as np
-from mandelbrot_demo.impl.impl_numpy import mandelbrot
-
-
-def test_numpy():
-    w = 2
-    h = 2
-    zoom = 1.0
-    offset = (0.0, 0.0)
-    colors = np.full((w, h, 3), 0, dtype=np.uint8)
-
-    colors = mandelbrot(w, h, zoom, offset, colors)
-    s = colors.astype(np.int32).sum()
-    assert s == 2055
diff --git a/demos/mandelbrot/setup.py b/demos/mandelbrot/setup.py
deleted file mode 100644
index 7f1a176..0000000
--- a/demos/mandelbrot/setup.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from setuptools import setup
-
-if __name__ == "__main__":
-    setup()
diff --git a/demos/mcpi/.ipynb_checkpoints/mcpi-checkpoint.ipynb b/demos/mcpi/.ipynb_checkpoints/mcpi-checkpoint.ipynb
deleted file mode 100644
index 7e28d51..0000000
--- a/demos/mcpi/.ipynb_checkpoints/mcpi-checkpoint.ipynb
+++ /dev/null
@@ -1,387 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "id": "9b84948c-bb52-4eb4-a33c-27592513be8c",
-   "metadata": {},
-   "source": [
-    "Monte Carlo $\\pi$ Estimation\n",
-    "============================\n",
-    "Monte Carlo methods are closely connected to the problem of numerical integration. Specifically, this particular method relies on the fact that the area of the unit circle is equal to $\\pi$. If the circle is inscribed in the square of size 2 then the ratio between areas of two figures will be $4/\\pi$. Now if we draw points $(x, y)$ randomly within the square and calculate the proportion of those in the square to those in the circle the proportion will be approximately $4/\\pi$. Large sample size is more accurate the estimate.\n",
-    "\n",
-    "Using this method we will generate random points in batches of size `batch_size` and compute the $\\pi$ estimate for each batch as described above. The total number of batches is `n_batches`. With each new estimate we will progressively show how the overall estimate converges to the true value of $\\pi$. We will also display an interval $(-stdev, +stdev)$, which is the measure of accuracy of the estimate"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "id": "6ae615da-c4d4-43dd-b30d-402b8f5972c5",
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAH/CAYAAAB93iaPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOx9B5wV1dn+u7tsY2HpXZprQRCQjnSiYkmMHRTD55eoiX9jLKSpgUSwx8QWSzSfibEBEmNLMIpGQUQsIKBSReousPS67C67+z/PzA47O3vLlDNnzsycx9/17lzunTn1Pc9bznsyahhIQUFBQUFBQUEiZAZdAAUFBQUFBQUFKxRBUVBQUFBQUJAOiqAoKCgoKCgoSAdFUBQUFBQUFBSkgyIoCgoKCgoKCtJBERQFBQUFBQUF6aAIioKCgoKCgoJ0UARFQUFBQUFBQToogqKgoKCgoKAgHRRBUVBQUFBQUIgXQZk/fz6df/751LFjR8rIyKDXXnst7W/mzZtHAwYMoLy8PDr++OPpz3/+c4PvvPLKK9SzZ0/Kzc3V3l999VU/iq+goKCgoKAQRYJy6NAh6tu3Lz322GO2vr9+/Xo677zzaOTIkfTFF1/Q7bffTjfeeKNGSAx8/PHHNGHCBJo0aRItW7ZMex8/fjx98sknflVDQUFBQUFBQTAyRB0WCAsKLB0XXnhh0u/8+te/pjfeeINWrlx57LPrrrtOIyIgJgDIyf79++mtt9469p1zzjmHWrRoQTNmzPCvAgoKCgoKCgrC0EjYk2wAJGTcuHH1Pjv77LPpmWeeocrKSsrOzta+c8sttzT4zsMPP5z0vuXl5drLQHV1Ne3evZtatWqlEScFBQUFBQUFe4Bd48CBA1r4RmZmZjwIyrZt26hdu3b1PsP10aNHaefOndShQ4ek38HnyXDvvffStGnTfCmzgoKCgoJCHLF582Y67rjj4kFQAKtFw/BAmT9P9J1UlpDbbruNJk+efOx637591KVLF/rjH9dQ8+YteRRbUlRSfv77VFY2lv2dHXRhIllXhFeZPJJ0yilEN9wgbz3hGf3Xv+quv/c9onPPtXwJc66yAqZH/VXBXkfYdcURojL2qmB/V1UR0xxgjtTfDWAeZmXp79CsjBemZwbecV37b9rftdqX9u+mOZxVQ/kDtlPZYqaMVGXUlQviQHtnz8Wrqrr2s9rr6hq9THjheygn/raWr1Ej/T2LvefmEuXhlcf+ziHKwTtr2xz2WTa79nHc5OdX0uOPv88swGPpJz+J8hzVx+3rr4+lNWuyqaiImLVc74JowV859JhweZMYe/fupp///CRq2rSpr8+RiqC0b9++gSWktLSUyZJGmjsm1XesVhUzsNsHLytATtq00e8bRdTUVLJXYyoogCsrysJPfF2x7s2eTVRSwtZutmabBUabNvLW85tv6srbiCqoeOURanMO++BImU4+WHwXHTyokxC8DPJhLOzMzaot4sYCb7xzdpXWZFZTTWPUszFlVHM0IYOsGOQKL/ytEa9D9euKeubk6KQFQhgvyJD8/FpCk6fX3SUwTr74Ao+qpMasnj16tGLjJrpz1Bi3b7zRii3e2Vrd0byXXx50ycIlh06pHTei5E06+B0iIRVBOf300+nNN9+s99k777xDAwcO1OJPjO/MnTu3XhwKvjNs2DChZVWIN0BOXnqp7hr8+IwziC67LLgyJQUsCbCEHDpEQzseovKlB6gl7aZ8KqNheZVECyv17xgLs0ZC2CLcpIm+CEcpTsuw6NTKk4TQrEKsTSoqtTZj6mIdeTF+C5LWhJGWFi2IrUZ1r1T3NcEYJ+vW6e8XXeShTiHFihVBlyB8uOyyurbr2VNSeRMWgnKQaWLfQGUzbSNeunQptWzZUnOxwPVSXFxMzz333LEdO9iSDHfMtddeqwXEIkDWvDvnpptuolGjRtH9999PF1xwATMZvk7vvvsuLViwwM+qKEQQhhXEPNntmpytwpWFRwWnDZorApXq/PNrCQmzhOw/wBbYPezvw5rp5Ow2VdS+XxZt3pFLbY/LoX7DYRHI1hdeLMyYR8yvTJ07E40YISc5SVROnoF6uBfcO3glejYsS3CBsbg4zYQGgMgZ1hYm33TC0piocYFuKkgy3vAocEMf4wylBdogDrKCJ7Kyomd1CoygfP755zR2LHxxOow4kKuuuoqeffZZ2rp1K23atOnYv3fv3p3mzJmjWUcef/xxLUL40UcfpUsuueTYd2ApmTlzJk2ZMoWmTp3KfJlFNGvWLBoyZIifVVGIuBWE8WYNdic/hJTxG+M6MMn5/PNE/6zNFbSU2X+hFPTpoy+mWPlgDcGLLZ5ZbCHtz9b0/onuhUV//jz97/Xf6u9MGZAOQZYT7QkiopER0+eVlbqbbPcuRPvrrMNCWubML6RX3yhkdqt8NnZ04jdhgphiywIs7MuXh0/79yIrFCQlKGPGjDkW5JoIIClWjB49mpYsWZLyvpdeeqn2ihuLDvr5UYPVCuLE5ByYqbWaDQKsbdDc9xzQtXhrksLVq4m+8x3b7oZjgEUi1bUskLGchmusAWlh8S27dxPTxqjR5xk0kvLoAPvSDmpDJV8UEn2fWVkYh4kLoGsGILqFywrkFjUTMSWnIxCDIjuCZtFBPz9q8GIFEWZqBStFHASCVxELsWcH0XD2OUg8gkehoXfrRlS8pe43+/chqZBzqwLcJYZFwriWEWEp5zHSorOWJkXVdKTkCBXSPmpLpdQ/jzHNj5hli8UuaVavQhbP0rRQD8SV0bUWYziVFZDVZcygpuS0NyiCIkjj5oGgnx81SBtwhhgHkBFo3tu31+2qgXuhoDYuon175kaoNZ8xqyN9/ZX+Gy9WBcRyGL81YjtkRFjKacGwkZlUk9GYFbuxVuw+w7CjiK1ixPp21Sp9OzUIZ7Nmev82b85IS+Ex9VtZUMMpK5Scdg9FUBwg6LiDoJ9vICqCMpkVJJD6wUqyhwWz7mIxDKWlRIcP6zEkjRvrixQCLbXcIsjpsV3/2/Cegrj06VsXl+HWqoD7yBhzYoXM5UwRwJvVoNiMsOQwawnt16OssVEILqE9jJhu28qkc631BWSFxbC88k5zeullPeBWaeb25i3AYy57sZjaldN+yp2qkMpsRVBCpHEH/fy4uJqE1A8S4wBbmPbs1a0ksH7AJozFrEkBUdu2ziRISK0KkYOXAF70PQgpXgCsZiCuyMzF/i3748bUmzmHdlEr2kMtmBxg4yRk8DM2I9G8BYKQVW6Cgf2UO7NDKrMVQQnRFq+gnx8XV5Nv9YN2DSKyC9tTt+quG2wHxg4bbEuFSd/tflOZrQpxAs8AXljN8EKuFUZoO3Q8RN02b6Du9C2VUz71LmTjZSOzvCCJJXLWSIJE2roxrP2MzbAzb0XJKjfBwH7K1RUhldmKoCg4NgXK4mryC1zrh11sBw7orpviYt2NgyRg+bWumwQZjhVCDL8CeNkkHHRGIVXkFtLmTdXUs8MRGnIyG1NLSvSxhHSiyBbYurUexxIgEmnribZT814kk83bsMgqP+Vqz5DKbEVQOCOsvj4npkDRribRbcqlfjDNg5Rs3aq/I7YAC0eL5okTgClEAz662upiWGCOgBuosU6AYZIA+d20kVnimuhEBS9YVpxuNReorfNeJI15+tVXerN8/bWetxDkCDvvRcgqL/BTrl4mSXiAUyiCwhlh9fU5ES5uXU1uiYboNnXtSoO7BmQEMSV4lR3WD5tDoCM0WwV3brH5PmaN5Q3RrjYESxtxK2grEOMNG5C2Wx93CL5FPBPcRII0pVTaup+J2ox5O3NmnbxYtoxo4kSi6dP5PiudK0s2F36WJOEBTqEICmeE1dcnwhTolmh4bVNfLTBYFOC2gaVka21cCaQU3DdeYkqikjbebVmKuhL1LyJatCgc2W1lAPrNONhQC8I+oJsO1q7VxyL6F2TF53iVVNq6iERtomSwXVeWgnsogsIZYfX1iTAFuhUcXtvUFwsMrCU7dhBt2aK/I64ESbagsXpZ4EUTBpnS25vLso3V/4YivX1lyxobBoCBg5TghYy2ICsY/LC0YIx27EhVzVvS7FeybBF3JyQ/kbaeIqG4p2cl+n6PHqnlBS+Fxa4880tBqgp5OIEdKILCGWH19YkwBbolGl7blJtGBSmLjK44awULJzK2IlcFFgFewa6iCYNMaeMTPfu444hWMQuA7FljZQbiUHCAIdw8cAHB/cPcQB+vbsWGW2faTm3ZvEQ+luRzX6Sb1emzrN+HFQNunWTywktdzKQAf5uRTJ7xel5PCwkJeziBHSiCwhlh9fWJgFui4bVN7RKjpMIAGqhxci1iS8qP6MGIHTryt27wIgx2LTEypY23lgUYOpSoojqY/C4yub94xavAvYMXG9N7/rOX+lEpHaSmVEydaNOy9kTjE7slRbqunT7L+u/waqWKOfFSFzMpAHr31mVEKnnG63lLLSQk7OEEdqAICmeTWqLvAFE3xclM3uwSI6swaFRxmC4dvlVfoJC/BIIbacj9DHjlRRjsWmJkSvBmLgtiUIKGTO4vH6wqzYra0LLiaipgFOVkWk1981gdP2ujW60Qq2LaAWSX5POA02f5/f1UJAAyzUyGErmyeD5vhelaZJ8EBUVQHMCOSS3Rd4Com+KiQIyMyV9AB6gj0ymzFm1i2uZB3W8Pgd1IwHThRRjsWmJkSvBmLouR0j/IIFmZ3F8+YLg2tDJZtQrZUCukfoPK9WMWEOwNd1D3bkTtO2jJ4kS6rp0+y+/vm+GGFPj1vMtCHk5gB4qgOICZvSa6dvsdBTnQr/teqly6hRm7t1BjOkwdOhVqwYRCzfq8CINMrhsvCDJINiptmAQNzwZicVT57VjA91HdYrh4iR5f1bUrZbHA2ssvz5fS0ur3981wQwr8el5WDMIJFEEhvuw52XeiboqTDbYj3GGTxanBmzbR99tspW6nHaFvdzenNt1a0KAROJxPeNH5QCbXjRcEGSQblTZ0ClgK4cY0jmaA8Fq3TiMqGmGXKK2+6B0uoklBVgxISCooguJgkF98cXr2nIrxRtkUFzp3HDoXga+MmGi7cth1FtMW+32vNQscjABkct14QZBBslFpQy/1x+4fWFGwTRkpWrEDCP3QqZMejyUp4rDDJQ5QBIXzIE/GeNXkEIukrjZohfCzI9smduQAEMLqTBw5EXeSIMPOJCM4HMkHDyL52yp9/sC6BauKhETFjqtdQX4ogpICapCHFw1cbacwV84OZjHZsF4/SRhCF2eV4LRYBYW4bEf2sjMJ25SRjBAv5FOB2wdb71FnEBWJXD9x2OESByiCkgJqkIcXZldb/+676fwTmca3qFiPOWnFLCbqwD6FOG5H5rUzqaBAf+FoByQewWGFICldOuunKweMOOxwiQMUQUkBNcjDC83Vdt5+Jp0YMdnChPCWSn3rZL6YnQgKMUKYtiPz3pkEqwmICmJUcHww5lq37rr7J0C3adyDS6MCRVBSQA3ykAJaHYJf8cKJwi2YxaR18FqdggN3SSlzHfQfrV/LvpUqTNuR/diZBNcP4lOQL+i//yV6ebZuTbniCp2omBK+KSg4gSIoCtHCum+Ivt2skxTsPkAArEJ44iwMd0k+FjVGUP7vL0Qn9ZI7riNM25H9DDpeuJDo00/0v7cygnnkCNFZZxF1ZxaVDq0ZkfHnsQrRPXhQERSFaMyubUwgdmB/f81mWONCfRskNDsFPkREVJyF1T2yb1/dc2WN65Bhp5EMgbrWvkMOFRyu+fnnrEztKRr796OJ2ZJuy1YERSHcQJI1WE22g6Bk6EfJq2HtHsmIiKg4i0QHBvr5vKhAhkBda9916ULUpg1RRQWzqGxjBCVD36Lc9QQVCyYZVki6LVsRFIVwoqzs2LHxmgBsB1fOHl1rRNhC3MBLg05GRETFWRjukTUs4NIMmeM6ZIAMgbrJXF3Yyt++vX620pq1RCU7iE44QbdyyuBHUCBZd6wqgqIQPncOci98841uPcHOHKTl1g6XizF4adDJiIioOAvDXTJqGLtgC1nXbkRtO8od1yEDZAjUtePqAlHZzdw+S5bohxKCqCAfkUKguEzSbdmKoCiEB7t26cQEBCUvT9fAZA2cFG0R4aVBJyMiouMsjLqOH8/aIqJ9HMdAXSN9fmWlfsQEjpvAjp/jj9d3AcUsCFQWZEm6LVsRFAX5gd0AICabNjLBdpRp1G2jv3XRqUWElwYtkojIENgZFcgQqOsEmL+IF0NG2jVr9GMnToTb5zhfmIOsQaAKqaEIioK8QNZXCC5kqoSmBc2rdUHQpRIDpxaRsGjQqUjYxo36Qovyay4ehcgDSd6QPBE7fhYzt08pc+uddJKeVyUGQaAKqaEIioKcplAEwcJqgiBYLFphcufwsAw4tYiETYNORLo2sr4GUO8cVp+BReLLpBCc2wfB7ps36bFlICkY8zaFTzq5JWsQqEJqKIKiIJcpFFYT+KZhNUHMCQJgw5aenkfAahgtIry2FANbtrD/KYISK2C3T8dOujXliy9YjDSzppx8si1rSjq5JWsQqEJqKIKiII8pFGnpv1mnbx+G+iO71SSZpSSVe8audSWMFhGnMJMwtIthQQGQIl0hfkByRezMg+sHJHXPHhabcqKeUyWFNSWd3AoiCFQaa3SIoQhKxGCeFH36EF18sbPfB2IKhdUEWw5hNYFAwrZDHDQmewBlMktJKveMDAm1ZIGZhFmJ29Ch7EOmQSvEM/hYs6Z01DMJL2XWlJ2ITWHWlGbNXMst0YQhcGt0BEiUIigRg3lSYL13SlCEm0JhNVlbG2uCmQGhBGE6f778C3kyS0kq94wMCbVkhNViFPe8Nl7gJwkWSX5gTcF5Wpo1pZgpL3uTWlPsyC3RhEGWwNyqFCREdhKlCIpESDWQ7MLrJBBqCoWPGQVGrAmsJuZYkzAs5MksJancMzIk1FKINvycO0FYALEl2WxNQRBtjx46cXEgt0QTBqtVB0bimTPFWylmpyAhspCoZFAEJSAi4XQguZ0UUuLoUT3OZO0a1pjVdVaTsC3kbgJZ4xD8qhAs/Jw7fpAfO1YZw5qCZG7Ih4RDCHueQtQOKfTldF8bVpz33tOzJeBlyHeRVooVKUiI7LubFEEJiEg4HUh2YTZ19uql/33PPURFRZL4Fw8eJFq1St9OiOj8poXhXcjdBLLGIfhVIVj4OXes5GfPbt0da9fVAzIy30JGnFhlEJvSoaNudf3sc93lgyy0NhI3inZfG1YdPA/kxItc94JUJET23U2KoAREJBKBB5s1mzr/8Q/9fflyok8+Cdi/aGwfXrmSmWqZL7l1G71QybQmtZDHKyhSgR+MuWOMixkz+I0Lg+wsX6ZvB8bLIBd2iPeiRQ3JiFOrDOqAU5Kh7Hz9te76OYVZU5o2lTKde9BWistSkBBZU9wbUARFogGXaiC5AYJkzRDB3BO6v6oridatYy6dtbpwgQakdrPwg2pLBVHjwiA/IBEgJ05dPVp+GxMMUu3GJdWkiX4mVzG754EDOklB+ny4g3x2xwcp151CdhKSCoqgSDTgeA8k5DgyQwRzt7q/co7sp4tPYVaT4uK6/AZhCYINC/xsyzhZZ6JWVz/HhVtSgfw2q9bW/50Xl1SjRnpyN7h8Pv9cPx0ZL7iCPLjjeRKbMBOEoKEISoQH3EUX6e/Ih2LEoPiNOitNDXWgEsr4jH3Q7KB+zDqESZiCYMMCr22ZamGOk3UmanW1Oy7cEDO3pAL5bSqqGz7LSzvDYoKM04cP6/FtsOwgAK9ZM9fueL/iDBWcQRGUCAPzHqEft99ez+rpK6BtLF9aRUX0DZ1Ma+i49tBwOjYsgF+BfImC8MKsBVvrtmghUX/GNhey98HD9Lp5bctUC3OcLF1Rq6vdceGGmLklFX7GlmGHDywniEjFWV6MpPTs2d6VO96vOEMFZ1AEJWDI4CPlicvOP0LtSlZS+er11Kxrc+r/HeYnzhAoqBIF4YVZC7YuJJ8xYnIDIygfLdA1UdTNa1umWpjDbulyYh0Ie12tsDsuokTMGtUqRDj9fPFiumxADzYGutOKVZmO3PFBB7Yq6FAEJWDIYErkRpL27aOsr7+msV23Mu2+LdNmcrmX1VUQXlTg10KSamEOw3bvVHBiHQh7Xd0iasQM1lokfnzvPcp68026/BRGUm77iaNDR4MObFXQEWuCgoUZ5OD99/XrMWN0ciDSgiGDKZELScIWYmz5QzQ9NJigzECJgvCiAtRlm8W6wQOpFuawb/e2kjhsj43zAY1xIWYgpp8waypQUkxUeZTouuv0nT82lbS4xpxUSWTVjzVBeeedulwhwKxZ4gNgZTAleiJJMKEjKyyC0wDLNj/hSBSEF5VdIvh+Tu33h4/QY1D8PrQv7DE8VusAAihRvzgSkWSIIjGzElOkOPjsM6JTT9VzqEhoyZYFsyVqCyGS54knnqDu3btTXl4eDRgwgD788MOk3/3f//1ftr5lNHj1MtKiMjz77LMJv3PkyBFH5UJqDitEWzDATidOJDrtNP09CFOilRTZJkkVFbrV5Msv9dOHMfGDJCdmYXvllXXxGbK5G7Bg4h3XToC6DKslJXj3o25eyygbQLCQIj2qbr84QwuIn0/04ov6O66TWReRcRaJ3VhcipYqH7sHJLNky4IVErWF7xaUWcwscfPNN2skZfjw4fTUU0/Rueeeyyq9grrgVEoLHnnkEbrvvvuOXR89epT69u3LFu76K3dhYSGttmQiAwFyAmy9/eKL+p+JtmDIsGXZlb/VyOKImA9s8XPg340twhCMGIYyOgFIXJ++dXEobl1jUbMsRQGp4osSua3QX3v2MKHPzAIHDxGddNKx1AcyWLJlceH0lKgtfCcoDz74IF199dV0zTXXaNcPP/wwvf322/Tkk0/Svffe2+D7zZo1014GXnvtNTam9tAPf/jDet+DxaQ9cmt4wLhx+vg0x6DEMRjKMUmCmXwZ8+Xv3qW7dMz5TRTsuxuw6OEVxEKXbMGNWsAkrxgLu8G2isjIQaaTua2QLNLIl1JerudLyckJJCg2qFiP2WlcODIFCPu6slQwF8BiZlK79dZb630+jjGDhcjjYAPPPPMMnXnmmdS1a9d6nx9kGjw+q2K9fBrzj9x5553Ur1+/hPcoZwMRLwP7cRImQ1ZWJV1xBV71v2+x/oUWNTWV9d65YNdOoq+Y5eQQ00A6ta9dXE2m1YBQk6mXwXiXEqOYW2bbFv2gRKCUBe99urDObSOynsingi3LAAJvEduCcqCM+BuWMQQcI6YngDbl2p8YomOspMThfUtLmJUwu/51orIla9cwj1sO8FRPLf/PIsuYZO1a1LV+0Diu7dy/CbO05zKr72YWO1ddrq3CmXn5NGGC93XAicx99VX9BcAZAD3vkkucP9MpENpgNnjj2lxXNG36tuC4pqRARg2DXzcvKSmhTp060UcffcTmaN0kveeee+jvf/97AxeNFVu3bmUKT2fG9l6i8ePHH/t8ERus33zzDfXu3VsjG3ALzZkzhyn1y5irkfkaLbjjjjto2rRpDT7HfRsjuY+CgoKCgoKCLRxmVqiJLGhy3759WriFXxBim4c7xowaxomsnyUCgmGbswC3Cy+8sN7nQxmDxssAYlv69+9Pf/rTn+jRRx9tcJ/bbruNJk+efOwapAbEp6xsLBUUtHJanZREH4wYvAvn4CDVPNhoss/9hs7i57LXWay9s73cSNdeViJaqjbHgGTQNLPTdjCbZRvKqJY4NgCWQyRZM4DdOE4tKG7qadVCcf3xQtfl8KT5hrE/7dbFYf8eq+eSVpSx8FNXbRUGeOrPl18m2rih7rprN2IaK5+CVTM/y/ZS3fUDd481oDrVTxPI9YwM+zL3lVd0d4sBPP43v/G/26s5rEdlZcy9LwC+EpTWLHgyiznVtiFHhgmlpaXUrl27lL8FifnrX/9KkyZNYi5C/eCnZMhkrTto0CBai61kCZCbm6u9GiLb28Kdwrf3yScI8NV9e8k+FwFwC9TRdT0xmmEDhM8WbYgJLKk1GqZACD8pFrRkwNZg8zZoXDssr6t6zjfFUCBPzEjmnx80zFM5HD/TyHwbyv5kZRhqcRNV8+lfrZ6MnGS8+77rthIKlwHDrvuzbcf6uY1wzW1MsPu06aCnx1+yTA+oTrANORESyXW4RuzKXBADbNLAJkgAZx3inn6vDVkszuXSS73ehd+6GRhBAbHAtuK5c+eyzqg9uY4B1xdccEHK386bN09z4yDANh1AZpayaB+4fGTcniXTti1HwIwDzQbxgxkvSZIjhRDknLAGFEJTx1Zskc8M+44gP/s3TBmQRR+q6HciOfQZNlwwxVnbhox1hIUmpINXuQ6igJede1RJlDxNJHx38cC1AivIwIED6fTTT6enn36aNm3aRNchq1+t+6W4uJiee+65BsGxQ4YMoVORWMcCxJPAxYN4E7hr4NYBQXn88cf9rk5KJNueJdO2LduDHTlO8AUIoJatUm8jdqlRKQhEELtzorgjyC+EKQOyaOIpgtQj5ABW/d27dWEN+deNuZJShCLwkOt27zFbouRpkSIoE5jNa9euXTR9+nQt6BWEAwGtxq4cfAbCYgYCb15hDjoEvybC3r176cc//rHmOsKWZOzemT9/Pg0ePNjv6qREsu1ZMm3bsjXYkfAOdkf0S9u2umsnTsfURxFBpDOPYgr1OGZAjhPxbNlSO1OMli8nqmTxJCeckFTZ4iHX7d5jRVit8GEIkr3++uu1V7JAWCtAOhAlnAwPPfSQ9pINsEIkYrXJPg8KKQc7yAkmJwQlzJ7ZNnyNcTDlh91KFIRrKYop1MPSVn6O16gTT+ThgtCGYEQ7IqFbgrZLJNed7om1uzb0lMwKLwqxz7Dl1rcXZp9g0sFeVqYnYGMuN0cJ2KKsURlQVqJ4Ebqwt6+f4zUOxBPxdnDvrFypXyN9RYAC/jLJrPCiEHuC4ta3F2afYMLBXsYsVsuY5WRrifPssFHXqKJuJXJCJlJ91/xv+NvYGqrcfvyRjoBEebyKQkFBHUnBeMae3IBISpZkVnhRiD1BcevbC7NPsMFghzsNLAvbweHWcZq6Pg4aldVKhGNWuIgAACAASURBVKBGHFAWBQuBE2071XfN/2aFWiD5wtqey5fVH4MyWDXNhBVZXvsXiS+DVxiJPFev0utzyilSmMqrQmzBd4LYExS3vj0vPkGpBpeZnMBykq4gcTXdW61EaIcPGUGJgoXAibad6rupfud1gYzruEsGKwHB+Vhon1SH5YmGmbAiJf0NISQoBkmBJWXtGv29R4/A2cDsEFvwnSD2BMWtb8+LT1D04IJsT0iI4NZBAbbbJCdxjsWwWolwxHtULAROtO1U37X+GzJ+GgcQel0g4zrukgHtCasJiImTw/L8QDLyGOY5YQXSLCDdwprVOkkJ0N0Tdgu+E8SeoLj17XnxCYoeXEhr3IAQXQBysqzOrWN3sinftjwmdF5wom2n+m6yI+55QI27+kC7Iuup2aUW1BhMRh6tcyQkQOLPb7evodkLnmV/V9Ntl91fn6QYZ8gFSFJ6ct7VI5VV34TYE5QoDK5Uig3I/ltv1f987VdHiLohIHar85iTKC3MXiCDCZ0XnGjbqb7rp9Ye9nHnh4tKljGYjDyay4cYFMlJyTdbV9FHK9+jhSv/S9v2Fmufty60HMkCkoJzewySAndPAK7Gyzjv6pHVZaQISgDgPbhSWU4uvpjo4MG6z7KpgkY1Z+SkpMRdQKwsQjFoxCEwWKZYkbCPOz9cVLKMwWTk0Vw+HBZI24UXzQ427fiWps+cTKX7tlJh4+bUtU0Rbd9bQjXsv8uGX5U8cHbNGj1PFJK52Tj8VuZdPSskdRkpghLhLWMGyTfQrOAo/WjQ1zSiyxZ35EQmoaggJ/yKFQn7uBPhogoqkNhP8iigTnmNcmlkYQ86LX8o7SrMoUfXzqaTOvWitSUraViP7yT+EUgKyoYtyCApSIsfYvSUNBGcIigcIKv/Di5SA5lURVcNXUVju6zXT+t0Q04UFNJBxYrYtzJggVu0UN9+u3ChfvKxl8U3qEBiP8mjgDq1/XIdXbW5gN6n9fTotqU0tt0g2t6oivp0G8CUOubOSZXMDcL/6691kmLjgEG/1pYqj2uQKKu+U6hVigNk9d8ZB0j36V1DgwpX09idrKBrd+lsP+7bNBX8QdhjRURaGbD4frZQ33770QL9LB4vi28UyaGIOrF7/pe20CO0lM6gznRldm+6etOzdP15t9qz6vQ8RT+7DCSlTQpC4+PaMtvjGiRrIjhFUCLsvwP/wNkQt0/cQBl/n8VG7hL9HzZt1N+9CEOVl0IhirEiPObCsGG6RcTqlrDON96LbxTJoYA6vZe9nR5l5OQsRk6upz70XuMDLKQkg4aePMa+VQfBsjgmZEBfoubi15YVkq5BXqEISoT9d8eALIg7d/IVhrxNr4rwRANhjxXhMRc2brSX5h+LLRKYma+9IIrk0Oc6vbfsX/TompfprPZD6Pq8wZTZpQv16tmVJvfqywJmmyWWT3t2178JPhs5Uk/Z8NVXrIzeymR211Sxv81ItrZIvwa5hCIoHCCr/45KtzOTI3vPziHq3p1NpE38hCFv7U8l4lIIK6xjf/t2e3MDi21OrZt1+Ag9BsULokgOfazT3KVv0GP/uofG9buA/t95v6bMDL0vOuLV2rItOtUxDpCl2MXTrh1TBBlJoQw9Q3eBieA4gNldA/TurbtgUq0t0q5BHhF7gsIjwFVK/x0sJl+x4K2x7O/mzflrIrxNr1H0nyvEA9a5AL+q9d+TLb5wB2H77dChbAFUqfxF4Z0vGDn59910Tv+L6bpzf3mMnCSFVR5BprZoWV+Woj/btmV/7NADZ/v0J8rLc1w2q3smi60v06en/o2UaxAHxJ6geA0ukpI47d9PtHw5C7or908TkZ3wKCiIgjH2jdTz5UfqFjFke7UzNxYtUqn8BeHtJa/R43PupXMHXELXnfNLLd7EsXxCvyaSp8bGA7h7shhJ6dvX8Y7JqLpr3CD2BEXW4CLXxKm8XPeDgqR0QhbEUn8KKDvhUVAQBWMuYOyaz8aBhm13jmzZUv9aWRB9wX+WvEpPzLmPzht4Kf3k7F/YIydu5FPbNvpmBGSexQnIDhK5RdVd4waxJyiyslVXxAlmF3zROJnYmBTYUbBuo9ynwEbRf64QL3ixAh53HNGqte5+q2ALby3+Jz351v30vUHj6dpxk+2TEzfyqVG2TlDXsj4tKCDqaj/Vf1TdNW4Qe4IiK1u1EidwD7ySunng98Zk2LBeZ+/aF5FemvQcC2WVcp0Cq3btxA9R73MvVkDEoCAPirIg+oI5i1+hP7/1ezqfkZNrnJITt0C22YoKfXHB30iQqeAIsScosrJVECXk/sELwDvcPknLChMxCErzFkQ5uclv7MV0zHOBUbt24oeo97kXK2DULIhWWTHK4w4lD/j357Ppqf/8gc4fPIGuOesWMeTEAOKQsKsLAnzgQKLCQnHPjgBiT1BkJk5Wa0lSNw927BjplmFOTAUvpmOeC4zatSMn3JBQu78Ja59H3fLjB6yyAtupBxYJ759/fTabnn77D3TBkCvoR2feVEdORPYpLCc4OR6xgQMGEOWmUCBDsGtVJBRBCXt8DI4qxsCvrNT34ScCciyYY1DcgucC4/eunTAtKjKV1Q0JtfubsO7UCsLyI9OYcAOrbNCCgIuE9s+bn86iv7zzIF04dCL98Iwb61tORPYp+g2yGbGBYAZ9+gTGCmZLums1GRRBCXN8DPybsJwgs2EHpBdKAuRaGMphVwzPBcbvXTthcifIVFY3JNTub8K6UysIy49MY4KHrEAQsF+ELUH/vP7JDHpm7sN00dAr6X/P+FlDt471N9gi7icJxFZjWFIQI4h4lJNOcrSzJ+q7VpNBEZSwxsfAVrdqFVFxMVH79oknFiY18PLLLHC2o/cJyHOB8dvnHiZ3QiphKdqX74aE2v1NWOMsgrD8hGn82pEVCAJGAjOMZzcJ6VIRNkv/vJ6xnpGTN+ni0yfRVd/5aeKYE2ufYns4nuHn+IRrpxmLSVmzRnfFeyVtEdq1mgyKoIQVOO/jWzbBWrdOnggIyZ/g98W5IMYWRi8T0FhgjEVzxgx5zc9hciekEpYiffluSWhYLSN2NfUg6hem8WuHjGZWe0tIl4qwmfrntYxv6a/fvkmXDPsf+p+x1ycPiMVvjMR6yZ7hB5o0qdvZ06RA39QgEJdJums1GRRBCSN27apj4alSKVv9vrwmYBjMz9ZFBW6u+fPl9OmnEpYifflurRxhtYw4Gdui6xcl0scjIV0qwlY7/l79+AX623v/okuHXUWTxv6/1Lt18BtkgzWfryOKBLZsSVRSwljCSs9Bs1UOg15l3bWaDIqghA1HjuijERljkYwtFawmRF4TMAzmZ+uiCXIiK6lKJSx5+/IVwjG2o0T6eCSkS0PYXln4PP39v4/R+OE/pCvH/MTeVuIgSSCCZrGzB6khwCxcKkuzQxb06hSKoEiMBuz4kmrKQtxJaSlRp07pb2D4fbt2q4tBiav5WZaFx6mwTObLV/BnJ0wYx3aY4DYhXQrC9srC5xg5eZwmjPgRTRz9Y/t5ToIkgTBltGpFtG4di0tp5nqcrQhZ0KtTKIIiMazsuNneTXRu+w36iZl2GLfxnfHjmbDOjLf5WfaFJ5mwTObLV/DHFRnGsR0mcCYFsz96lp5//0m6fOTVdMWoa8UmYfMKnNNTVka0krl6mjbVk7pFPOjVKRRBkRhmNtyCdlHFcmY9Ob4x/0Q/TjXNMJqf1cITLdgZs26sZmEc2zHFywv+Ri988GeNmFwx6pqgi+MOLVrorh4Ie2SazcmJdNCrUyiCIjEMdpxDR6gnraDj2rK4k+Zp4k5EaJphTCKlFp5owc6Yld1qpuAasz78K7047ymayMjJ5WElJwAsPrCII4kbNj706uUoP0pWyIJenUIRFImhsWFGBso+XU2nFZZSn7NSJGPzAqeaZhh28ShEG3bGrB9WszCS84hh5vz/o5fm/0WLN4FrJ/RAmgjs7EHaCLh5VCB8XdMc+0tBOmjseDgThAUs7qRFG6Jsn9IjO9U0ZQ84VYg+7IxZP6xmipwHipfm/YVmfvh/9IMx19H4ET8MtjA8geyy2KFpxKMgcFZBERSpsW8f0erVeq6TVPlOvMKppqlM5wpxjSlS5DwQ1NTU0AxmNZn54TNajpPLhv9vMAUREY+CnZrIj9KoEZfcJ2GGsqDIiqNHdXJy+DBRR59cO241TRVwqhDXmCJFzgMhJy/Ne5pmLfirlh320uFXiS+EyHgUJHFDhvCioljmPjFDERSZU9kXb2EDNskJxXFbHJTvX0EGhJ2c251Hksw3kJMXP3iKXv7ob3TVd26gS4ZNEl4Gz3DSlrCaIB0+Eri1bKlbVWKW+8QMRVACRFJTHVKeY4A2Yb7I7OwgiygPlO9fQQaEYTdYqgXR7jySYL6BnCDHyT8W/p1+eMbP6KLTfyD0+dzgtC0RfwIryurVuqvHsgZEPfeJGYqgBIiEprpLa107CJhK5tqRRLsRCuX7V0gGv+cDr/snvA+/YtpaEO3Oo4DnG8jJc+8/oWWJ/eGZN9JFQ6/k/xBRctRNW8LVs5WRlI3M1XPCCbHKfWKGIigBIqGpDq4dsGec1ZAMEmg3viGZ0IiT79+O4HR7bH0UscDn+cDr/onuM2aE2AXR7jwKcL6BnCB1/T8/fp6uPutmumDIFeEcN17aEq6ewkKib77RXT14xST3iRmKoAQIq6muX/c9ta6dJkkjuCNvTUgmNMLu++ctON0eWx9FeJ0P6Qhhuvvb1cRFzdtUC6LdeWTnez5YIEBOnn3vT/Tqohf9JSci+8Ot7GpaqO/qgUUdWWZj6O5XBMUjvGz5Mpvqep18lL7fnQ3E0hSuHQNRtiYkExph8P2LFJxuj62PIrzOh3SEMN397WriouZtqgXR7jyy8z3OFgiQk7+99yi9tuglunbcZDp/8ATX97IFUf3hRXa1aUO0jZGUDRuITjyRb7lCAEVQPGLWLKKZM/W/YQ2BUjFxor3f1jPVfcMG4Jdw7bRP/8MoWxOiTL54toH12Hqcbj1/fjxdPl7nQzpCmO7+djXxYcN0F+727boLF9d+QBSZ52iBADn567uP0OufzKAfn/1z+t6g8R4LR+LlKIT/ooVE/YuIFrL3wcO8z8FGFlcPTkD2EbLlWFEExSPef7/htV2Ccgx79ugDECY9DMh0iLI1IUzky68gOzttYD22ngn42Lp8vM6HdIQw3f3tkmosWhuZIgLgHdd+xKCETJkAOfm/uQ/Rm5/Oop+c8wv67kBBUZ+85ShkwWesT29gBOWjBfr85HH/piZXz6BBvrp6kuVYsRKXMWN8K0I9KIISNNDz36xNvWsnTggT+fIryM5OG1i/8+KL9f89zi4f0aTY7u+jFjtmrTcsQg6teBo5eedBevOzl+m6c35J5w28NPUzZd7B6Gf/tmmjWd6qNm6h2Z93983CkSzHipW4VFTwe2YqKILiEWCScPOYrx0BzLi4NnOgQrgg04KjXGPBkWK7vw9LH9klAdZ6g5w4IOwgJ0//5w/078X/oP/Xaiyde7it/uxUhEPUzhs3QFtts+yY4oVGbKkuKKDPZn5Dr3/ahg5RE1+yyCbLsWIlLuvW8XtmKiiC4hEYHGCwrvakw2qCXTs5OfpLwT0g2ICXXyZq21GMZiXTghMm11gQkEHzFr0zxu293JIAB4Qd5OSpt/9Acxg5uZ560zm7CuqemepZMikFVqB9c2rbd/gIPQaFJ5o1o72bi6k7raOvqA/7IIN7FtlkOVasxAVZ+L/4gu+zAyMoTzzxBD3wwAPMWLCVevXqRQ8//DCNHDky4Xc/+OADGjt2bIPPV65cST169Dh2/corr9DUqVMZk1vHGquI7r77brrooot8q0MyeNqTjuO1EX8SF9eOn4sEtt0OLNJ9+0bwqN+alUykIEyusSAgg+adsI9qibUf5Ux2L6/bqj0S9uqaanqKWU7eWvwK/bTVd+jsXY3tP0smpcAKtKEW+Lxdf6/O5H5WT2H3VtRt6ybaRh1oJ7XlnkU22XpmJS7wFPzjH3yfHQhBmcX8HzfffLNGUoYPH05PPfUUnXvuuayiK6hLly5Jf7eaBQQVInq5Fm3gg6vFxx9/TBMmTKA777xTIyWvvvoqjR8/ns25BTRkyBBf68MtInr3bn3rWPPm8vhQw7xIaNtui8RqVooUhAcya95+lTPZvbxuq/ZA2DVy8tYf6T9L/kk3fPd2GnegRV1Z7DzLqVIgg+WMI4aMyafcI/upcNdayhjagi69LFvI7hsrcdmxg9+9AyUoDz74IF199dV0zTXXaNewnrz99tv05JNP0r333pv0d23btmVrN1u8EwD3OOuss+i2227TrvE+b9487fMZM2bwr4QFdgdD0lMncYN13+iRRnGKPfFzkcC2WzNk0qwUgocXzduPRc64ZymLP+s/utZFyTljcrJ7ed1W7ZKwV7M6PvXv39M7S96gn33vN3TWad+vc83afZZTpUAGyxlHZLHqDxjXigZs30bUl7VZ1vGRPuHYV4JSwRbgxYsX06233lrv83HjxtFCbLFLgX79+rEQjSOMAPSkKVOm1HP7wIJyyy231Pv+2WefrREUEbA7GJKeOolU9giMNVmFYgE/zbPYdkuM1nftVheDoqDAwx3nxyJn3DMfGvBo3UU5dARft2Gye3ndVu0CsJxAKX13ybsaOTnztPN9e1YoLWeOA2ab6KkpcGZPkyaRPeHYV4Kyc+dOZiyoonaWc2VwvW0bY4AJ0KFDB3r66adpwIABVF5eTs8//zydccYZWmzKqNqBjN86uSfug5eB/fv31/5VyYK1Kh3XCxHM+fn1r5GGwoo+ffSt6+brmjIWGLuexUg0ZkGxuVkNfdCOkgIt0l0bsB5ggbZodTWZ+r2N98AxapgeRFavzHzKVlNb9ZrLLzX5fiWpN0dI16dhqSeGRIOcIzbvDSuHRiRM117LVXvPmtr71uzYqt/TSzmtSHYvH+dhMnLy+L/upfeWMnJy4e10Rp/vUo2ouVnUtf7OGlz7WFdh87NFU30H6LdriE49la0tGQ3XmgRrEj84XzfdIINFU/tWjRJmKejUqZNmLTn99NOPfY6AVhCPVatW2brP+eefz+KDMuiNN97QrnNycujvf/87XXFF3TkNL774ouZKgtXFijvuuIOmTZvW4POXmBmkcWNTgJaCgoKCAjfArfP444/Tf//7X7rxxhsTboBQCB8OHz5MEydOpH379tWLFQ2VBaU1i6/IYsEZVstGaWlpAwtIKgxlDP+FF144dt2+fXtH90SMyuTJk+tZUDozs2ZZ2VgqKEicOviVV3RXjgHEmVxySZ3xgsXlaoz15JOJBeradEnv3Uv06adEeXnannZPwHZaIyslANcGCxQ2Q2PxpzG3x9I2lME7olwypK0rXIrI7mgA2wD9SjXuI+LSp1LV04a10vH9mJuavv6KavKYCH74e0RLWlFGxLI+VFVX0WNv3ksfLH+fbrpwKo0Z21+O/ozSuN1RyqwpLfTDBLPEjZ+ysl1CnuNrjWDpgKtm7ty59bYA4/qCCy6wfZ8vvvhCc/0YgDUG9zDHobzzzjtsvUm84OTm5mqvhshmlpnEaYOXL0cn1L++tDbJIQJijb9tA4aq9czUWMZMYy1Y7IlXCyDiLMxnseA6wYSAeQwTJcpCwVZd123U2958DZ9/CFETkz6Vp56ZDceKl/k73xTTAjcPewM5Cb6enMkJc+t88OVbdPP3f0eje49j9dwuSX9GaNw2a81cPUxZL2GkKMWuWP4Qc7Ky75QLlotJkyYxgjdQIxaIL9m0aRNdd911x6wbxcXF9Nxzz2nXCHTt1q2bli8FQbawnCDnCV4GbrrpJi0e5f7779eIzuuvv07vvvuuts3Y74x6rsHicVhF9QOfopaDIwwQlT8hYtsaFXxAFAI105CTR9+8k+Z99TbdcsEdNPrUs8XFnMQNjdgSnpun59SCByGhIh7eAwN9JyjIV7Jr1y6aPn26lqjtVBbQM2fOHOralQUrMeAzEBYDICW/+MUvNNKSzyJRQVT+/e9/03nnnXfsO7CUzJw5U9vdg2RtSNSGfCs8c6Aky6jnusfXr9cXL7h3eEDl4JCT0Fl3fBipuxVhUUhGliNGTh55YzrN//odmnzhNBrVa1zQRZIDfiouLVvW7gxlCvDx+rZjL5Bpy7IQp9X111+vvRLh2WefrXf9q1/9Snulw6XMx4KXlBlircDx6oi49vmobAUJj6D/6ks99igieRgUOJNl7CqJCKqqj9LDr0+nD1e8Sz+/cDqN7HVW0EWSB37mY8nM1GMacd8O7Znb0NvGD5m2LEcrKktGHD2qm98wiNR5O9FHOu044uZ9BRuALDAWJ207KlNgQq7Jg5w89Po0WrDiPfrFRdNpRM8zORQ2QvA7H0uzZroFZdNmfeeGTOENHqAIit+A5QSR1u0Ys1WInysJwdEfzrcX+6LiVxRCqMmDnDz42h300cr/0i8vvpOGn3KGx0JygGxzye8YuExWt+bN9ONTcLZb06ZyhDd4hCIofgFxJ0i7j+2J7doy01tMDgSMOyAozAIfgjIjw17sS8TScsdqAYqpJg9y8sfXfkcfr3qffnXxXTTslO94uh83yDaX3MTAVTsc402a6laUjRu15G1ShDd4hCIofgGRRi/P0v/etFH3C6rFJnxwKiTSEZa4peWOywIUFnDU5I9WgZz8lhat/oBZTu6mYT0kSsIm21xyIgfcjvGMDD0nCjadHNeJWVTY3yGHIih+4UsWHCnTBFGQfyGU+Sh52SDbAhSz3WwgJ394bSp9snoe/fqSe2noyaM5FpIDojCXNrsY4wiWRVD+eubqOa25TlpCDEVQ/NonDj/gl8vDPUEUxC6EyRYPsxUHuz76F6meicICFBZNPgE5eeDV39BnaxbIRU7M86QTsyCMHKVn/w1rnqjOLsc4th0b9W7d2p+yCYIiKH7sE0cK2hNP1JlsaWk4JohXV0ZU4VZI8Fw8zFYcHHx2gyIokUlUiHlnHF1hnMIt8byrrKqkB/45hT5fy8jJpffSkJNGySOPrNbOUYw4XXmlP+WTeYzn5xPt2aP/DqktQmxFUQTFj33iSJpz8CDRGWf4I2z8IBPKpy/vQuin1SbGlgApgCD6gUX6uVrG0RWS1ksnJ7+hz79ZSLdddj8NOtHHueBGHom0dso+xlu00Nehbt2oqrCFNJlhnUIRFN77xMvL9Shq+AL90oT8IBNRm9xRWgitVhy/oaxp4gBTPBVJP+9ATu5/5TZasm4R3Xbpff6SE7fySKS1U3bkMyvK7t1UtXEz/XZ2i2MhkUFnhnUKRVB47xPHKctw7SAGxS9YJyuitufP1z/HaavIvYHtZk7iFdTklheiM48qa5o40of5aoaEi2rl0QpGTm6nJd8uotuZ5WTgCcP9f6gbeeTF2umUlIeBxDdvTkveLKYNX3ZjF4VSZIZ1CkVQeO4Tr6zUE+WAvfo5WK2TF4TEalFxGq8ggytDQY7Mo8qaJo70DR3K/thB1LVbXQyKZOTkPmY5Wfrtp/Sb8Q/QgKLTxTzYjTzyYu10SsrDQOILCmjXlj3UibbQKuopRWZYp1AEhedOHpy5s3sXUfsOPPso/eQ1HbYYaleGghxQ1jRxpM9QZMaPZ1q5XBp4xdFyuu8ft9Ky9Z9r5KR/EciUIIiWR05JeUhIfPOuzajz1s20mbrQIWpCvXsHmxnWKRRB4bSTJ6PqKE3oup4oJ9f/CCTr5IV7ZwN7toJCOtgxTStrGsWd9IGc3Dv71/TlxiU0hZGTfiLJSRj6x+73A3YFDRrbhHKPFFPOoWJqNujkUAXIAoqguITVj7d1eSkzqTHrSdu2XvvEOcwLijUGRUHBqWlaWdP8naOSu1BBTu5h5OQrRk5gOel3/JCgiyRf/wwbpm+GgNW8XTv9WkJXUFZWBvUb2ZT6EbOyj2D1yvJ20rFoKILCYSdPJlXRgFYbdGraKIAmTbageIlXCEMQmIJzhMQ0HYszmmD5LC1hgeyja/OhBD+/yiuPMHLyK/p601JmOfkDnXb84KCLJAZOSfnChfrWcADvuE70exnmW9Om+pbjkq1MaQ1XDiVFUDjs5BnYZScNa80C3Vq04tUvwSPoIDBFkPxByFwNkYUxv/Kz2cVoPR/K0BGBk5O7X/4lrdi8jKZO+CP17T4o0PJILT/sEg8Z5ltmphYwq23ggIU9l4UhhASKoPDYybOEuVMwPnNy+PSKDAia+QdNkKKKELkaIg3rfNLyoQRH1EFO7mLkZCUjJ7+9/EHq020g92dESn7YJR6yzLdmzVgcArOi7NjRcGu7xFAExSv279f9kBgAUULQzD9oghRVYHGLM9GTxTJnnV/JFg0BRF0jJ7N+QauKv6TfXf4Q9e42gOv9A0E6+eF1HNglHrLMt0xWjuwcfccncnThOgRQBMUrtm/Tz97BmQdRQtDMP2iCpBBNyGKZM+YTYlAALR+KeKIOcnLnrJ/T6uKvNHJyatf+XO8fGNLJD6/jQBbi4QTNmRK9a5eWYTYshwgqguIFFRWMkW7W/XtRQ9AT0C+CJIsGLVtZZAevtnK74PPuK2N+GYHsuK49N1AUUT9SUaaRk7UlKxg5eZiRk37c7h040smPOFpoc3L1BF5bWbCsIigxAE4q3r/P/8RscYRfBEkWDVq2ssgOXm3ldsEPqq98IuogJ9NnTqZvtq6k313xEPXqEiFyYkd+xNVCW1io7+g5/vhQKNbKguIW0KgQ2NYoW1zmG6Vxe4dMmpNMZZEdvNrK7YIfVF/ZIeoO5UJZxWGNnHy7bTXdccXD1LPLaZwLHQIE7cIOSrYXFOg5sqBcd+/O//6coQiKW+zZo0dEN2/OsTvSQGnc3sFLc+IhUOKqxbkBr7Zya5mTua8cyAWQk2kzbqH129cwcvIIndK5j6BCSoagXdhByfaMDKLGjfVgWYzhIPJ2kqTwAAAAIABJREFUOYDcpZMZ8OMdPSp2T7nSuOXRnHgIFNm0OJkRdFsF/XwOcuFw+SFmOQE5WUvTJj5KPY7rLaBwCtLJ9sJCXbneuZOFJ7T37zkcoAiKiwMC1315mM7ML6GBQ5qS0GMNZNbi4qY58RAosmlxMiNZW4kyjTvtK5HuWBty4XD5QbqDWU427VgnJzmJu/tapGxvVLvsw9WDNP2wqjhcA1eu9KlsFiiC4uKAwC5USivoIJXndRS7vsisxcVNACmyKEefy+r2FFmuNHJBJyc3M3LyrUZOTu50qj/liGI/RlW2N2+u5+9CHi8HObyMNTAvz8eymaAIiuMDAqupE22hMspjYylTrJAOs8YdNQEUZrIYpT6X1e3pd7lsypVDR0BObqItOzfQ9Il/opM69eJbjqj3oyiIlu35+XpOFATLOiAo1kNy/YYiKA4PCNy4dC+1oD20j5rTqZ1juDC7RdQEUJjJYpT6XFZLlt/lsiFXQE5+N+NGKt65kaZf+Sc6sSMTYLJC1n6MMho3rttybHMnqvmQXBFQBMXhAYEtWXBR9VeV1PjEXBo+IoYLs+wCSDsl1qXFKmpuqHT1RCR/TY3ug+7ShX99vfS5drovw8svE7XtmLxsslqyUA7U4asv9Wu0M655tW8auXLwyAG646WbqHj3JkZOHmPk5BQ+z/ULTvsxLnPVz7oawbLILNumjaNDchGD8sUX3ouQDoqgOEBWdSWNO5UxzpMKiJlR4q0ZOJ00ohYSnArr1mIVF2uXuZ4GNqznW1+MD7zg6wZ693HW5+jHgUX6Ufar1iYvm6yWLJQLr7179esP5+tEkFdZU8gVkJPfvXQjbd29he5klpMTOkhOTtz0Y1zmqp91RbAs5ihIik2CYhySi59cfbX3IqSDIihOAKaJoCKbnSm1hid60ohaSKynwjqxWMXF2pWsXjzri/Gx4MO6ayzOTrQ+rR8ZQQk4hsMT/BxPSeTKwbL99FtGTrbt2EB3tr2AitaylaTdydGzLsgwVxOOoZDVtUkT3c1zwglEOTn87ssJiqA4AWgjTLXGNi07kFXDi4KASAScCmto3E4tVl5dEmExOVvraf6cV/2s4+HTT/V3u+1iPd03gBgOz/DTeppArujk5Ge0fccmuvPoQCoqOcgWn9o6Rk0GyWCZTjSGxowIV12bMIKybZueEwWnHJu2EiMgFjEncOuISpZuhSIodlFeridna8o6VEEOAZEIOBW2otqdxcqLtStMJmejXoliUHjVzzo+jpTV/d5Ou2in+zKFoGu3uhiUsBFsgdbTA2X76Lcv/oxK923VLCfHlxzgUzdZibcMlmlRStoIH+sK5oH+xJbjWoJibCUGjIBYuHWCgCIodgGGeZBpJB3UwYC+Txov8GKx8vJbu8LKqcC3fn/UMHfl81pPp8LYGA+wnICc2P2dAaNNxo9nbZAZToItyHoKcjKVkZMd+7bRXT94nLqv3lZnOfFaN1mJtwyWaVFKWqbPdW3aVN9ufPiwtrPHupVY9NZiMxRBsQuYwTBQ8AoropKTRZTvl6ewMsq8fFld4KQdgW9dILax2IyBY4kWLiQaPEzceHQqjM3jwxyQK4ulTVaC7RD7D4Oc3EC7DpTq5KTdiSxGjsUT8KqbrK5cGRD0GKrmJM+x3Xhria6EM0uqdSsxroOCIih2AMsJ4k+wLSvMkFUbktX3y0tYQZC8+KK+I8WKdAK/wQLB3DLARwt0V5ao/nMrjIMW4jwINq+FgDP2H95bS052aOSkW9sT+CsPsrpyZUDCdq7dHh8meZ7J6tEoWw9hYP172WV66ntzDEpQUATFDpBxr4yZv1rY3VssKaKiDclYD0zyZMIBgiQRObEj8JMFtIqud6r6+fE7mSAhsQc5mfLCT2nPwV109w+eoK5tTTueeEJWgqlAXOUglG+scwcOUBb7O6iYEysUQbGD0u06w3RwqJKUiIo2FLZ6JBIcyA/Sp296gW9eIKDJlxbXrzdP7V5SS0HgkIwQ7zu0h6Ywy8neQ4ycTHqCurQ53r+HRYFgRhWdOcpBI/X9nj1SeQoUQUkHBA7t2q1vxwq7kI+KNmS3HrL0hVWQYGfKlVfaK4t5gUB9PmWxJwDSGCMGhad2H7SlwNxfRV2J+vtkFQhyIfCIvYd209QXbqB9h/dolhNfyUmcIIusCFKeZ2frynhXNvckgSIo6QBGCfeOkRFTdiEfB23Iru9Xlr5IJEjcCD/8Zhh28WzX37G7had2H7SlwNxf29izbyjydnRBxIg9yAncOnDvwHLSuXX3QMoRScgiK4KU502a6Mp47W4eGaAISjogsjmzdq+4jEI+jMxfFIJecEUQQ57afdCWgkT94+XogggRe8SagJwcPLKf7pn0JB3XmlnhFKInK4JEPnPz7N2jK+WKoIQAFRX6/vAmBfIKeafMP06EhldfyNxmPLX7oC0F1v7yenRBRKCTk+u104nvBjlpJY8JPjIImpzLgMxMXRmHUt6pU9Cl0aAsKKmAfBWHDhG1ayevkHfK/MNoynQLXn0hc5tBqPAqC897ee0vxKB4PbogAth9YKdmOTlccUgjJ51adQm6SNFE0ORcFhQU6Ck1oJxLcDaPIijpDgdEKnAnBxGIFvJOmX+cTJm8+iJObcYDbi1O5v7KrNZjbbwcXRABcvIbZjk5UnGYuXWeoI4tfSYnflgKjXuWlrCg59H6deBZFSUk5yJQbaN/QVDgNYBy3rZtMOU0QRGUZMCJSUhcI4kvjhvzV6ZM5+DdZnYERZjB0+IUh4UjAZB8bcrzjJxUlmmWk44tBViO/LAUGvfMz2YXo/WYoqHxIZlSYYGN/oUyDvkE5VwRFImxb5+eQbZly6BLwleAK1Omc/BuMzuCIsxQFidP2LW/VLOcVFSWiyMnfvWb9R7WmCIF/qhOogDZ7V8o5Tja5cQTgzvGuBbKgpIMiGQ+WqnvDRc5iLzeA0iVSyKmGqkn8G6zqC/gykrnGjv3b6ffMMtJZVWlRk46tGQxOLzkhRmJ7udHv1nviZgimcG7nYPAgiQKkN3+hZsH6x+U9IAVdCEE5YknnqAHHniAeUy2Uq9evejhhx+mkSNHJvzuP//5T3ryySdp6dKlVF5ern3/jjvuoLPPPvvYd5599ln64Q9/2OC3ZWVllJeX573AiDvB8dO5HO7ldBB5ucfGjdphT/Th/Pq5JKI4CcOMqC/gykrnmpzczshJVdVRbStx+xad+MoLMxLdz49+M+6BGBQAMUUyg3c7p4MfsnhzEgXIbv8iOBbKOeJQok5QZs2aRTfffLNGUoYPH05PPfUUnXvuubRixQq2ljYM+po/fz6dddZZdM8991Dz5s3pb3/7G51//vn0ySefUL9+/Y59r7CwkFavXl3vt1zICcCIDu3f72/8SbJB5GQwb6o9OM4AznvZV3tSLo9JqIiMP20S9QVcWekcY8e+7Szm5AY2vKo0y0n7Fh29y4tUSHQ/P/rNuKcR9IxrgefpOQbvdg6CEHVOogA56d9sRlJ27SQ6/vhoE5QHH3yQrr76arrmmmu0a1hP3n77bc1Kcu+99zb4Pv7dDBCV119/nd588816BCUjI4Pat2/vT6FBTo4c0bPH+rVIJxtETgYzUqb7OQlFaxNhAI828WsBV4QylNixYwdNfe4O1n3VWobYds0t5MStvEgF3veLCkS3ix+EaAQHBQjK+R6m7DIvBuXmei+TjASloqKCFi9eTLfeemu9z8eNG0cLF9aeKZIGmLQHDhxglqb6pqaDLIC1a9euzBxaRaeddhrdeeed9QiMZ4ICNw8WEmbR8WWRdjOIrIMX1hK4ocoZmTJwau+6gCgjl4TbSShamwgDZG4TRSjDQ9xqy1RavIqmHPwX1VRnam6dts07+Lfo2L1fsvYKoh3Txdk5LUe6OvBu5yAIUWatAmTUdcYM5+2ErLLYboy1sE0b72WSkaDs3LlTIxDtLInOcL0NUcI28Mc//pEOHTpE48ePP/ZZjx49tDiU3r17s/bbT4888ojmPlq2bBkLPGaRxxYglgUvA/iNjkrGQ5ivzQwQk12sbAW5ulkSvlNti1wtcK2ZKz0C42SMdfCnuS8IB+JKDJQf0u+D8jVrppMT+HhrB2GNVs4dte8mjBrG/IyZekQ9gta031Snfx6uedTdBxh1bFBX3gi4TVLW06+xGvb+XMSUoc9qFSL0XY5xplGAYGXa/slcmlL5EWW0aUJ39bua2rRsRzXJZIAbeZEKqe6XrL08tKPr/kz0TMD82TYmx7A+2Fl8rffDCphpkYUe2tlxPe3KYtHjPjNDL8cBFizbOtE5dJZ10ydk1DD4dfOSkhLq1KmTZi05/fTTj31+99130/PPP0+rVq1K+fsZjPnBNQQXz5lnnpnSytK/f39GGkfRo48+2uDfEWQ7bdq0Bp+/9NJLzJIleZ4TBQWFyGH7dhZzMmUKWxsz6a677mJKanBaqoKCUxw+fJgmTpxI+/bt0+JBQ2lBad26NWVlZTWwlpQy05HVqpIouBaxK7Nnz05JTgBM8kGDBtHataaU2CbcdtttNHny5HoWlM7M5FVWNpYKClrV/zKOm/70Mz29PZg1zGRILlSP4Uqw4wUuso+Y+c7A8BEN2LHG4k/bQbS0DWXg5FtBzw0CvtRVQqSspyxjNV05RI9dycbs9j0lNOUvt1JWeQXdWThWJydPfUsZg+qUOKn6p3OXOlm4eZOrdnTdn4n6DjB/BiAez2Rlt30/WJ6xndbpfcIghxZ6HPc45uXoUfa74Q3iUMrKdnEqZIAEJScnhwYMGEBz586liy666NjnuL7gggtSWk5+9KMfae/f/e530z4HRiBsS4bLJxFyWePi1RDZLNjWkudkz0HWKbVNo1naMhtmPpTBaj54WP0U4LhOMCFgHsNE4TZZ1m1ko7Oy/rUkmSG511VSJK+nT2PVaezBfFMgMc7RwTg1x23ZHEPc+tPmXBGBbXuK6TfP/5Sy8hvTPX2vp1b7Duv1HDBE3LhN1z/m9kLfr1lXfwFH37toR1f9majvgLXr9V2LBtqywGI797XeDw4EIy2Dk/uEQQ4N9jjuc5h3YS+LQzlQRpTXxPKPPuUHE72LB5aLSZMm0cCBAzU3z9NPP02bNm2i66677ph1o7i4mJ577jntGqTkf/7nf7S4kqGM2RvWl3wWtNMMbJcB7hr8G+JNYA2BWwcE5fHHH/dWWAzWnTv0ACHZYQRCiUYQ0f8yBjnGCR9+WCfE0feYJ6NHuw8kFj2GgporFmzdvUXLEJvTKIfu/sET1KqwbW2sguDtt+n6x9xeL77Y8N+uvNK/stntO5QhUfCs0/tBtmRkRHPLf6bHcW+kvQ8wUNZ3gjJhwgTatWsXTZ8+XUvUduqpp9KcOXO0HTgAPgNhMYA8KUeZWemnP/2p9jJw1VVXaYGxwN69e+nHP/6xRl5AWrB7B/lTBg8e7K2wMGkdPBQOghIUREe5A2p3SrD4cnnD61QEJR0BETmGJCG3Jbs3a2fr5GTnHiMngcEJQZR1O7LXxZf3faKKnBz9dOOiBAk/o5JJ9vrrr9deiWCQDgMffPBB2vs99NBD2os7wBSRpA35TxS8T2hei4PMW3sVGiIdAUk0hqxjBbsbIkJuQU5+8/z/o7zsfLprEiMnTQMOiHVCEINQSEJORiOFxo3r1sUAFHd1Fo8Z6AiY+5wMajUpkrcH/jb8xF4WB1m1uLgA29cXfFj/mrdWaiUS2BI5sEiOjM0eFrqS3Zu09PX5zJ8Py0nLpq1d3YcbnNYtTBYGCcho5JCfr6+LODgXfwuGIihm4IAkmLScQE2K5O1hhVvLR5i0OK+QkfBqqcoz/W3/hKfeFsmRsdnlQle8a5NmOWmc20TLENuiiWXHYBCIsrxSllb+wLyHTAJBCSAORREUAxUVeic4Pc9HTYrU7WGGW8tHmLS4KC4gItrfr1NveWRsdkGst+zaqMWcFOQ1obt+IAk54SWvZCTRgLK0+gMEyx5LbioWiqCYA2Rx/o7T0xtFTwo7wsH4DjKJ9h+tX2upIwXA2h7mbYlRtnzwQlwJr5VIaKfesuC8IMiVxzm9ZecGbbdOk7xCRk4el4ec8JJXMpLouFlaRRJIpOiAdwH3FUxEFUGxJqXJzpZ7UtgRDsZ3tLTno/WkTKJylSRqDxm0q7AgrlqglUgEmaLfw5zevHM9c+tcT4WNm2vkpHlBsMfV+yKvZCXRcbK0iiSQ8CogSBavggL393EBRVAMwL2DAFnZJ4Ud4ZDQny8ISkh4g9ICg4fLMbxpx7c05YWfUrPGLejOHzwmHznhNT9lIdGyupqCrutmzgTSsKBAiVcEJUQBsjwGHU5L/upL/bp3H6KRI1NPMjvCwS9/vkL4CV6chLpAgJzArdO8oBXddeVj1KygRdBFEk+iRY+tRJYCPJNHGVLVJYg5tMCBVYQ3gUTdkJwRBEUwlAXFCJA9cMB5gKwZbgYtvm/evolsnbDipFqg7GjYxmeIQQE0f76CgsTxAyHGxtJ1muUEsSZw68C9E0sSbXds+Zkfidf4TnWfIObQZgdWET+ssAiUNZ9ZJAiKoABghuXlRE2s5w04gJtBm2iQWT9LNJnT3dcQIEGk0VaQG04EnUJabCj9hqa+cIOW3+ROZjmJPDnhMbZ4LfCJLAW8xneq+wQxhzo7sIr4YYWF8r53r/BAWUVQzAGyjTw0h5tBax10xmdmKI033u4N3hlWnQi6IBDkDjSHWL99LU198QZq1bRtLTnRzwqLLeyOLV4LvNlS0KmT7obYs7thmXjXJYg5NELwZgyr3BkwQA+SPXzYmyLvEIqgeAmQNcPNoMUgw0Awx6BYB57SePkhLGQvVTZerxlWRQs6t30UxA40B1i/fQ1z69xAbZq1Z+TkT9Q0P+bkxMnY4rXAmy0FiOUzJ4jEcSV9+rof36nqEsQcyhS8GcMqK0H+TjxREZTQBsi6GbQYdGPG6K+warxhghuyF3RAnBVeM6yKFnROYe2TxZ/rR8aLaHeb+HbbGs1y0paRk+mKnDgfW34s8NZx06Klt3Geqi6yzyEesLYn5M4JJwgPlFUWFLh2DrNGz/VIUPwatH6x9TC6O7zCDdnzw+qSru1TEacw7shyMtasfYTkiUb7S7AorNu2mn7LyEm75h1p+sQ/UZP8wqCLFD454IesjLMiV+1DHyZqT9xTERTBgAAsrxDqV5OC+ITF3RE02fPDxZau7VNl4+WVYVUknIw1o0++XCJdMO+6rauY5eRn1KHlcTRt4qPUJK9p0EXyjqjIAdldl6L7cITH7db4PmD6fdWu3bRwzgGa+7JuTBEBZUEBQamsFJ8DJWjEMbbFDdnzQzNL1/YJhMMx4RJkhlURY83oI8TamBGwRvzN1pXMcnIjdWzZme6Y+Eg0yEkQcmDhQsb0NvK31sTB7eKkD70SzwTt+dnSHFr8ySFaTlW0apX9W3mBIiggKDCRRd29YUWcTaJOkIgs+N32URO2bsaaYSmC9ahtx0A14rUljJy89DPq1KoLTbviUe0AwNAs3H7JAbduhY/Yb8oqw22tkQ2dfdxubcKmrdmUTYcoj8qEZa1QBAUEJY7wY+GNIvwgC3Frezf1NRa78ePZYhic8rC2ZAUjJzfSca260h1XPOIPOQly4XY7Fnm4hqJstQWBmy8otmdEgj5E/3BWQDt0zaV9m/YyglJOhz3fzR4UQUEGWS/5T8KKqGnpYULc2j6k9V1T/DX9jpGTzm26M3LyMDXOFRSnJnLhdts3PDR0DoumtMD2eFGxPZkJ+jARafGIYSMzqcmBajp8pIxanJpP//iH51umRQxXZhOwt3v//vjFnygohHV3gSCsLv5KIydd2hQxcvKQOHISloU7kVvBDoaPqO/KiiqsB7SKthZl8lcKstgt+/Vjrz7ltKNQERT/geBYpLjPRlIohUggKF++QmR2iKza8iXdMeMm6srIye80y4mAI+bDtnC71dCHDQs+8Z4I4ox0AKvWhot02gG8DfA6FIo50iHeFpTKcp2kNG4cdEmip50GVT6evnwRdZC9H2O2UwzkBJaT7u1OpN9e/pAYcmIEBSMhnbEDQ/Zx4IOGHnrijLm8iClI/Yv0v0eO0i0pYSGddgBlHl6HTna+7B3xJihltQRFFguKk8XKySQLwqogg/bsdUEUUQcZ2kk2N0BAWLl5uWY56d7uJGY5eYjycxpHM2Yh7vCLOGMuf8Zk7Q2MoHzM3gcxa9GVV0ZLgcnJqU3NUSHkcfEmKEfL9TgUr+fwBLFYOZlkQewQ4CkE3E5SrwuiCAtACK0MtuFDoJ5fWLF5GU2bcTMVte9BUy//o1hyIkPMQpzgF3FONZfdyrAFkikwOdn6oYEVbO0UgHgTlPKjQZfA/WLldpKluidPts5TCDiZpDx9+SIsACGzMkTRDfD1pi8YObmFTux4Ck2d8CDl5eSLL0RUYxbiRJxxr22bE/ehW6KxWTIFplG2fjxMhZi1M+YEhZmqsrKCLoW7xcrtJEt1T55sPVH53BIgJ5OUZxCeCAtAiKwMUcRXG7+g6TNBTnoycvLHYMiJNQZFjYNwEmfMXSMDMhSlwUwWeSUanSVTYNB2kONHmUVeAOJNUOBLkykHipPFyskks2tV4MnWE5XPfCS6EwIU1CT10wJgJWtXXJGYrFm/N8ok9OIKTpa+rzYuYeRkMp3UqZdGTnKz83wobLSsTQpp+hAKEm3X380JBt3KsBGSKjBViqD4D2wxlsmC4peQsmtV8JsIuCVAsk5SL7BaqzZu1PvfuuBavwcNbSALwoszOFj6vtywmKbPmkw9jutDU8Y/ECw5UZAzIJQn3MqwTBmJK4vbrKgS8iSJzAcBAL603BBuMRYxieATh8B48UV/j/B2O0nDblnYbCFnGzckXnCt39OCKWNOUKxtYr1Og+UbPtcsJz0796XfhI2cBLmI+/1s2QJCeUJKouESmVl6eIQAxJugVFXJ5eKRaRLBHfMhe/EUFjwtIWG3LFjJWrIF1/o9EMe4w4Olb9n6z+lOZjnp1eU0uv2y34eLnIhcxBOREb+f7ZF4KghCdiNhZ9jFe3VWBEWssOCpRYTdsmAma1gMDAuKdcG1kjrjlN84wyXRXbb+M0ZOfs7IST9mOfk95TTKDZ+rQdQinoiM+P1s2QJCFRIjSxEUcS4emWJQZILswiLslgUzWUu0IFq/Z3wHJ3QNHK1fk8tFU+YF2Ceiu/TbT+mul39Bp3btzywn9ycnJwAvS4Ef7SxqXiYiI34/O4qxZlFEI7ZmVqhEbf4DSdr8EMxhXwDCICyiZFmws+Aai2Y+sh6P1jOPut1OHWVffwJ8sW4R3T37V9Sn2wC69dL7UpOTVJYCp/Paj3YWNS8TkRG/nx2lOI0ooxFyoRwU8yghT4kborAAyC4srOXLhEUhwkjo0uJ0rwj7+peAnLz8S+rbfRDdxshJdiMbJ5cnsxQ4ndeyu0lTIREZkV0mKIgB4jYRHiHiUUKeEjfEaAEQDjfWqShYtHi6tPwy1UvWzovXfUz3vPwrOu34wXTrJffaIydAMkuB03kti5vUTb8oMqKQDAiLUARFAPwSnrIIpijCjXUqKIsWzwXbWCRLS/R3zaXlEn6Z6iWyHH7+zUd0z+xfU/+iofTri++xT05SLc5O57UsblKJ+kUhAshENlllQRHT0H5AFsEURbixTvG0aPl14nQ64Bn4rebK2l4rJNzdyrZ27JRgOWlnH60tn61dQPf+41YaUHQ6/eoSRk6ysoOZ13bb2W8oi64Cd4g5YDfeLh6/TjGWRTDJCi+LkxvrVLLfuCmHE9IR9oXBKcFy0jc+afUGORl4wjD65cV38yMnYZ7XyqKrEFLEm6D4ZUFRSA0vi5Mb61Sy37gphxPSEfaFwSnBStU3VjK4aZOze9vAp2s+pPsYORl00gj65UV3UyPka1BQFl2F0CLeM1gRlGDgxbLgRotN9hs35XBCOsLu6nNKsFL1jZUMdu3W8FkesGj1PPr9K7fT4JNG0i8uukuRE7v9oqAgMRRBkQ2S7YQQvvCJrL8bC4cT0hH2hYEnwbKSP7hXR43mcu9j5OTkUfSLC+9U5EQhWqjmLBN5389HxJugiInzcYYoRtxbJ4R2JDklXpxE1t/NAhx20uEEPOtqJYNdunC598erPqDf//N2Or3HWJp8wTT+5CREwlwholiQRCa6HZvJ7ucEguZAzAmKhIIm7IGVXieEyPrHiWwEDR/cXQtX/pceeHUKDQM5uXAaZWX6IM54CHMFBS/YbJGBy5d5O7zRej/rtR0oghJTghL2wEqvEyKK9VfgTgY/WvkePfDPqTT8lO8wcnKHP+SElzBPBWjBwMsvE7XtKMZCw8MqpCxL4tDZIhP37q3rPzdj03o/XMuyA9aCeFtQMjk2Mq8JG/bASq8TIor1V+CKBSveoz+8OpVG9jyTbr7gt/6RE17CPBVwptLAIv0061VrxVhoeFiF3Lod8O/zlcvMEUaM0K0mICYGjPZ1MzZxP/M9jGsnUARFAJYtJdq6lY9vmZcpOCxuByeEzMmECEv9FQLBh1/PpT++9jsa2essuvn7ICdZ/mr2PIR5KmhnKjGC4peFJhGsz8CW7/nznbVZMu09nRwEIePpMpPVksOTiGWy3/XpW9dugHksOh2buJ/dNk/WvngJQLwtKEuWEB0p4zNRkk1YWSeQVzghZE4mhIJCEsz/+h168LU7aPSp4+jG86c2JCdOx6Ud8B67VnnQkbl1zDC0YD/lhlXzxqnuTtssmfaezu1gPeTSKyGTNUaINxEbEdDhjcnaVxEUwfA6UZJNWFknkOy+eRkRVbIZAsz76m166HWQk3MYOZmSmJyEYVxa5cEZY/S/kRfGiEFJ9D2Y+KFF8xhz1sXOTdK8RAsmkM7tgEMuDVdWon93Cln7mzcRywxIyUvWvoJcPEKk6xNPPEHdu3envLw8GjBgAH344YeUgz1NAAAgAElEQVQpvz9v3jzte/j+8ccfT3/+858bfOeVV16hnj17Um5urvb+6quveiuk14mCCYq8Dt2P19/NE1jGCeQV1vbi7Zt3ZEqdrwcZGtd+wVg0IIDxjmsFYeRkbO9zU5MTmcZlMljnf3Gx/j5+fH3N1Po9xB/wGnPGYnfllfo7tnw7bTPrPYxyJ5ODBnDIZap/dwpZ+9t62rgs5QpZ+/ru4pk1axbdfPPNGkkZPnw4PfXUU3TuuefSihUr2LywTAyG9evX03nnnUfXXnstvfDCC/TRRx/R9ddfT23atKFLLrlE+87HH39MEyZMoDvvvJMuuugijZyMZxN8AZu8Q4YMsV+4AQOJSoq9+ZatWvUVV9TXcPwOsgsKyTQokUDbv/iiHmCYjzNXRuum1aE+lUUU2VSWmmOY/9U7jJxM08jJDc1GUdaMmamtVzKMy1SwygPrQpbse36OOZ5tlk7T520JkLW/QcQqquUrV8jaN6OGwc8HgDD079+fnnzyyWOfnXLKKXThhRfSvffe2+D7v/71r+mNN96glStXHvvsuuuuo2XLlmnEBAA52b9/P7311lvHvnPOOedQixYtaMaMGWnLhN82a9aMnrnxPWpT2MRL9XTt3Ry8BK3APAEDXGxqMquppv92yljSjjKqI7iN0NT2NYyg1My4ijJunUcZl17u+/MS9rWA53jq0xDBqOd9tz5ELQpa008aD6ZMs+XVr7b3C8Z8gjsFIhcmcqag1YwaRjUDdzTsT+P71t0bYat3LUI1bj3IvlDV0wN2bN9OV//l+7Rv3z4qLCz0cKcALSgVFRW0ePFiuvXWW+t9Pm7cOFq4cGHC34CE4N/NOPvss+mZZ56hyspKys7O1r5zyy23NPjOww8/nPCe5eXl2stMUDRkscGkHV/vAaUltdq76dp8T4zRMVbW6aMbwgSjbq7quIj1z2e1fbSNTdSczLoMsE4mOiwa8MdCU4RWwZPkmNoeBEV7784Eitc+TQa2mGjtUK8+PjwrxZjy1KdB9ZMLGPW79fJ7dEHPXHhGHyecZ7LDPJ+A4SO0+ZS0Pw25gTHXoG9CVO9a+DJu/YIH2ReqenpBpq92DTEEZefOnVRVVUXt2rWr9zmut23blvA3+DzR948ePardr0OHDkm/k+yesNRMmzatwef5g3ZQTeNDTqrUEP1H666Fetju7Z68cRqrp9Pf9C8iusG0/dFtvZDj4dg2yh3Of++07X9yPKurj+3vZ32cjCk3fRp0vdzAqGcY5pmX+ZSqP2XtGzfgPW79AA/ZF4Z6ekD+4cNET3m4gUzbjDMsEb/wKlk/S/d96+dO7nnbbbfR5MmT61lQOjPTXdlnbaigaZPIaZ8GNBbPJgotbePc3AgL10cLGmh8joDAVcSHGMBOBQQD8oKp7TXLCSMnruoqG1KMqZR96rbP/O4nF2hQT4nnmS0k6RtPczRECFU93cyj2vFZs2Mr0TT2/SWtKCPCWTzKtpcKeY6vLdi6dWvKyspqYNkoLS1tYAEx0L59+4Tfb9SoEbVq1Srld5LdEzt98GqAoxkcJktmw6BMiax7oHaoo+N6Dh5WP8gL107vgW2T5i2FuOYqnExtD98v03Jc1VU6pB5TSft03UYmOSrrX9sJGPa9n9yhfj3lnmde5pPrORoyhKaebmQfkrIhbgyxcDSCMhZ+Shl+BevLgOoIpLrPycnRtgvPnTtX221jANcXXHBBwt+cfvrp9Oabb9b77J133qGBAwdq8SfGd3APcxwKvjPMqYav4G+0vawR9mEJAnaKIFNfK8iZx8IrojhP/OirdAnpooYaMY/x3QYF18qkSZM0ggFi8fTTT7NA9k3azhzD/VJcXEzPPfecdo3PH3vsMe132GqMgFgEyJp359x0001s/Iyi+++/XyM6r7/+Or377rvaNmNH8HcDk4LMQlmGBHqypGWXuZ+ivGhqboGFeswD3ArQ1GWrhwzzJAywu31cQS6Cgi3Bu3btounTp9PWrVvp1FNPpTlz5lDXrl21f8dnICwGkNAN/w7ryOOPP04dO3akRx999FgOFACWkpkzZ9KUKVNo6tSpVFRUpOVbcZQDRSHekCGBnuxp2WVFmBdNM7nC36XFekAmYh7gVnBSDxFETYZ5EgYYygB2lwGIkfID1REh5zYhJIoHidbwSoRnn322wWejR4+mJTgnJwUuvfRS7eUNyoISW8iQQE8J//i1m5lcAeat007rIYKoyTBPwgBDOdC2F2/Xr6sjTM6rxQSARTfMWKJGVpAQMsRd8Bb+cdGu7LabjO2RioSk639rfdycoRPGeaLAj5zzmhOCwiMUQVGIJ4Jwh1iFgxHUzUv4i9augiIAdhdNWbTNlOSqS91WVsSgpIK1PtgObr03b8TFbRgWdPao1PCaE8qCIgBeSKCM2plbRKkuMsPvBVO06yMoAmB30ZTRFWQlV8gUi+Rrw2xsZbWWH3mfkPpeWTfigxEeLVq85oSyoAhAjQcXj4zamVtEqS4yw+8F06t25RQyEoAg28MNuXKSEt1aHxy2quZpvBS3TI8WLV5zQllQJCcosgtnJ4hSXWSG3wtmOu2Kt8CVkQDw1DZlQ9TqIzuiqLiN4DSGFEERgC+WE+0qdSesZRfOThClusRBOLjVrngLXL/rAyA/CDLiupmjXrVN2bRpnvVRiKfilslpDCkXjwB8tYzoSFlyYZ1KKIkQzqIQpbrEQTjIIHDTLdi8FnTkB0H6/qA12Chq0wqpoRS3wBHvXTzphHUqoRT0YsMTUaqLghiBm27B9mNBD1KDjaI2LRKGSwAHU+KspyAsUE6hFLfAoQhKKmGthJJClMBT4KabG37MnSBdj0qb9gacRD2wSD812ziYUnalyA/FTQZXYYgQb4LSqxfR7t3JhbVsQkkNbgVZBG66ucFr7iA/iDkGJWzkLoxz1o8ya4fnMYISdwuUchU6QrwJysk9iI7vHh4TnxrcCrIg3dxwMncSLoi1/4b8IDIcW++W3IVxzvpRZuvheUEre0EhAlb5KjZdV60S86x4E5R0kch2hFIybcMPLSQCgzt0kE0DlsWXn25uOFnQEy2IY0aEr2+CSkfPG37IGe3wvB169ltj3MYRslnlXeDj+Udp+cosF790jngTFD+1DT+0EOvg3sPcU/PnyyGYowrZNOAw+vLTEQq3C6JsfRNUOvowLKKGfBo/Pn3G3ChDNqu8C5RsrqIqUgQlHEgmXP3QQozBvHwZ0d69+ssQhkEL5igg0QIqm9UqzL78ZITC7YIoW9/YSUcPlxWUinqp7iWD7IuojJazGO2Y7NzxKJVsF2PbiLcFBYOlqoooywMbTCZc/dJCMLgxMUFOZBLMUUCiBVQ2k2yYffnJCIXbBVG2vrGTjh7kxDzGcjJ1i5hMkH0RldFyFiPCNXjAUTpUlUn//dT/Z8WboDRixOToUW8EJZlw9VMLkVEwRwGJFtArrpBLmwyzLz/ZuE24IFaHU9NPVybrGLNaxEK8cAmDjJazGBGurOoq6js4l0gRFJ/RKFsnKLmssXlrG35qIaIFc5gEpZfU6IkWUNm0yTD78nmPW9n6xk6ZrGPMahEL8cIlDFFT0MJGuCoriZoXCHlUvC0ohosnbBAtmMMkKL2kRpdRI48SZCQUomEdY4ZFLAoLlyhEbZ6GjXBVsTUz24NS7wDxJig5OboFRSE1wioonZYzzAtomKxcbhGFOlrHWGZ1dBYuUQjzPI0C4aqpYV4H5n0QgHgTlDzGAg8cCLoU8iOsgjIs5YyqlYs3oZCxjn4ibAtXqr6XcbeSLAgj4cpmyr0AxJug5OYT7dkTdCnkh+esoAK1XFlSo4uGjFYu3oRCxjpGZeFyM29T/cba9zLuVlJwjyy1zdh/wEwFc5VCanjNCipSO5AlNbpoyGjl4k0oZKxjVOBm3qb6jbWvF3/O/ldUmwk5ZG45hToYu16zlYvHf+SICfSJFYLWciEA54c8TiEId4Afli/ehCLMLo8ozttUv7H2/ZEjdZmQ46hAeEW1JPFX2MGD2M1c5eIRQ1B4JGtTkEfLhQCMU5wCL3eAH5avOGwrjvO8TfUbo68//ZSRkzJL3hcFx1ggSfxVRQWznjD3jopBEYC8HJ0NotHzWTyKgncEreVaBaCh1Zk1kE6d9BTk+G6crCyiLV+KUER73qb6jbnvjYU1Xd4XBXkt02YLSsuWwhT6eAfJYi93Trbe6Iqg8EHQixIEoHGInlmrS6SBmP+Ou2ZuV4OWxdSsEPy8tfMbg7SUlujvWt6XWqixFB7LtAEo84WFxpXviDdBAQssaEK0e3fQJYkOghY6EIAV1Q21ulQaR6J/81qPoNvBLw1aFlOzQjhgkBgt38t2/bo6oLEUtjnpZn76XUdsKmncmN/90iDeBAVo2pTNGzZxFPgg6AUsmVZn1UCs/8a7HkG3g18atCymZoXwQ/RYCtucdDM//ayjtuOVvfLy+NzPBhRBARsE61TgA1kXMLMGkigGhXc9ZG2HqJiaFcKPzoLHUlTnpKg6Yosxzq8DQakUc0SMIihG7AnYIRYthXAJHb987F7rIWs7hD0IWiE6ED2WojonRdUR8SfYVKIRlEP87psCiqAg3X2jRvpWY7zHDbx9llFYwNAmIKzNm+vXp/Z2Xo8otIOMQdAK0YHbseRWZoVtTla7qKefdQRByWXrJV4HFEERg7z8uq3GcSQovH2WXhYwNxPSD6AMH86vu0YZnJZD1oVcljZWUBAts2SdkzzrmeljHbHbtXVroZ6GGK7IFoANGgRFYHSyNJDJLytLEJtMbSKyjUWRF0WSgkMU2j7K81PmelZW6ptKBEIRFLDBZs2IiouFNrw0kMkvK8uElKlNeC9Ke3Ynb2NRBFEWIhpHRKHtozY/w1TPxmKVeEVQAMQabNwotOGl0YJk8svKMiFlahPei5IV5jb2kyDaJUmyIAqWhkSw08ey1z1q8zMM9TyKHTyMLhQUCH2sIihAQWPdkoKJGeREtCsYeGpBfvoswzohZWoTHrAuQiDkLVo2bGM/CaJdkmQXfi+iYbY0pGobO30se93N81N2MhUVOXTkiB4OoSwoAQDZZI04FIFJaFwLBllcIVGekFGCdVHq0zdxO/tJEO2SJLvwexEN8xxL1TZ2+jhMdZedTEUFR47ocxYkRSCUBcXIhYIXOiFIgmJXMMjiClEIB+wSDz8Jol2SZBd+L6JhnmOp2sZOH4ep7n6MgyhbZdwCyjsOCRQMRVCMM3nADoM+CtyuYBDtClETNtyQwTLFe8z6vYjaKa+s88Jr28jiag1iHKBPX3yRxSRu0K+VVUYH8kI1YZ4GwVAExQB28myoHZRx1nQTQZlRowORi6qfz/J7EbUzx2SdF17bRgZC63ddk41NfGaQkzC4uCIcIAsogmIAjR90oKwsgsE6eTdtqv/vcZ+wYYbIRdXPZ8kwV2SN1XDSNrJagfweB8nGZqI+lNnFJaJfjdAHRVACBBofgbLl5Xo8Spxhnbxdu4V/wiqIX1RlXcB5QUSshtqtJHZsWvsUsk9mF5cI5QAEpUULfX0UDGVBsQbKKoLScPLCsjRqtJw+aUOAl5YQ9R+tX1OINECnC9SoYd7uZxXAuL9fVsMwBVu6gYhYDdG7lWAtnT8/HBYVL+Qt2dg0+hDtYBwgi2fI3A5+KwcIkAVBCQCKoMgWKCsDrJO3S5fgzenpBHh+NrtgBGXRIqKhI6Jj2rYuUDmsjAOL3N8P9URSQsPPjnc8w4/+DVOwpaxuJq8LTbpxbp3rWJRliatJV3Yv5C3Z2DT6FCTNuPeG9c7uLQM6c1QOAgqQBRRBMQMExRiMcUaYFharwLZLMGUNcLRVPw8EBQLYSsT8cr3IECcSdnhdaNKNc+tcFxVvZkdBSFd2L+Qt3diUzT1Z7VCh4iXDYT3JZspfE/EBsoAiKGYUFjJLSqO6qOW4IkwLi1WAH3ecvd/JJoB410+UdqXgL7wuNOnGuXWuw3JgVtL8Ght2FIR0ZfdzHMs2RxY4VKh4yfDDh/X4zKZsbQwAMV6FEwAnNSIOpexwYB2i4BCGwEYMCjB0KD8B5FRrEbFAafXbER8LWdzhdaFxutCKGht2FIR0ZfezrLLNkc0BKVRlZUTt2+shEFEjKHv27KEbb7yR3njjDe36+9//Pv3pT39inhTmSkmAyspKmjJlCs2ZM4e+/fZbatasGZ155pl03333UceOHY99b8yYMTRvXv1zPSZMmEAzZ870VmBEKSNbXklJQ4Iiw2KlkFyAZyI4drt+jT95CCCnWouIBUqrJ+d7RgVqjnpfaEWNDTvEKV3Z/SyrbHOkc0AWneqqwAJkfScoEydOZC7zLfSf//xHu/7xj39MkyZNojfffDPh9w8zc9KSJUto6tSp1LdvX43g3HzzzRqx+fzzz+t999prr6Xp06cfu87ntTW4VSvmh90o52KlIFYABaW1KLiDmqPyL7ROiJOsZQ8CIwKw6FSUM6U9Vw99iBpBWblypUZMFi1aREOGDNE++8tf/kKnn346rV69mk4++eQGv4HFZO7cufU+g8Vl8ODBLHZrE3XBbpJaNG7cmFmemOnJDzdPo+yGcShqsYqfNhyU1hI1iOpLXnNUhrEXdSjyIX97HS7TTy8OaAePrwTl448/1giHQU6Aocx/js8WLlyYkKAkwr59/7+9L4GSqjrz/xrohmbfV2VflUWWAOICqEExjDOgYNRxJhmPOjOHOA7kZDT5RyVn1EkyieO4zBiPiYmguCejRuOGQkSWoLIoICKL7C370kDTXf/7e7df96vXr6re/u599f3OKYqqflV177vb737f7/vuYSopKWngFlqwYAHNnz+funTpQlOnTqW7775bcAtBLhxw6tQp42HiyJEjtf+rokymKvvi1sIS07KZYI/HBXu0fF+/XkR7vsp+HYa5PUJkastnPmuFZUuJVooHgPuO8NoJE+KtK3KO4HcROQNxKvQf+b4fCxvCnLOuD3dh07JNPbal73qGNUZ9lLeo2tMHuJ7JzBeBUCUISo8ucgxl7P3Ttm5GhJKMQBRffN9999GTTz5Jn3/+edb7AwcOpO9+97t05513FvyOkydPis3LhTR48GCDjJiAJaZPnz6GBWXdunXGd/Xv37+B9cXEPffcQ/PmzWvw/tNPP21YYhgMBoPBYLgD5BiQcMCA0DpCF5BnC0quxd6KlStXGs+wfNgBPuT0vpNg9tvf/rYgmTX06KOPNtCfmBg6dCgNGDCAxowZY+hXRo0a1eC7QGDmzJmTZUE5W5huKysnU4sWQnNiB0y7qz8h6lYvzNV213JeBdEnnaikxiMzF1Yu+kCYuU1ccGFku8jAvy+uzXy0nOjX1xP9w9NUMmpcsLL6rftzz2UfNIY02bNm+S9H2G2aFHzcz0TrGWPfd1XPpMdiGvptHNYK8RuZVWIeurUv0WNfUsnocfl/I4b5wjeQ/+So8DSMP99Rg1JZud/3V0dKUGbPnm0Qh3zo3bs3rVmzhvbu3dvgbxUVFYZbphA5mSUaasuWLfTuu+8WZGggJaWlpbRp0yZHgtK0aVPj0RClgiwhA6kNLeFOEu+fqpZJajQGzGOYEDxPCpuFULiyKvu1mwytYWGsmIBP19TrAPA6Vx1qy2rUVTyX2MvqVVPgt+6dBaHdsCn7dQSTse82TQpe2lKFeuYqb0TalIL1THospqHfLrYEOWCMon3D1nTgN4RrMCMISsl7S6jkeHX+34hpvvCFo8K907SlXAtLnEKMS9UkKB07djQehQAxLMw/K1asMESuwPLly433JuRh/yY5AdlYtGgRdUBUTQF8+umnxue6devmviL5AC1L83KZpEZoZooSSQtEvYjCUDar9sBeVq/RHX7rnoTSXgfoJojMVd6kooSSHotpQBxBDl5/Q+X5ohL6kx6J5T+JXCQ7ZMgQuuKKKwx3zGOPPVYXZjxt2rQsgSz0Jffffz9Nnz6dzpw5Q9dcc43hqnn11Vepurqa9uzZY1zXvn17Kisro82bNxsC2SuvvNIgSp999hnNnTuXRo4cSRdccEE4hYfVpGMnoq1b00FQsPNb7HHnp/LgsQNlg5DRNH9jx5vExKHbQszwhqQi+XQai6oiDpJXaKOky3xRUyuKTTD/SSx5UEAkkKhtypQpxmvkM3n44YezrkHIMawqAHKmmEndzjvvvKzrYE1BgjaQlHfeeYcefPBBOnbsmKEl+da3vmVE8TQOk+3BSvTl5uhOeo0T8L163fmpOnhyldWwyu2Vz3YzqdfJSae6M+JDUpYM7o96kLxCGyVdUCmsJ+XN009QYPWwRt84wRpEBO1KoaAiEBJ7FtlIgMZBI6GxcBaBzrAfoKdDwjEnfz/gRwPAO1BGGLD2I5i/MVeJTZhjX3Tqv7pvdFSE2/scB8krtFHSBcePE3XpLHOgJAw+iycX0DhIe79vn/4EBap1qxhLBx+2k78f8KMB4B2of+i20EZZXms/wqF6+foiZ7WNB2m7zyqMt6rTQrCbHcgi1Bb0/PMkJBVE55yD42biKQoTlHzo3Lmh9UFHIKTOGpWggw/bjb9fB0uQ7tBtAYirvIX6ZxC9StKLVNK/7wVpy/Cd9Hg7VZve3pYYFeTk6afl/z/5REYhxwEmKIXcPAhPRqM5hilrAh0tCLn8/WmMZlB5QdBtAYirvIX0KEH0KkkvUkn/vhfY7/PBA9K6pdIYUqX/1riYZ4Suk9q0lpGsFsByYsVmIc+MA0xQHMxXM2fWRlehkdBYR4/pTVB0RD7diE6WIN0XBN1CXOMqbyFdUxDdU9KkMOnf9wLzvq5ZTXTokHyYY0mVMaRK//2zi3nmpNBc9u/fgLhgXYTlxES/fkQffxxe0XKBCYqD+QowctGhkbp0JapYG31L2NktRFbIIKnirjpJq09Uk46b3UUxLgi6CYzjKm8hq2QQq2XSpDDp3/cC8z6jvUFOVBxDqvTfrwrMMzggt3ETqb20AZt2wKpBeeGF8IqWC0xQam+6FVmv0VhoNPvpxmHDzm63batPg6zarjqNcLO7iIrEqLwg6OYe1K28KpLCpH8/bWNIlf57doF7BPeO4TVomPsLHgVrAvmKimiKaAcTFAfzFV7XAY2F46bReDbhUKiws1n7MQH2vzOivf9O99sNiSmWBYER/SJlEuJnnonXqqcjyeMxFPgeVR87Tu/uGERLFjXJljokCCYoDuYr87W8Q+IWdRVuno0boyUodnaL84qsB0nZ2S4j2vvvdL/dkJhiWRAY0SMqQpxG8BgKdo8EGV69uoSe+7g9srhkSx0SBBMUB/NVA+A8IDQuYquQlTVsE78Tu3XSoDCS3YG5ITGM+PU9SeqHokRUhJjBsOPoUdr2dUs6QO1ySh+SABMUN4AOBScqv/ce0Yrl0exonNitrrslHRcMNzswNiOraQlIq6WBCTEjLggJQ8tBg6jqq6bOUoeEwATF7eGB3bvzjiYtC4ZfAoVrcK35WTzrQL6SJpxRWwJUtzT4vX9MiBlxAAEgoj9eMqsT7e+cQ+qQEJigeDk8sFs3ot276t9jE7+eC0YQAqU6+YoCQetstwRgwc51hk0aLQ1+758XXYWOVstiB9psyRKitWvk66HDZHvH3W5HjhjBII07tktcc2IHExQvWWUnT5adZ/9+dXUh1omqXy+iUf3iL4PfBSOuSTYIgVKdfEUBt3XO1X5WSwCuCTt8XnVLQxx9phiJsw7IN6fh/SWL66/9syArAP4eJ9GsPCEzr0WZRsMn1CuRqkAn6dlTsNyh8vA9VWGdqPaITj47AYLid8GIa5INsuNWfbfuFl7IoNs652o/qyUAlpNiI3hx9JliJM46IN+c5tRG69bWJ5zb8qUcp1GezGeevdNJeAgUBBMUL0A0T7NmgnFWEpWXR9QkAaHCxOQ35C+uSTbIjlv13bpbeCGDhepskp0VKwq3XxSLterWgzj6TFqIc9qQb06ztxlQebIhYZk0KVr3DrwDrRsmZ1MBTFC8AFn2wDT37FWXoDh1el1wdkyTbJCcCWnJt+CFDBaqs5UgWOHUflEs1qpbD+LoM7iPmUy9ngGkEQ/Woag7p9nbDBoUEJJTNpISFfDbsKAgAETRfsIExc2hgSZKSoi6CqHsjh3qDn7rAgANik5Ii3UiDiBHzuZt/v3UYZJBOyFoJsj72LHO7RfFYh0XsVUZuK+Yn0z3APQMaSHTOiPfnIb2mThRPkygDa26lGHDoysbPAHNm8sAEEXBBMXNoYFWdBRunhYtiU6ckCnwVYN1UmokSBTyAgZdzOICT6ju8YGwWlRW+XdphEkG7QQB5CSshREbgcUFtDJMbPWwJBUjvM5pF10kSUocm7Qjwr3To4ea61gtmKC4PTSwFtVlzen9T7vQyY1bqWX/lnSB6D+NFV3vQ1vMigW6nihtXYjcil/DJINREgRkbi6kL2FiK8GWJP0RV1+uqZEuAxzjojCYoLg9NNBiZXlrUTcaR1tp/y6x6FOpXut9Me+qCi3eSZ8oXah8uWB1aSQhGI1yUoU7Ner+6/e+qwa2JDG8WE+QHb1TJ7efSARMUNweGkj1f9tPHeggtac2dFjMaer67xxRjP55t4t30idKeyEXMN1Z3Xa5yqg7IUVI/4ZN0fZf1aOA3IItSfogaVJ8/BjRuUOJysri+00fYILi5dDAOitLY/qKetJoWiX6FnQeiu+2ci1mxYbt2/O/TvpEaS/kAu6n8UVwoOH48USna6L1ycdB6pJekBhqIUlSfELoJ5s2U969AzBB8QjTqrJpbWcaUt6KvjFcMFESpjKVJ6Rci1mxAWF1+V4nfaJ0GOQibWb+XFaBMMdXHKQOKc3N6Az8FvqeNXqDUVxI0tJ5+LDs43DxKA4mKH6tLN8uF/4eoYDeuIGobev0mo3TBKjj871O+kTpMMhFsZj5wxxfcZA6M9eF9TUTlOJFUpbOM2eoWnD7P37UnVb+Pkc6DYXABB7iKOcAACAASURBVCUIcHjgli1EJ0/KDLNW6KwFiMv6E7eVCUcVbN2S/VolFAu5CANhji++74y4kZSl89AhWrahLf36w45UnS+dhiJgghIEbdtKFTTElHaCorMWIC7rT9xWprS5P4oZuo0vZAk1D4MzXzPihyqu9yRIcU2NkaX2kwNDBDlpkjedhipgghIEcBEgymDXLhlTbrWT6bwYxmX9idvKZE4K5iT1zDPJ64MY/qDb+DIPTdShvKos4lGgmF3vx48ZSUa7DOsipAn502moAiYoQQELSps29YcupcFsHNfuNKldcDFPUmmBbuMr7vIGIRlpHh9xbYrcZECOG0eOEg0YQNMvbU5nyvKn01AFTFCCorRUdsA1a6TLxy681BFx7U6T2gXrrA9iMKImGWkeH3FtitxkQI4Tp06J1b6JoZt0k05DFTBBCQOIJ9+8mejYMXnise6Ia7eX1C5YN/1CWpBm14FqyEUy3LRBHOMjqb4Q16YojgzIXnDwoCAnXbOt/BqACUoYwGFL6OwIOQ6boPCknl79QrG1bZpdB6ohF8lw0wboh8jTYoZGo5/iEWbfTKovxLUpiiMDsltUVcn2RNSiZvMLExQXgP4VZ/BYfXYN4sbRIXF2y/HjQojUIryFiif19OoXiqVtz5yRgmR75t6wdpUqED0VyuCGhLtx36DccFUfOiRfI/oo7DFj/901q9W5d7pkQHaLAwekVrKj2ufuOIEJiguAnDz9tPx/zrhxZOUDSflik3eCkm+hSrM/uNhRLG0LcmI9MiDsXaUKRE+FMliRi1C4dd9E3Tft5QAZwkOFe5emTdCZM3KH3bu3utnY8oAJigvY48Rzxo2DoGCXWFlJVF7uvhXyTQasl0gvvLStuUPft4to1ET5WvUzoHIdulgiyn3RReHtKlUgeiqUIUz3ZtTzjrUcBw/UW2vM9xjhaU86diDq3Dmc74sZTFBcQB4QmP3aEYji6d5dunq8EJR8k4EqeglG+PDStuYOvbxUvJgoowSs5yup5mKwwn7oInzhYe4uVSDxKpQhzFxAUc87VgvD4sX11icv907lPq8CqoXl5PRpYT3pIyN4NISepY4ZZpx4wbhx+G0x+ULBjbCupk3d/YDTZGAffNddp8fgM8sNSxKEWeY94ckjmBnYvqu0Rwmo5mKwAn0XCyEsKSAreB0mVCDxKpTBCwr1lzhdFH7vncp9XgUcElap9u3lmNMUTFBcwFPcODoEwo6RXRZn9biB02Rg3VXoMPhMYgKxGwaGFeb5NyqXX3XYd+hwJ4bhYohjF4rd2403eitLv17CldVPH3+/CmXQ1SXl996pVAfVUFMjpQbYUSNXl6ZgghI2YDHo1UsSFJjXysr8fY9ug8+6m3GC6uVXHeauEhoUM0ogDBeDSrtQa1n2iP4y2yVBiXviT4NbQReXVD6koQ5R9bXDh6XkAJtljcEEJQp07CjNahUV/s1rug2+QgRE9fKrPiGZu8xGEMfula/x36BmcpWIsA4kViVCV0wuKSekoQ5R9LWaGpnuYsQI9zIDRcEEJQpg8UBYF3zup4UWpaxp+gefnVCBvbdpm61BUQkq7oSDLH5+zeQqEWF7WVSESoSumFxSTkhDHaLoa4cPy/PhELChOZigRAWEdXUXGpRdu91rUcIefFiEgeeeE+XpHu0i7ESo7L+lEilQcSccxeJX6J6rRIStZYEGRUWoROjCgkrjkhGsr1VXS+vJyJHeIkn9JCeNAUxQompAw4rSR/jS93rPixIWEIo6pp8M8TTTLke1CLshVCqRAhV3wlEsfipFaxSCtSymK0s1qETowoJK45IRrK8dPEjUoQNRjx7RJyeNAUxQomxAaFEQbYEolh62qIs4YISi9lNnEVaJFKi4E45i8YvynhfjzlslQqeT5e7iCcG/M83INZYuvthb1liktxg+3H9whtfkpBGDCUqUDQj9RR+hRdm9298ZPUFhD0VNehFWiRT4IQNRL8hRLH5R3nNVd97FSJxUt9yVNZLWXIa7++VnLO3fL6UFIUTuuE5OGjGYoESeXbadFIl+/jlR8+aStMQFIxS1gqhX73oNSpJQyTzuhwyouiAndc9Vsojp3k5pt9zZrbmMcMfS6dOSmPftG0rWWNfJSSMGE5Q4GhB5UXbuJDp2lKhVa78/6R3mrnHWLNF5GyW/G9XdPK7qgpyUBUEli5iO7aQKrOMyrL5TKLFgklDRwhZ0LO3fL4MyQsoa6yk5aYSItFUOCsHOjTfeSG3atDEe+P8he5ZRG77zne8II0NJ1mO8LSnVKeFn+973vickHh2F16QFXXXVVYKg21J/RwyzAX/yE/mcV+HcqpUMOz58pD6yRheYu1EMHjzjdbHCPmmosiAn1WaY2C+eKNyYfeVz0hY63dopzX3H3jfsiQVVriPmaGTyXrBAPscxZ/scS9WiaEvfraRX32hEf1jTh6oz6XJlRmpBuf766w3i8MYbbxivb7nlFoOkvPLKK3k/d8UVV9BvfvObutdlNsHP7bffbnzHwoULhWC5A82dO5emTZtGq1atEkRB0SOle4pJcsdXMka9nXD76ALejarpolKhzQpZxJLaqQZpJxV31zr2HXvfMKKyNKljEi5Cn9blD0RRNy09QFupN63e2ZEqW6hh+VCeoKxfv94gJsuWLaNx48YZ7z3++ON0/vnn08aNG2nQoEE5P9u0aVOh83EW+hwWC/wTTzxBTz31FF122WXGe/Pnzxdzydn09ttv0+WXX+66jA8/TDRkSEwx3uVCf9JX+GA//lgm0dFl0lPVjJ8EdHFRqdJmSWlBgrRTsetXVOk7SdZRo03Zvq3H6RQ1NQiKEDgmFm2jHUH58MMPDbeOSU4AuGrw3tKlS/MSlPfee0+IkTtT27ZtaeLEiXTvvfcarwFYSaqqqmjKlCl113fv3p2GDh1qfK8XgiI4lMEXgFhYJ2LT0dnhL+zUKYYfLCKrQVrhJ1xTlTZLaqIPYgXRaHGKBKr0nSTrqAtJq6mhfu0P0F+2D6LD1C7RaBvtCMqePXvqSIUVeA9/y4WpU6cKi8ZMoSvtRVu2bKEf//jHdMkllxjEBJYVfBYun3Y2N0kXIQ7K9b3QrOBh4sgRoQURKC+vEhqXKtq8mSiT8VNLjygtIRrQh+ijj4jOnAwcq14ImVqzqvnsC5jXJ9knKYXMtW7rKgazkbgOWiUI9uAT18GKtWwp0UrxqD1AL9NCmPrG9M3fpqq0GbLB4tA/62uz3AXaI1Dftd0zI8R1woTgZVZ1jIaJiPqOUvUsVEdsAtBnsvpmjRr1rLGMmw7tafjEcbRtSE9q9WWV2PQTTZ8e01pGVWoSlHvuuYfmzZuX95qVK1cazxC42pERd8/pfRPXXntt3f9hFRkzZoxBVl577TWaMWNGzs/l+97777/fscyPPLKImiP01/h8zq8OFxBZT8V/Dsb0gwLnVVBc1Usc+epq5GEwQx0r4ilPUIzq53yqrw5t6lj2vd7aw089C/1uVJ8NAh3aMwzoUs+gc0WU9RxTX7YSOkFX0SLxqEcca1l5+Ynof8QPQZk9e7Zwh+T3h/Tu3ZvWrFlDe3FYng0VFRWGtcMtunXrZhCUTZtkqnZoU06fPm1ECFmtKPv27RObJOdd0p133klz5szJsqBAs/L9708W7qEOdMcdwrhR6rpIwXH0KNGKFVL4ggifiGCweDFQ6JNOVOI3zFgTFKwrziNCyn8TyA2D8GvVIdyWhhKuFplJFxHd2lf/Ni3QHoH6ru2e0QUXuregxIzExmjM96hY5qLI6/mcbdyITTz9vx+H/zs5jDcvv0xCQ4o1XsgUVCQoCO3FoxAghoWgdYVYiMeOHWu8t3z5cuO9XETCCfuFXuMr4SsEUQFGjx4tyEQpvfXWW2I+kxPa7t27ad26dfSzn/3M8TvgGsLDjgMHSmnXrlJ66aWYlc+t24sJWTDgtWuJmrWMVKELMo2BkuZJwVVdkajOPI/IfK3DPRkrxsrpmnp/+ehxop4V+repi/bw3Xft9wyvFb5XiYzRzduIKquyX4+PVm+S6rnI1D3t20WZ8yZSyRlYNxpFP24GCNFJSWnsx7usXl2qtwZlyJAhRrjwzTffTI899lhdmDHCga0C2cGDBxsumOnCeXbs2DHDhXT11VcbhGTr1q30wx/+0CBE+DsAke1NN91khBYjxLh9+/bCEvJ9GjZsWF1Uj1ckonxG8jakwIdg1kGrk1roGHqaJFQO11S1PXSJtkoSughBdYEZ/VWOhXui1IlEQfgmCLINDaVYK8XOP9YUr0msk5HmQVmwYAHddtttdRE3SKj2MGJ7LUDIMawqAHKYrBVWhd/97ndGQjeQlMmTJ9Ozzz4rPCH1rpAHHniAmjRpYlhQKisr6dJLL6Unn3zSdw6URJTPEMgOGCBdPRDwOlh4AhMACPzgU1cJOoaeMsIHt0ey0JWwqwrH1P4RbOaOCHIyaZJwUYyXqSsSPN5Fe4IC6wZylOQDxK0mysvL6U9/+lPB723WrBk99NBDxiMIkAPFzIOSCKDFwTk9OO24e49wzumxEgBEIzgJLJO0aqgaepqUZadYoev91rHcucrMhD08RJHa/8+2zVxNNdHAQZIpxExO7Me79O9P9MIL0f9mUZ/FI/S+yaYjwSTRTxAIIfA1mDESuAWFnwXfPhCAqCYv+0DG5ImU0lFP9oXqGOc9YOh7v8Mqt0WzQKMmytdRnTwS5r3WkaDFAdMChfYEwkjt/5VtLv9SbGQnTZb5tBKA9XyeCqEDZoKiAaqrpXjIemigJ09T69aSpKxZQ9SiRfCTKO0EwM2Es2Z1/oERlWkZv20q0qNepOx18vo6CHhS994eSaFQW4VV7rg0C2Hfa12JZdQwLVKGRmyvfB1ULna2bS7v3l2uFaoe5xIBitqCEray2fTPeY4IgmAWVhTQ0tpopVAIADQobiYc+wGOGBhRLbxW0zIsJ3EtUvbBbq9job8HQdBJPZ+uSFfy4/d+R13fQm0VVj+x9/UoDzvNV2av91NVYplGXFg7l2/fTtS2LdE11xB16JBsmWIGE5SQlc2+lM5IwoLIJhCFo8LV00pYVfzCSgBMNp8P9gkGA8EcGFEvvFGSAjvMOlknYi9/D4Kgk3o+XVFSO9qgRMHv/S5U36DlKtRWYfWTKDQLuZCvzF77T5xjttjRqHYuR7QnUntA+KGItyCuojBBCVnZ7DsiCMwYrb5unRRABXX1uIV9whk+Ir5zS6IkBbkGu9+/B0HQST3ffc3VBklbGgrB7/0u1OeiJs1h9ZMoNAu5kK/MXsdwnGOWQUY4sbmBjfhoFC/egg0b4vlNJighKptNDYpv9OlD9PXX4bh63CLIhBN04Y2SFKgEp3vshUDY77ObNojaspKUqb9Qn9OFNEehWfADr2O4WMasCjhzRlrVzz1XWlASRuryoBQDrMrmwDCZMvLCBHX1uEWQCYd3U/7v8eLF7glEPl1RrjaImkAkZeov1OeYNId7PxnJoUJsVLt2JerbV4lWSF0eFEYAVw/S4Mfp6vED3k35hxcCkXWfz8jDy3AmB9JeY0FxIjZRE4ikFrZCfY4X3HDvJyMZ4Ly20toNK54VAOdBYUj07i1dPYjsicvVoxvsLhIcka4T/BIIhKPiNFOEZ5tncjgtMFEv1KoubKqWi8Hw4tqBFX3oUKWidjgPCkMCjHnw4HhdPbrBrrEoa1R7DLkm8EsgjHDUfoUtL7xQMxh6u3b6CE1ikUNh/0GRo127WlfPGvVdPUnAMY+ERgTFL4Gwh6NymGe0iCvPDH5nsYb5bBjhAhtSROso5NpJErzqqQwkcMNpx7t2CkYtXD0ffMATWBJ5JFSCEY4qdli9etdrUBjRIa48M3DdcYbWYNA1aaGJqiqiI0eVc+0kCSYoKgMMGqcZHhOd9u23iFaulO9ziumGLhJz4U47zAl31iwxIWs0+eqKuMKp7ZlkOUNrcaXhB7nat1fMZT3ZtWMBExTVgbN6BguS8sKL4Uxguu8ycrlIjHwSDAbpGU4NC6Apenb7O2kZy2FB5zT8sJS3bSe1h+zOrwMTFB2AQ6JgSdm5I/hEqfMug8HwgjAW8LjClmEBPF3j7Xd4LKcjDT+yxQLniDm+Zctky6IYmKDogJISoltuITp1iuiLL4gGDPA/Ueq8y2CEjzTvwsNYwOOKhvLzOzyW9c+BA93J4UOCnJxL1KVr0qVRDkxQFIP1QCYzdb5xunazZkS33kq0fLm8yO8iousugxEN0rwLT/sCzmNZ39B6c2OwaZPccF75rWTWFcXBBEUxWA9kMtMK16XShx4Frp6PPiI6cYKoefPi2GXoCF0sE2lexM9OORnnsZyOjcHuXVKDFNqZKR7XFYXBBEUx2A9kanBAU48e8gCpzz+X8fJeBVU67TJ0hi6WCa+LeCHipRIxS/sCzmNZX2zdEutJfJ8VWlcUBRMUxWA/kAmvG+hRBg4kOnKkPhU+3mOoBV0sE14X8ULESyVixgs4Q9VU9u07EG3fXvtGicNEnx9eXTYF1xVFwQRFMVgPZDI7XgPAcoIjuI8fl+FpChzFzdDMvWC3dFx3nTtLRyHipQsxY/iHSlYyHe/d3j1Cc3KlzBa7cWOeiT48l42rdUVBMEFRDNYDmfKiTRtJUj7+mM/rURGquxf8WjoKES/ViRkjOFSykumGvXul9WTYsNrkkvG4bBq7XVcUAxOUhBFIXY38KJWVRGvWiJYsJSovj7SsiUOnnZvq7gW/lo5CxEt1YsYIDt2tZEnNIwcOyDkaqexbtAj0Vedo6rLxCiYoCSOwuhonXiKiB6JZ6FHSnIWQd27hwa+loxDxUp2YMYJDdytZnPOISYYgiu3YiegfvhvKOTszNXXZeEWKVzM9EFhdjQUBvkxYUpBptlt3da0KQWHfqUFktnixfL9fL6JRGp1mnDTY0sEo1r4TpwXISoYwX2Gu7inmqoBoHJPLJun8KUxQEoLZ8Lt3Z7/vy1QH0Sw+CJICHycsKcWwc8tk6gf/HjHJzGaC4hps6Ui/mzEq6N534rQA1UXq1GL9+uh+K4X5U5igKNDwAFySOIYB8x/Ii2eWig/Dt/mXv0hfZ/v2oZZXiUnevnOzD34GI2qwm1F/xGUBwjzXrp0l54n3cOKkkXT+FCYoCcHe0IgYxmPhQrlW+2Kp8G2akT04gKq1j0yzKk/y9p0b3Dv2hEcMRpTQXSDKiNYCBFICPPccUfPWkvz07Uu0eXOWWCRp14kuYlwmKC4QtDM5fd7e8KGxVGSaBdP57FOiZk3SPclbd0LQoDAYUVv1wnYPWBe0zt2L02WUJixbRjRGuJq3bRUu9yrZP266yZXrBOuCaqRlZsJiXEVXsHT54XJ1RrPhQWDWrg2JpSKrbP/+RCdPikEiWDspSMvDmuStO6FGmOiF/oaRLmABXxyD5sOtVS9s94B1QduwKffvMvTAjh3iH4sWbts2166TsPUe1baN8YwZRC+95I0AxSXGzYWiJihoQLhUCjVYUD+c0+etDW/vSIFZKr4cX1R9SrwQKtzqM4K4CCGtKtA9CoARH7CAxxES6taqF7Z7wL6gsctIb3Tpkv06x27TyXUStt7jeRvhwSbY3AjrcmBgUROUN98keuGFwg0W1A9X6PORsNTS0tof2i3P7OmkUPixrlEAQSM4OALE5wJO0S/gSeX2wCm29nIw/CPJMYYoSlivAWSK7T8k527TyXUCQhGm3uMzG8HZEu/5hKGgqAkKdEtuGiyoHy4xP17TpkQZkmf17NlD1LVreIO1GBfboBEcfw74edzzZUtlvpel4nnshPTfcyzgpusjygU8Kaueke68gqhX73oNSpLQfVwHHWN+cfq0PBdtEAiKcNf96P8Jq7XYJOaA06Y01zpR7VMDad8YI6dnaFKCmFDUBKVfPxnwUqjBglo4kvbj0blDhSZltcyRApLidPqx14kpqYlAZ3Fv0M/jnq9cKvO9fCD+f7om/fccCzjqaScOYS+kSVn1zDLPmiXqpAAR0H1c5xtjUZEvnE6MuRUMYOAASVBCXCee96lNsRMeJw2KGzgRpLhQ1ARlyhSZ4yyJGx8Unlh1q1ZEI0YINvaR2KyJ3VrnzsEnpmIMtwzqBgj6+WK857mIQ5gLqe5WgzChex/LN8aiIF+YiHE6MX4HKR6aNJJW6zDm7RyWfbeuGSfC42ejbCdI77xDdNFF3r/HD4qaoCRu2QgAz6waiduGDSf66CPnRG5eJybdz+NIwg0Q9PP4DDLmWl8XK8JcSHW3GoQJ3cd1vjHmp8/kI6/42x6h8esirNLDhta61Ks8zdtwufzkJ/lJyjkJ5yKxEyIYi159NZ7fLmqCojrysW1frBqWk+HDpV/r0CGitm39T0zFGIkT1A3g9PlCE6D1bxOE5qSs9m8XXCg1KMUKe3/FvcLDj+VDd6tBmIhiXMepnco3Rv2Qr1zkFcdsYKVu30HOqeXukmLa52kQFMzx+TaXMxPORWInSHGCCYpmVhJ0zkBn+HQXQrwqwfJXC03K0SPC/dPa38SkaySOasi3e3f62yS0y15JVlTQLCQF9E/kmED+EADPuF9++qTuVoMwEcW4VkU75Yd8OZFXkBMEHZiucxwzEmCxL7S5bJywpd8kRHDtgJPFCSYoCsPecdFBYFV59tnssPtLL/XIqnv2lMKuTz+Vr0FSmHAkg3y7d97Z5wb6q30XHkZG4mKxBsYJVfqxnznOibxilQYpATmxWqFdAPO0NR9JEi4brzAJkrk5xrqEaGozRUeUYILiAX7DvfzCzrYxLt57L/saHFzsmV0jigfnQwDr1sln05KiMtIoZsy3ew+ys1fxXoVdpigyEnuFivdZNeisnbKT1wED5Mmu550nzz7zCKwX0JwEjYqpTuAsH6slB7EWTFAUg99wL79ApytkVvPNvnUkKTqKGa0LGHJ6wDy8c2f9YpZv9x5kZ6/KvbLWH/83XTJhlEkFy4cq91lloF101U6Z5BXjFgkvm5f7Jidhumyej3ktSgpsQfEAv+FeQToy3DdmRwQmT5ZjJhTBlElSMPis7h5VoYqpOOgCZv0/Jr9cC5rjzr72cDld7pW1/nYELZMKbklV7rPKQDtBMxW1dioqa5ZJTspBTkYGIic6rUXVCpy4zATFA5II93JScIfaSUBSkLEOz7CkIIa/taIkRUcxY74FK8rFTJV7la+OOrRfnNFEDPWsWaYgFpqTgJYTndaiakFO7ror+bN7mKB4QBLhXrEouK3uHlhSMCjbtIn4R33sjLZvlynBUV4IfXUQM9oXMPvfooIK7g+n+qP9sHinRYwaZjQRQy1rFuYdUxCrEDmJYy2C5cQq5DV/K24wQWFkkxQsHoYlJeNZoR6bm+DiifEuAEFMx1ai4KRBiQoquD9yEaU0WRfCjCZKAmkS+YZpNTTJCazJICft2gUvn0Yb188cyEgS0UZMUDwg9cIkkBScJ4EJCvTZKeNsEhNc0n7+IKZjVYhCUtCt/n76cxgLIxKYbd4WP0lIk8g3LKuhkSF2j7QijxTkpK1a5CQJFxIOZ447QRzABCUAq3RimalAr16SosOSgngynIbsdMBgXBNc0nqKpAkSIz746c9hLIxIYFZZFT9JSFPfDoMMGwf/CXLSsZPMEKuSqztGRK59dIlIafrBgwfpxhtvFG3cxnjg/4eQYj0PSsRC6PT4+c9/XnfNpEmTGvz92zGYMuwmLtUT7OQTQC1cKEVQeMbrBoA7ArsHnKaI3QR2FUlNcJjw4dbpI1xQF10sy7JggVhIFucuV5iwE6I0iDsZ4fVnc2G84Qb57Nb6gb4Ly0mhMkQJ7tv1QIZtpOju1p1o1KiiJSdWFxJytuA5CXISuQXl+uuvpx07dtAbb7xhvL7lllsMkvLKK6/k/MxuWw73119/nW666Sa6+uqrs96/+eabxc0Td68W5QgBixhJn4kQu6sKh2CNKiVas0aSlK5dG06+cVg3rDsjkJIl4gHEtdsMU3CaJp9/WHC8JwmVJU5rnTUFvL0McUEVMXXSOHVKhhL37i1PJW7WLOkSMaIkKOvXrzeIybJly2jcuHHGe48//jidf/75tHHjRho0aJDj57piEbTgD3/4A02ePFnoN2ujTGrRvHnzBtdGjaTPRAgDsJYg+ZtrVxWU66NHC5KymmjXLklSmjRJboJLwiQdpo4iTT7/sJDzzKEEEGd/tvfdZmKTNXZsfCSBybLEiRPC3H9A5m/HzrNUbMoY6SYoH374oeHWMckJMH78eOO9pcKsmYugWLFXqKhfe+01+u1vf9vgbwuEiX/+/PnUpUsXmjp1Kt19993UCoc3MQpaT+yZaQu6qqBkHzVaCmeFRcw4AAiunyREkF52uCpOwGny+afxnsTZn+0p4EFO4hxLTJblganHjhMNGiweg5LzZTDiJSh7hEugc+fODd7He/ibG4CYgHTMmDEj6/0bhK+3T58+hgVlnRBy3nnnnbR69Wp66623HL/nlDDf4WHiyBHRKQ1UUSYj/I4hAevhyy+TsBDJvj59erLroVk3ax03b5YJEU2gieCqQvRrXpSLXcV5Q4maNpb5SBDdk4QZ9OIJMm02iBJ0MoL0UqMayogHYD4bwBHvMKEDWAjKzIyWCaJfr+xFCa+tZXY8qn5ZXX0zE8QiZq+n7nC4J47tmTaIvpxpIRfEzKSLhKVSbObirO++XXJcW19H9PtKtif0kFWniYYNEa4d0QdLRNkyNaHPubqiJu96Fk/9SjICXj5wzz330Lx58/Jes3LlSnrzzTcNggF3jhUDBgwwNCV33HFHwd8aPHgwffOb36SHHnoo73WrVq2iMWPGGM+jIG5yWeanhRADriIGg8FgMBjucEK4xaAxPXz4sDCwt1bHgjJ79uyCETO9hdBojRBWwkVjR0VFheGWKYQlS5YY5ObZZ58teC1ISanwG27atMmRoMDCMmfOnCwLytnCvFpZOZlalNfIvwAAIABJREFUtAgvO+B990k9qQlEqf3wh6F9fV68+KJ035iAVWTGDLBcWJW+SSUlpS5YsUvUVEtTzKYvhEWlqfeEbohcQFilCRwgFtCyYezMzqsQqt9OYiPUKLLfCQ02y4i0BDk0xHPP1WcpFcgMFILKeRdm1zPI9ysKx/ZMIRKtZ4x9RJn2RJ2ROgFm5HOFb7tzF8/zqi1eIwvScpI95+qK+/KsZ5WV+2Mpg2eC0rFjR+NRCBDDgl2tWLFCuFalWXr58uXGexNcLBJPPPGE0GaOphEjRhS89tNPP6Wqqirq1q2b49+bikUUj4YoDbUT4UgbUcWs17nSh4QNdKTKyuzXGEiwj6GOZj3hYr3mmoA/1lh81wAxuJu1kgrb3WLAd+rkfnJDQirkfLC+Hn+hu8klj6YEpkBMfnUTIE5NPV1Tfz1eq7LYLbYIQzdskuV00h907i7/bqJTt4b1DPL9CsNVPVOA5OrZqOG4q/E39rRoT4QRY9PcWcxVQ4e6SsDmNK8Wmj/tc66u6Jd3PSvVW4MyZMgQuuKKK4xw4Mcee6wuzHjatGlZAlm4ce6//36xkxdbeYuF43lBW3/xi180+N7NYucOgeyVV15pEKXPxAI5d+5cGjlyJF1wwQVRVUf5MOTYDzI0z8OBiwwJ3XbvkmHJ1gifsEM5vYr6VM5i6lYYao8qwS6XKsL7foY+CIEkFK2gFpE6yIyNJJTnCM1JeXNlD4hVBTMVSKsRaR4UEInbbruNpkyZYry+6qqr6OGHH866Bm4cWFWsWLhwoWChGbruuusafGdZWRm988479OCDD9KxY8cMV823vvUtI4qnccIK7CjDkAsdfZ1YZ4I1Teh/jEMGccYMwpIL5aTxG8qZpkXXLUmzkyy3IsMg+TySXAgZapIEv2PP7EsQ4I6aWJtYMea+dPAg0cmT2A0TDRzobhOl0CId9lqhU1qNSAlK+/btjVDgfHDS6MLSgocTQEjef99ycFyRoFByNafO5E3+HAA47VNYsAxrCrQpMKXmE075tWwknfJep3wbQb5f991yWhEWQfdDQINaPY1ooYlS8+LGnRum3gR5TTA/ocwefe4qLNLFfGYcn8WjCZQ/Bwh5UZCBESRl44bCZ/gUe9bLqN1Pfr8fkzqS8qXBUpU2S1BYBD3O84bsfQeC3DhgnqnTrr3Um7jQTaYFn6m+VngAE5QETWheoLIvtP5+NBLl6kczL25BjdcLlw+OLUDEVqGb43YhUVlTkpYFE+Wzn5elq6UqaUtQ2O0dFkEPct5QUFKFaKGoAVXr11/L38KmCRbeIsI5Cq8VXsEERRMTmldfKEgDwomR4w6hctAgR0WiGt6PrvTtK03x7O7CupS0LSSq1tMN7IsVQsh1sVTZ2xEJBZO0BIXV3vZ6XXutDKF/5hl//TVOV6nZd6BBAcaNledpRTTWqg8cpNUfVtInRwZSy9GD6OoxZVRsuWFnaqibyQUmKD5gN5n93//JZ3SEqEiAV18oSINJUPB/WDyjIlGOJsVvt5Zn+Hz+OdGXX8pdTbt2zi6fpMWvcRGHpOvpZ/EaPkI9K4/bduzVO1lLUFjtba/Xtm31uXH89NewLDFuiL1peTHE3XuJlq+IZqxhR7ZvH61a04x+9/FI2k6iPJsbUU0TffUXfqGjbiYXmKCEYEI7dqzeghB2x/DrTorTD5nTpIjcMzCxYhe+fr20piC3vl1Fn7T4NS7ikHQ9067zsbcbyPDFE5OrS1jtba+XPQGm1/4alqvUD7G3a1DCGGvY/Ozfbxxk+t6JIYKctNNef5GEjEBFMEHxAdNkBssJyEmUg8GvOwmd2nrKQJR+yLwmRUyGmJgR1QOSghORcY6P9YiBpBfFuIhD0vV0A511PvZ2RJ6eJOsSVnvb6wVdlyW7cGJE104uIK4u5LKBLsSaeDBI2RGmiBBinLOG8OEBA6jndrEpEvI33fUXaYrECQImKAFNaGYnimow+LWEgCSYhgr835IHL3Q278qk2KaNdPmAqCAUGYmToE3BLjfpRTEu4pB0PdMO1QhgWO1trxcycUODknQ97cQJ4mpYVfLVGYkGrdmd/ZbdiNLZKwWwmFd69DDmkrToL9IUiRMETFACII7B4FeRDdJgprrHc5Bo39DYPPIRDBlS7/LZtVOehYH34xSzOn0PEwf9o5bSSgCd6qVCPdGesJpYo74KuWzCaKPjx6XlBKQE84kl55Lu+gtzMwhvuBW6WoKCgglKAMQxGFTYEYTK5sGUuncnatVKmHrXS5906zbyddRiVnPBtE6qqkbTpAE6RC0x/ANkAyJqs42jdjdh/EJrgmdMhjgcxu3mRhNYN4OmN+/SS/W1BAUFExTFocKOIJK4ehCSkaOE60dYU774Qop5cOBgvjTU9t3ZihXy2diZ176Hyev9JURra4/hHDqsNoqgUfaCme97GXqJj/1aanTIS6M6TBcNQrphrsUzwojDvpemEBaRgEhZLwSxsZ3EGiPsm79u3cKb/3UU3jJBYSRnxQEZgbgNolmEIyPzYz5rit3nfbKynnBMqp0okUp7iZggTfx5Sb1ZOdcCqWI0TRpgby8QAjzCJgF+LTVs4QkOc2yBlJhtsHWL+zYoBPSXA4KYVJ2RFhMhhM0S2KcMUSZZe15D4S0TFEYsVpy87B1pqCGiRb4UCGhzWVPM3RosJyAnJqzEwymVtvl3+4LZtBlReTO584ti4VQZcVgP8J3WnB14LiSijNNSo0NeGl0Qxb20Wk3OGyStJikfo1G69D/z6ap3mrvjAhOUIjWdxY2C7B2+5EGDJFlBfPQeYU1pI8RvrVo7C+xy+b3tYYzWv1ujIbBAY8E8dVJaXIycGUWkj4jDeoD2si8oUZAAv2HiTp/Txe2jWjnDDNU3tSaYWPv3F1YT8ShPr9UkzM1gdZ61yK91xmnuhi4mDjBBKVLTWdxwYu+Ogwmhx9/4hpjstkhrCuTsdmtKvnBShDGeqs7WoJh/txKcBQuKe/ecpuR0fsOLnT6ni9tHtXKGFeJttZpgwwIRhkVrkm8BZlDetcivdcZp7maCEhPC6PB+TWfFBCf2nnMwwZoCbQrICqwphjbFYk1xDFWsqf/bxInyoXtW1yh31WlKTuc3dNXpc2ERt6gtHKq5p4KGD1utJtCZ9O/naDXhzSDlXbM+tSSps7/2a51J8vDBoreghNHh7Q2ITf/Cheqy+yR2IU7sfd68AsTOtKZs3SqtKchC21G8V9Y0fUm94t5V656cLioCEBZxi9rCkSaCDc0Zwv4hlofVJE+EDm8GKe+ahWFhhf11WHP3gQPBv9cNip6ghNHhzQZ85x2Z3BCPqM7mCQNJ7EKc2LsrZg5rCnZU0KYgHBkkpVR02/Ydgi1IaUzq5WVXrXv9oyIAYRG3qC0caSDYp08Tff212HCUyYRrffoQNROidUV38zqsWSU2Xmd/rVuqi6InKGF0eLMB0VGs53ip6upRZRfiyScqfNLV542i1z/uTpVrvqD+7XfS8AvbUOO2FhFtsSNNu+qkCEBYxC3qtgirnEmIba2hw8gGCyEsNCeaJK5Uec0aOpRozZrs1zqj6AlKmB1eF3avSjm9MvPnX2xMT7/ag8qoI/XavpWuLd1CY4fuENYVIaItT1dGyaLdVatKxrwu5Em0hR+yEbfY9thRoTU5It23sIzCnePBv6xC4kqV16yZKSNwRU9QvHT4QtoNVTvHiy9KVm2WSdVyFoJp6TlNTWkTDaJFJ7rQ2J6bZe6TZgqKfeKG7m4bL4ibAHhdyJNoCz9kIy6xLdw5AKwm2Nb37k3UNAQtWYjQJUKocZ41K9/fdETRE5QwtRtRdo4ggwefQ/Setcwqd+JcdbVbfnqNaEs0cqQMRdyC3CdCaHdE7M5atMnvfFUthwTDO+ImAKpFzYRVxqgtURjMhqJSEBMAove2Qk+mIIohQqhaExJmggmKJtqNsAaPqroYN3V1tPxgocLhgx0FKaG3ZVZYnJKMM35wFLsOOSQY6kMHfY+fMkZlicImAJE5lSekoH1gX/HmRzJjtGbzu26LeppIGBMUTbQbYZEjVXUxbuqa10JVWibIiXgeN45o6w454R4+JCfH8nL9dsMMtaCDvsdPGcO2RIGYwIqJ0OG2beXBfthAlJbI8anh/K7boq5DgIRbMEHxgCS1G0HIEcpp1aCkmgi2aCF93JigkT8F+pSDB6Uoz/R5q7IbZleTPtBB35NkGWG5hAD20GGZVHH4cHnshBk2nKlKplwhzO+6Leo6BEi4BRMUD0hSgBSEHF19NdE110RTLmWJIEzJ5iQJooL8KSAEyKeiym6YXU0ME+ibizXVRR0/LojJQZn59dxziXr21PLE4Vzzu9tFHa6gl18mmjFDBiZMn66eK2imZgESTFA0QdrU2bHUFUJZWE6QY8GwmmyRhxBi4p8woeFpyXGDXU0ME8uWqauLymXpg/Ie+UxwKviAgUK13ouoVaukS5vYog5XkElQ8P8zZ9Sbsxtrto4wQWGkTgjWAJhMO3eWZAWZ9EBU9u2TBAXkBdlqk4AqriZG8oArUlVdlN3SV1UlM79i/PTuQ9Snt9CbuEu0piPcLuppcgWpAiYojNQJwfLONBDsgayAqGzbRlRRIS0tICpx52VQxdWkEszd+j7hkhs1sfYwEU1cHUE0RnBFbkCovIJk1U6Wtm8nuuIK6crB+Tlh5FNPAbCxw9mm1teMYGCCUqSwW0zsp2Cmmv1j54cU28hiCYKCCReEBQsKIg/sUT/FLLxMarduZAaeKF0f40MMfY0z/40XjdH48USna9Qjq7hnIPRWS9/YsTL/ECMLsDqbXmP8HxoURjAwQSlS2C0mw4Zl/70o2D8sKiApmIBx1DsWBxxFjcRSICqICEor4lysvfyWfbdud33oJErW+fBGtNnhw1IAO3q0jMzB2IDwXHVlZYLTCQISENCEZzYsBQcTlCKF3UKCwXTttUTvvVc/P8HK4lWHoqWWBYtDp04ywgcnqmJR3LlThie3ERNzy1bpm23iXKy9/JZdlwPXh66iZB01RlB2gpicFALY1m2IRowQbtFu0qXDYMQMJihFAjtxGDQoO3TOPPXSPI154UK5bnvVoWitZTG1KHggIgFExSQryOcAq0rSkT86LtZefst0bUCDYro+dCIMVmsRyNWFF8n+o5LbxgmIyAExQfnR/zFJwLqo2Hk5jOJCSmZbhlfiANJw/fXZlo5587I/8847UpuCOQtrN0hMIYuIykp2T9YdmLRxEQ41A2uDTgV6FTPHioZ5HhLb3Xv5LdPV0Qji2L3yNf6riyjZbi26WOhobrgh/N8JAxjYR4/KBGtlgoh0E4Skx1nSmphUZBuDYQETlCKBnShs2ED0k5/kT0iEddm0qADIRlvIIqJypkJf1h0QEbh9ELHw9dcy4RtyqUCzgrN+QGSU92ElHEFk/S2Ik+GkX7Ag/oRkceg8dMhtc/qUzPiKcGHkLRlSay0B8U6bK5OhNZigFAncEAdrQiLo4azkxK1FROVMhYGsOyAhXbrIB84aQR4VLD64SVj4MLnHFf0TBuIUZVp/a/FidROSpVl3AmvJ8WOi7x6VbkrkBALphrUkZDeOk6XSzkG11KoxYgcTlCKBG+JgTUgEDYppbbCikEVE5UyFoVl3YDXBAzoVuH12Cp3KvgqZVbN5C7krTYtWJewoIB0sDGFYi+AShKUIzyBlSaWuP3lSunFOnZIWvwEDhCunm9SZhFAeJ6LhZKmEAD81WrUQwATNHVI+izL8EgeTwDhpUHRF6NYd+OmR+A0TPk5OBkmBIBKkBYtTi1qyosuZKnFEAalqYQjbWmS1FG3dEq+lCK4bkJITJ6R1BMnU0E9hLQlZO+VENNxYKlXWqsWBYidobsEExQHMbtW2hCRVp5z9AuwNqb7x6NtXhifD9QOtCnxlWLRAVLA4pIWs+LWEFEv23LgtRQgPPnZMunGalEqXI6wlCJ2HtS8ibYkT0chnqcQhetCyYSxZoZJWLQ4UO0FzCyYoCbBbJkAp7hdw7WCnisfAgVJMC6ICq8ruXXLxAFmBXiVOQWLYidn8WkJUS0gWFeIKaQYhOXpM9iUQEQhe0fcQEh+DqMOJjOSzVGIMIaIZQHJIFFE1rVocUDmYQCUwQUmA3bJ5r0j6RVmZdP/gUSnM7fsPSJLytSAtBw9IsgI3UByWlbATsxWLJUS1+2NaSuC+gRsRupL+/SUpgSsn5vBgJzLiZKlEUe3AdfZIwrQA3DGfCFjlYAKVwATFwaIxeHC07JbNe+nY9aDf3HWXyyiEckFCzmouw2yxwMANBKsKLCxwA2EHDKKCBScKgW3YLodisYSocH8gdEXKeWR3bdRYWuBAShCJA1KSYDK1IG7TNFsNXn45v7U1jS70KMAExcGiAcW5PYlZmGDznp6w7npATtau9eEGBBHBAoMHwjyx+ICsgKggdBm5VqrFLrlZubSuIINtGEi7ODVt22/4QUBkIXht1lS6b0BKQEigL9E0SgxjCBqUtFsNrKca2zel7OJ3Dz17OUVr0UDnitL0yOa9ZOF3grDuemA5CcUNCAJiuoHMc1BwWCFEtkfE//cLwtK4idSswMLS1KeugF0yagNhwEcrJWGFPwRt3bU27w7E17CspUBgjUP0rrkm6VJETxRwlMjy5c7WIhVc/NWa5KFhgpKARYPNe8kijAkikj5jJtDCo18/uYM+BOvKAZljBcSFxI6aGstkcU1buNccxOWSifOUZF0BAgJCAh3JGUFIqES2dXlLaVWDwLVdW+kWZESGKInC9Olyv+FkhXfr4q+OkESoQJLcgAlKAItGlB2IER3C0ABFbgXDom4mhOvZS852xrkpgrCQ8C01KpGE5UxVtoUl6TNUwhDjguQsW0o0SpC0peJ57AS9SQ4ICSwjlaaFRNSvaTPpwusiNEkk7tMEUccWbfSuZ8rmgSDze76DVt1ubp6PkEToooNkghLAohFlB2JEhzCsH7FbwWBdQfbPtmKXnVkrLRNHkSX0SLaFBUQGOhdEEMF9BAFlnKQlDDEuSM5KQUxmC4Lygfj/6Rp9BLkgI6dPSyICK0nVaWkhQTuAkJgWEmiQ8LpErIKZL6ULp4TJiUrzQFTzu9vNzWcRkghddJBMUAIgyg6kA3S1IKVCA9S4lrDgYbWwINrDjBLCs0laACySeIC4REVawhDj6pIOH5YeiFhBRvCANQsko6xU3mccwIf2MaOzQEjsFpKMLWOZItB1bIc5D0Q1v+M+mkcC4Dvx7HR/z4mQROgyB0ZKUO6991567bXXxE3+RGzoyujQoUMFP5MRO5B58+bRr371KzHHHqRx48bRI488Queee27dNafEzuT73/8+PfPMM8JqWkmXXnopPfroo3TWWWdFWZ0GiLID6QBdLUip1ACZFhY8TGAnD8JikhaMP5AYK2nB50BWYHHBworcLEHcDGGIcfG5PV+pE3EEIoJ7CWvI6Sr5f7wHNC2T7hqkkodlxMxrg2cPK7qZYVUVMqDr2A5zHohyfndzf2dGSCJ0mQMjJSinxUCeKe7q+eefT0888YSrz/zsZz+jX/7yl/Tkk0/SwIED6d///d/pm9/8Jm3cuFFYRYVZVOD222+nV155hRYuXCj0hB1o7ty5NG3aNFq1apW48fGN7Cg7kA4odguS8jBIR1lD0nICpOVEfSgrBLemRgIWAbgp4CYCcTEf+B6MrULkJQwxLkhNWe3vXHCh1KDEYTI4c0bW3yAjVdIiAvcM6oR7ADKCEF/ogkBAoPsxCUnAeQcLFm6/KmSAx7a7+d3J0uQmQbSb+9s4AhKhm2UsUoICSwgAsuEGsJ7813/9F/3oRz+iGTNmGO/99re/pS5dugi2+TTdeuutdPjwYYPsPPXUU3TZZZcZ18yfP19sss6mt99+my6//PJoKkPxdCCdEOUOQ7eBpB1pQeiqFaZuwvoAcQGBgZYCVhgs4NaUoFi4YYExHo2l28l8HcQKg89CNEp75XONz+9CWdGRTPKBh/X/dXXJyARopbAmldUf8ogHXDUgIqZrLIb8I/bFKomxUOzWYbfzu90Sgu5Ru3QpeX+f18wyppQGZcuWLbRnzx6aMmVK3XtNxcQwceJEWrp0qUFQYCWpErsb6zXdhXl16NChxjVOBAUuITxMgOQAhw4hbDPNqBJz6wmxMxMCSgpfczBpklzXNm+WUbF4jeSoYeD114lefVX+f8MG+TtTpyZXV3UQcT1LxKxcDuuAeLTrIBdxw7UBq8IZaVWohpVBrJqnaoWg2Prj72dqyQAe5hHY9hzneA8PkBDrs/XvQOMMlZ+opMrde8T32b4H343XeOD/prulQV1qvx8rjUmaQM4M4lEuXVqwjBikClYi8VzWVP7fCnx9JepZP4eE3Z7Nmu0X1ZG/i3xs1nHkfSyoOLbTOT7Xr8/OpbhhQxWdOFG4nlHOnV7Ki9d+ftdcO2FUiBTiByLHb37zm0ybNm0KXvfBBx+gtpmdO3dmvX/zzTdnBCEx/r9gwYKM0LM0+KxwA2VuueUWx++9++67je/lB98D7gPcB7gPcB/gPkCh3IPNmzf7YATu4dmCcs8999S5bnJh5cqVNGbMGK9fXYcSmxNPlLPBe3bku+bOO++kOXPm1L2GWLdXr160fft24VIWPuWU4ogw0cP19ZUQLLaG3zzFKJa6cj3TBW7PdKFY2vOw8EL07NmT2uPohQjhmaDMnj1b+KzyO6169+7tqzBdEZYnADdPN6T+rsW+ffsMHYp5DcS3iPBpZxH/4ZoJht+6IeAmwsMOkJM0dyITqGMx1BMolrpyPdMFbs90oVjas1HEiQU9E5SOHTsajyjQp08fg4C89dZbNHLkSOM9kJH333+ffvrTnxqvR48eLdzGpcY1s2bNMt7bvXs3rVu3zogAYjAYDAaDoT8iFcnChXLgwAHjuVoI55APBegvVGAtkbhIYPDgwXT//ffT9OnTDRcNQojvu+8+GjBggPHA/5s3b07X43jhWqvHTTfdZIQWI8QYJibkRBk2bFhdVA+DwWAwGAy9ESlBueuuu4wwYROmVWTRokVCtSxkywLIbwJ/lokf/OAHRvK1f/7nf65L1Pbmm2/W5UABHnjgAWrSpIlhQTETtSGU2W0OFLh7hHDW0e2TJhRLPYFiqSvXM13g9kwXuD3DRQmUsuF+JYPBYDAYDEYw8OlUDAaDwWAwlAMTFAaDwWAwGMqBCQqDwWAwGAzlwASFwWAwGAyGckgtQbn33nuNxG0IUW6LY9BdAHphZMrF2T7l5eVGpNGnn36adQ3O9Pne975n5IJp0aIFXXXVVbRjx44oquAKiHS68cYbjfBrPPB/ZMrNB4RzOz1+/vOf112Dutv/XihBn2r1/M53vtOgDuPHj09Ve+Jcqn/7t38zwuxRfvTdv/u7v6Ndu3ZlXZd0ez766KNGnqNmzZoZuYyWLFmS93rkPsJ1uL5v3770v//7vw2uefHFF+mcc84xIifw/PLLL0dV/Ejq+dJLLxkntXfq1MlI6oVT3//0pz9lXYPoRKexehKHOWpSz/fee8+xDhtwsJDi7em1rk5zDh7nnnuusm26ePFi+qu/+itj7kA5fv/73xf8TGzjM9JE+gnirrvuyvzyl7/MzJkzx9U5QMB//Md/ZFq1apURNzazdu3azLXXXpvp1q1b5siRI3XX/OM//mOmR48embfeeivz0UcfZSZPnpwZMWJE5syZM1FVJS+uuOKKzNChQzNLly41Hvj/tGnT8n5m9+7dWY9f//rXGdExs85VmDhxonEGkvU6sVBGXZ1Q6/n3f//3xuesddi/f3/WNbq35yHRJpdddlnm2WefzYgJP/Phhx9mxo0blxGTR9Z1SbbnwoULM6WlpZnHH38889lnn2X+5V/+JSPIVGbbtm2O13/55ZcZsbEwrsP1+Bw+/8ILL9Rdg3vTuHHjzH333ZdZv3698dykSZPMsmXLYqlTGPXE33/6059mVqxYkfn8888zd955p/F59EPrOWaCvDQYs0nCaz0XLVpknNuycePGrDpYx5iK7emnrhhT1jp+9dVXmfbt2xvnwanapn/84x8zP/rRj4x1D+0kiETe6+Mcn6klKF4PKqypqcl07drVICkmBKM1PivYYV3nQ0Og05rAwYaNGjXKvPHGG+EXvgDQOdChrI2OBQrvYbFyi7/+67/OXHLJJQ0WNHRAFeC3niAoqFsupLU9seDhM9ZJNMn2HDt2rEEErRg8eHDmjjvucLz+Bz/4gfF3K2699daMsH7VvZ41a5ZB5qy4/PLLM8IqFFKpo6+nE8ROMzNv3jzP85fK9TQJirAO5vxOFdszjDbFYo/N39atW5VuUxNuCEqc4zO1Lh6v2LJli3EG0JQpU+reg2lKTOwk2KDxetWqVYZJ3XoNzGJil1t3TZwQi5fhBkAyOxNwYeA9t+XZu3cvvfbaa0Z2XjsWLFhguD5gnkS23qNHj4ZW9rjqCfNy586daeDAgSQsCMaZTSbS2J4AEh/CVGt3bSbRnjiqAvfZeo8BvM5VJ9wH+/VicqO//OUvRnvluyaJdvNbTzvEJsloE/sBbMeOHTMONz3rrLNIWNPo448/Dq3ccdYTiTpxxhoSayJZpxWqtWdYbfrEE08YGc7Rfqq2qVfEOT4jzSSrE0BOAPNQQhN4LXaiddeUlZVlHVJoXmN+Pk7gN7H42oH33JYHmX6RpXfGjBlZ799www11ZyPhnCOcCL169WrjDCRd6jl16lSaOXOmMRGAgP74xz8mYSkyJh2QzzS2J/zYYndnHA1hPawsqfb8+uuvjWMunMZVrjrhfafrhUvA+D4scrmuSaLd/NbTjl/84hd0/PjxujPGzKNAoFmAxggn5T744IN0wQUXGG2Ho0B0qCfa61e/+pWhWYDm66mnnjJICjYPF198sXGNau0ZRpvijLjXX3+dnn766az3VWtTr4hzfGpFUCBgFeYeU/SBAAAEyUlEQVTPvNesXLmSxowZ4/s3sPO0AlYv+3t2uLkminoCTr/rpTxCf2IsXhA7WQFrgwlYFDBwcF+Ff5xGjRrl6ruTrqfQEGXVAeUHWYHFyE7IvHyvqu2J3QuEr9iJQ9gXd3uGOa6crre/72esRg2/ZXrmmWeMfvKHP/whi6TCgmYVdmMhQ3s99NBD9N///d/hFTzCeg4aNMh4mIAYWGgz6D//8z/rCIrX74wTfssFEgIr5t/8zd9kva9qm3pBXONTK4Iye/bsgpEHvXv39vXd2FkCYHhggCbgEjCZIK6B2Q+RFtZdN65BxFDc9VyzZo3horGjoqKiAXt1AtToOAtJCCwLXosBhFOkN23aFNqCFlc9TaBdQVBQh7S1J8gJdt6wFL377rsFj3qPoj2dAJcSzsiy75ys48oOtIvT9Th/CweE5rvGS39Iup4mMP7gYn3++ecLHniK4+2/8Y1v1PVhneppBRbo+fPn171WrT2D1hWLMTZ/iMKDlVblNvWKWMenJ8VKEYhkoao3IcyRjiJZREyY2LVrV+KiyuXLl9e9B4GlW1ElRKT2aI9cQFQTvvf999/3Xd6k6mlCmB8zwrWTEW6tVLWnIFkZsUvLCG1JRkwCyrUnhIb/9E//lPXekCFD8opk8XcrIFS0i/CECy/rGojykhbJeqknIMz/GWG9LChMtM5TwvKV+e53vxuorHHX046rr77aiJhTuT2D1NUUBmOc6dCmJtyKZOMan6klKIhgEMIjQxHfsmVL4/94CBFa3TXC7Jh56aWX6l4jggeEBO+hY1133XWOYcZC2JR5++23jXBARL8kHZY6fPhwI9oDD+HXbBCWaq8nIISURqjY//zP/zT4zi+++MK4b8LtkBE78oxwiRiqbSFy06aeaOe5c+ca4W6oAyYMYVo2QorT1J7CcpK56qqrjDp88sknWWGLINgqtKcZqikEgwYJu/32241QTTOyAZO92Gk2CGP813/9V+N6fM4exvjBBx8YYYwYswhjxHPSYale6wlygjI/8sgjOcO/hdvHIMtIAYD5C4sYPmMlsarX84EHHjAWPYRSC/2T8XcshAhrVbk9/dTVxN/+7d8a4f5OUK1Nj4q50lwf0S5Iz4H/m1GASY7P1BIUWAdws+0PLFQm8BoWFiuTRbw6LCnYaQv/aAMGXFlZmREmeyO2vby83Fg8tm/fHlu97EBeD6EhMfK34IH/28P57PUEHnvsMaP8TrkwUB/UHXUU5slMv379MrfddluDHCIq1/PEiRMZoSLPdOrUyRg8PXv2NPqEva10b08QDqd+bu3rKrQnFmHhXjN+X7iUsiw3aBeEQVshBJQGgcL1wv3lSKSFS8Qga2hfEC7rgpcUvNQT/3dqN1xnAgsi+i6+D30ZfRqkW6d6wiqNPgdLkXClZi688EKDJOvQnn76LuZUzCVCGOz4faq16aJaa0+ufpjk+CzBP96cQgwGg8FgMBjRgvOgMBgMBoPBUA5MUBgMBoPBYCgHJigMBoPBYDCUAxMUBoPBYDAYyoEJCoPBYDAYDOXABIXBYDAYDIZyYILCYDAYDAZDOTBBYTAYDAaDoRyYoDAYDAaDwVAOTFAYDAaDwWAoByYoDAaDwWAwlAMTFAaDwWAwGMrh/wMrvO7GwlFJwAAAAABJRU5ErkJggg==",
-      "text/plain": [
-       "<Figure size 600x600 with 1 Axes>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
-   "source": [
-    "%matplotlib inline\n",
-    "import matplotlib.pyplot as plt\n",
-    "from math import sqrt\n",
-    "import numpy as np\n",
-    "\n",
-    "N = 1000\n",
-    "x = np.random.uniform(-1, 1, N)\n",
-    "y = np.random.uniform(-1, 1, N)\n",
-    "\n",
-    "c = plt.Circle((0, 0), 1, color='red', alpha=0.3)\n",
-    "r = plt.Rectangle((-1, -1), 2, 2, color='blue', alpha=0.3)\n",
-    "fig, ax = plt.subplots()\n",
-    "fig.set_size_inches(6, 6)\n",
-    "plt.xlim(-1,1)\n",
-    "plt.ylim(-1,1)\n",
-    "plt.grid(visible=True)\n",
-    "ax.annotate(\"\", xy=(sqrt(2)/2, sqrt(2)/2), xytext=(0.0, 0.0), arrowprops=dict(arrowstyle=\"->\"))\n",
-    "ax.add_patch(c)\n",
-    "ax.add_patch(r)\n",
-    "\n",
-    "for i in range(N):\n",
-    "    plt.scatter(x[i], y[i], s=5, color='red' if x[i]*x[i]+y[i]*y[i]<=1 else 'blue')\n",
-    "    \n",
-    "plt.show()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "id": "064512cf-189a-4002-a93a-9af00b4e7b9f",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "%matplotlib inline\n",
-    "import matplotlib.pyplot as plt\n",
-    "from IPython.display import clear_output\n",
-    "import numpy as np\n",
-    "from time import time"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "23a9a619-f1f8-483a-a0cf-9b6f1fde2481",
-   "metadata": {},
-   "source": [
-    "Monte Carlo $\\pi$ Estimation Using NumPy\n",
-    "----------------------------------------\n",
-    "The estimate is computed using NumPy vector operations on CPU. For implementation details please refer to the `monte_carlo_pi_batch()` function located in the file `/impl/impl_numpy.py`"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "id": "65c73a9a-8ed0-42b5-8d02-01c4c8242729",
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "image/png": "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\n",
-      "text/plain": [
-       "<Figure size 640x480 with 1 Axes>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
-   "source": [
-    "from mcpi_demo.impl.impl_numpy import monte_carlo_pi_batch\n",
-    "batch_size = 1024*10000\n",
-    "n_batches = 50\n",
-    "print(batch_size, n_batches)\n",
-    "\n",
-    "x = []\n",
-    "y = []\n",
-    "zl = []\n",
-    "zh = []\n",
-    "est = np.empty(n_batches)\n",
-    "for i in range(n_batches):\n",
-    "    clear_output(wait=True)\n",
-    "    \n",
-    "    t1 = time()\n",
-    "    est[i] = monte_carlo_pi_batch(batch_size)\n",
-    "    t2 = time()\n",
-    "    \n",
-    "    avg = est[:i].mean()\n",
-    "    std = est[:i].std()\n",
-    "    \n",
-    "    x.append(i)\n",
-    "    y.append(avg)\n",
-    "    zl.append(avg-std)\n",
-    "    zh.append(avg+std)\n",
-    "    \n",
-    "    plt.xlim([1, n_batches])\n",
-    "    plt.ylim([3.1405, 3.1425])\n",
-    "   \n",
-    "    plt.plot(x, y, '-r', color='red')\n",
-    "    plt.fill_between(x, zl, zh, color='orange', alpha=0.3)\n",
-    "    plt.text(5, 3.1423, f\"{batch_size/(t2-t1)/1e6:.0f} Msamples/sec\")\n",
-    "    plt.title(r\"Monte Carlo $\\pi$ estimation using numpy\")\n",
-    "    plt.show()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "20da6210-ed32-4137-bc08-de7dced17ac2",
-   "metadata": {},
-   "source": [
-    "Monte Carlo $\\pi$ Estimation Using Data Parallel Extension for NumPy\n",
-    "--------------------------------------------------------------------\n",
-    "Having the above NumPy example it is straightforward to run the same implementation on GPU by substituting `import numpy as np` with `import dpnp as np`. The `dpnp.random.random` will generate random points on the default device, which is GPU:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "id": "7d8b8ae2-8070-42fc-98ca-1ae7a74445d1",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Device(level_zero:gpu:0)\n"
-     ]
-    }
-   ],
-   "source": [
-    "import dpnp as np\n",
-    "x = np.random.random(10)\n",
-    "print(x.device)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "0c06642a-82c9-425a-ab80-4a101a7652a8",
-   "metadata": {},
-   "source": [
-    "For details please refer to the implementation of `monte_carlo_pi_batch()` located in the file `/impl/impl_dpnp.py`"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "id": "c7b5eb1d-25b8-491e-b6bf-232be0113b4e",
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "image/png": "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584S89955x1p2rRp8A8mQli9erUcOnRILrroosreFUIIISGEAiqKqVu3rjRo0MAxffHFF9KyZUu58MIL9esZGRlaVA0aNEjatGkj5557rrz++uuyYsUK2b59u9dt16tXTy699FJ59913HfOWLFkiBw8elH79+pVYdv78+XL22WfrKFeNGjXkvPPOk23btunXNm/eLAMGDJD69etLamqqnHXWWfLNN9+UiqQ988wzOjqGZZo1ayafffaZHDhwQK+LeYiiLV++3LHO1KlT9XvNnj1bTjvtNElKSpI+ffrIjh07vB4XBODpp5+ul2/btq28+eabjtfy8vLknnvu0eIRr2O/nn/++RLrY78uu+wySUxM1MfYv39/qVmzpj729u3by1dffeVYdv369XLFFVfo/cfxDxs2TJ8/i6KiInnhhRekVatWensQps8++6zX/SeEEFIxUEBVEXDxf//99+VPf/qTTrF54ujRo/p1iI+ywLYgVCzefvttGTJkiCQkJDjmFRQUyNVXX61FG6IzP/74o/zlL39x7EN2drYWERBNv/zyixYfEB2uAu6VV17RwgvLQKBBbEBQDR06VEfPIDLw3GazOdZBhA2CAyJv8eLFcuzYMbnxxhs9Hs/kyZNlzJgxep1ff/1VnnvuOR2ds0Tia6+9Jp9//rl8/PHHsmHDBn0+IaKcwesQdQCp0tzcXFm4cKGsWbNGiyGIJYCIIM4JPFgQfkj57du3T4tZi0cffVSvg32A2Jo+fboWWoQQQsIAdcEhfqAEBq7Q+m8k8dFHH9ni4uJsu3bt8rhMTk6O7cwzz7QpEeR1W0888YStc+fONiXKbCoSZVuwYIFNCSFbWlqabdWqVbb777/fpsSBXlals/T5UlEon/e1Xbt2NhUJczxXESebEkqO50p86G0qYeGYp4SZnofXgIok6edLly51LKNEkZ73008/lTgOiyZNmtiUSCmxL08//bSte/fu+vG9995r6927t01Fhtzut0pn2qpVq6aPGaiomE35xdwui31XEbwS81R0TO+fEmc2JfZsKupkU6LOw1kihBBSmdfv+MqTbqQimTJlivTt21cbxd0BQzmiM0gbOaetvKHEgo4AIe31xx9/6FRZp06dSixTq1YtueWWW3RkCSm0Sy65REdZkAYDx48fl6eeekqnF2FeR8RKCblSESjn7VpRGKTtXOft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\n",
-      "text/plain": [
-       "<Figure size 640x480 with 1 Axes>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
-   "source": [
-    "from mcpi_demo.impl.impl_dpnp import monte_carlo_pi_batch\n",
-    "import numpy as np\n",
-    "batch_size = 1024*10000\n",
-    "n_batches = 50\n",
-    "print(batch_size, n_batches)\n",
-    "\n",
-    "x = []\n",
-    "y = []\n",
-    "zl = []\n",
-    "zh = []\n",
-    "est = np.empty(n_batches)\n",
-    "for i in range(n_batches):\n",
-    "    clear_output(wait=True)\n",
-    "    \n",
-    "    t1 = time()\n",
-    "    est[i] = monte_carlo_pi_batch(batch_size)\n",
-    "    t2 = time()\n",
-    "    \n",
-    "    avg = est[:i].mean()\n",
-    "    std = est[:i].std()\n",
-    "    \n",
-    "    x.append(i)\n",
-    "    y.append(avg)\n",
-    "    zl.append(avg-std)\n",
-    "    zh.append(avg+std)\n",
-    "    \n",
-    "    plt.xlim([1, n_batches])\n",
-    "    plt.ylim([3.1405, 3.1425])\n",
-    "   \n",
-    "    plt.plot(x, y, '-r', color='red')\n",
-    "    plt.fill_between(x, zl, zh, color='orange', alpha=0.3)\n",
-    "    plt.text(5, 3.1423, f\"{batch_size/(t2-t1)/1e6:.0f} Msamples/sec\")\n",
-    "    plt.title(r\"Monte Carlo $\\pi$ estimation using dpnp\")\n",
-    "    plt.show()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "60698e01-f90d-4816-9e63-b3045652cdbf",
-   "metadata": {},
-   "source": [
-    "Monte Carlo $\\pi$ Estimation Using Numba\n",
-    "----------------------------------------\n",
-    "Numba is the Just-In-Time (JIT) compiler for Python functions. Using the `@njit(parallel=True)` function decorator you can trigger the compilation of that function into native code with automatic parallelization, which would allow using all CPU cores. For implementation details please refer to For details please refer to the file `/impl/impl_numba.py`"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 9,
-   "id": "6590364f-069b-471a-85a3-001645285e04",
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "image/png": "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tZKLLrpI3n//fdm9e7esXr3asUzt2rVdptmzZ0vPnj3l/PPP14/Hx8cXWmbmzJly6623SkpKitvX79ChgxZKX375pWMe7kM8tG/f3mXZf//739KmTRspV66cVKtWTa688kqH0Fu5cqX06dNHqlevLqmpqdK9e3dZs2aNy/Mh+iZNmiTXX3+9ju5ceOGF8uOPP8q2bdukR48eWvB16dJFtm/f7njOc889J+3atdPPwzbhebfccoucPHmy2Pdks9nklVde0fsH24r9im23OHHihAwZMkRq1KihH2/WrJne785gH99www36/rp16/T+RpSwUqVK0rFjR1m1apVj2eXLl8sVV1yh14VtfPjhh10EcHZ2tvzlL3/RjyUlJenXmzJlitvPhRBCSOmhgIohTp06pW+rVq1a5OOHDh2Sb7/9VkaMGFHsOiC+1q5d63YZZ+666y4XAYEI1x/+8AeXZRDVuv322/X8X375RRYuXCg33XSTFisgLS1Nhg8fLkuWLNHRNIiEa6+9Vs935q9//avccccdevsQ3Rk8eLDce++9MmbMGIcoefDBB12eA4H1+eefy9dff60FJ56LqF1xPPXUU/r9vPPOO7Jp0yZ55JFHZOjQoTraB55++mnZvHmzfP/99/q9YDkIP4u8vDz55ptvpH///vp/iK169eppkYh9+/jjj0tCQoJ+bMOGDXL11VfrfbF+/Xr57LPPZOnSpS7vAe8XUb433nhDv94///nPEoUtIYQQP6BOUsQLlAjBWV3fRhLqxG3r16+f7bLLLit2mZdfftlWpUoVm0q5FbvMn/70J5uK7pT4ekrw2JRIsB05csSmIiO2HTt22JSfypacnKzn4TEsA5Rw0PsUj3uCSkXaVMTGpkSPYx6er8SN438VfdLzVDTGMU+lDvXrWzz77LM2FWGz7dmzxzFPCR9bXFycTYk6l/cB0tPT9fNVVMhle5SYtCkBqO9jHyvRWOy2L1u2zKYElS03N1f/j/cxderUIpcdNmyY7Z577nGZp0Sk3j58RsrPpt+jSgkW+3qEEEICc/4u6wcNRiIARC0QxUAEozgQHUJERImEIh+Hl2natGk6yuIpiL5cd9118sEHH+iIEu47R2QA0mC9e/fWKTxEXODTuvnmm0WJOf344cOH5ZlnnpH58+frKJkSH3LmzBmdjnSmbdu2jvu1atXSt1in8zx4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\n",
-      "text/plain": [
-       "<Figure size 640x480 with 1 Axes>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
-   "source": [
-    "from mcpi_demo.impl.impl_numba import monte_carlo_pi_batch\n",
-    "batch_size = 1024*10000\n",
-    "n_batches = 50\n",
-    "print(batch_size, n_batches)\n",
-    "\n",
-    "x = []\n",
-    "y = []\n",
-    "zl = []\n",
-    "zh = []\n",
-    "est = np.empty(n_batches)\n",
-    "for i in range(n_batches):\n",
-    "    clear_output(wait=True)\n",
-    "    \n",
-    "    t1 = time()\n",
-    "    est[i] = monte_carlo_pi_batch(batch_size)\n",
-    "    t2 = time()\n",
-    "    \n",
-    "    avg = est[:i].mean()\n",
-    "    std = est[:i].std()\n",
-    "    \n",
-    "    x.append(i)\n",
-    "    y.append(avg)\n",
-    "    zl.append(avg-std)\n",
-    "    zh.append(avg+std)\n",
-    "    \n",
-    "    plt.xlim([1, n_batches])\n",
-    "    plt.ylim([3.1405, 3.1425])\n",
-    "   \n",
-    "    plt.plot(x, y, '-r', color='red')\n",
-    "    plt.fill_between(x, zl, zh, color='orange', alpha=0.3)\n",
-    "    plt.text(5, 3.1423, f\"{batch_size/(t2-t1)/1e6:.0f} Msamples/sec\")\n",
-    "    plt.title(r\"Monte Carlo $\\pi$ estimation using numba\")\n",
-    "    plt.show()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "7e6c72f2-e759-4409-a102-c0fc1f7feaca",
-   "metadata": {},
-   "source": [
-    "Can Numba compile the code for GPU? The answer is yes, if you use Data Parallel Extension for Numba, or `numba-dpex`. Using its `@dpjit` decorator you can trigger code compilation to a specific device. The device is selected based on where data is allocated. Since we generate random points using `dpnp.random.random` by default it allocates these points on GPU, hence respective `@dpjit` code will trigger compilation for GPU too.\n",
-    "\n",
-    "For details please refer to the implementation of `monte_carlo_pi_batch()` located in the file `/impl/impl_numba_dpex.py`"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 104,
-   "id": "b088f776-274e-4eee-b003-2fa04dc4f8bd",
-   "metadata": {},
-   "outputs": [
-    {
-     "ename": "TypingError",
-     "evalue": "Failed in dpex_dpjit_nopython mode pipeline (step: nopython frontend)\n\u001b[1m\u001b[1mUnknown attribute 'random' of type Module(<module 'dpnp.random' from 'C:\\\\Users\\\\smaidano\\\\AppData\\\\Local\\\\Continuum\\\\miniconda3\\\\envs\\\\ndpex-examples\\\\lib\\\\site-packages\\\\dpnp\\\\random\\\\__init__.py'>)\n\u001b[1m\nFile \"mcpi_demo\\impl\\impl_numba_dpex.py\", line 7:\u001b[0m\n\u001b[1mdef monte_carlo_pi_batch(batch_size):\n\u001b[1m    x = np.random.random(batch_size)\n\u001b[0m    \u001b[1m^\u001b[0m\u001b[0m\n\u001b[0m\n\u001b[0m\u001b[1mDuring: typing of get attribute at C:\\Users\\smaidano\\projects\\mcpi\\mcpi_demo\\impl\\impl_numba_dpex.py (7)\u001b[0m\n\u001b[1m\nFile \"mcpi_demo\\impl\\impl_numba_dpex.py\", line 7:\u001b[0m\n\u001b[1mdef monte_carlo_pi_batch(batch_size):\n\u001b[1m    x = np.random.random(batch_size)\n\u001b[0m    \u001b[1m^\u001b[0m\u001b[0m\n",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[1;31mTypingError\u001b[0m                               Traceback (most recent call last)",
-      "Cell \u001b[1;32mIn[104], line 15\u001b[0m\n\u001b[0;32m     12\u001b[0m clear_output(wait\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m     14\u001b[0m t1 \u001b[38;5;241m=\u001b[39m time()\n\u001b[1;32m---> 15\u001b[0m est[i] \u001b[38;5;241m=\u001b[39m \u001b[43mmonte_carlo_pi_batch\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     16\u001b[0m t2 \u001b[38;5;241m=\u001b[39m time()\n\u001b[0;32m     18\u001b[0m avg \u001b[38;5;241m=\u001b[39m est[:i]\u001b[38;5;241m.\u001b[39mmean()\n",
-      "File \u001b[1;32m~\\AppData\\Local\\Continuum\\miniconda3\\envs\\ndpex-examples\\lib\\site-packages\\numba\\core\\dispatcher.py:468\u001b[0m, in \u001b[0;36m_DispatcherBase._compile_for_args\u001b[1;34m(self, *args, **kws)\u001b[0m\n\u001b[0;32m    464\u001b[0m         msg \u001b[38;5;241m=\u001b[39m (\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mstr\u001b[39m(e)\u001b[38;5;241m.\u001b[39mrstrip()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mThis error may have been caused \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m    465\u001b[0m                \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mby the following argument(s):\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00margs_str\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m    466\u001b[0m         e\u001b[38;5;241m.\u001b[39mpatch_message(msg)\n\u001b[1;32m--> 468\u001b[0m     \u001b[43merror_rewrite\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtyping\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m    469\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m errors\u001b[38;5;241m.\u001b[39mUnsupportedError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m    470\u001b[0m     \u001b[38;5;66;03m# Something unsupported is present in the user code, add help info\u001b[39;00m\n\u001b[0;32m    471\u001b[0m     error_rewrite(e, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124munsupported_error\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
-      "File \u001b[1;32m~\\AppData\\Local\\Continuum\\miniconda3\\envs\\ndpex-examples\\lib\\site-packages\\numba\\core\\dispatcher.py:409\u001b[0m, in \u001b[0;36m_DispatcherBase._compile_for_args.<locals>.error_rewrite\u001b[1;34m(e, issue_type)\u001b[0m\n\u001b[0;32m    407\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[0;32m    408\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 409\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(\u001b[38;5;28;01mNone\u001b[39;00m)\n",
-      "\u001b[1;31mTypingError\u001b[0m: Failed in dpex_dpjit_nopython mode pipeline (step: nopython frontend)\n\u001b[1m\u001b[1mUnknown attribute 'random' of type Module(<module 'dpnp.random' from 'C:\\\\Users\\\\smaidano\\\\AppData\\\\Local\\\\Continuum\\\\miniconda3\\\\envs\\\\ndpex-examples\\\\lib\\\\site-packages\\\\dpnp\\\\random\\\\__init__.py'>)\n\u001b[1m\nFile \"mcpi_demo\\impl\\impl_numba_dpex.py\", line 7:\u001b[0m\n\u001b[1mdef monte_carlo_pi_batch(batch_size):\n\u001b[1m    x = np.random.random(batch_size)\n\u001b[0m    \u001b[1m^\u001b[0m\u001b[0m\n\u001b[0m\n\u001b[0m\u001b[1mDuring: typing of get attribute at C:\\Users\\smaidano\\projects\\mcpi\\mcpi_demo\\impl\\impl_numba_dpex.py (7)\u001b[0m\n\u001b[1m\nFile \"mcpi_demo\\impl\\impl_numba_dpex.py\", line 7:\u001b[0m\n\u001b[1mdef monte_carlo_pi_batch(batch_size):\n\u001b[1m    x = np.random.random(batch_size)\n\u001b[0m    \u001b[1m^\u001b[0m\u001b[0m\n"
-     ]
-    }
-   ],
-   "source": [
-    "from mcpi_demo.impl.impl_numba_dpex import monte_carlo_pi_batch\n",
-    "batch_size = 1024*10000\n",
-    "n_batches = 50\n",
-    "print(batch_size, n_batches)\n",
-    "\n",
-    "x = []\n",
-    "y = []\n",
-    "zl = []\n",
-    "zh = []\n",
-    "est = np.empty(n_batches)\n",
-    "for i in range(n_batches):\n",
-    "    clear_output(wait=True)\n",
-    "    \n",
-    "    t1 = time()\n",
-    "    est[i] = monte_carlo_pi_batch(batch_size)\n",
-    "    t2 = time()\n",
-    "    \n",
-    "    avg = est[:i].mean()\n",
-    "    std = est[:i].std()\n",
-    "    \n",
-    "    x.append(i)\n",
-    "    y.append(avg)\n",
-    "    zl.append(avg-std)\n",
-    "    zh.append(avg+std)\n",
-    "    \n",
-    "    plt.xlim([1, n_batches])\n",
-    "    plt.ylim([3.1405, 3.1425])\n",
-    "   \n",
-    "    plt.plot(x, y, '-r', color='red')\n",
-    "    plt.fill_between(x, zl, zh, color='orange', alpha=0.3)\n",
-    "    plt.text(5, 3.1423, f\"{batch_size/(t2-t1)/1e6:.0f} Msamples/sec\")\n",
-    "    plt.title(r\"Monte Carlo $\\pi$ estimation using numba\")\n",
-    "    plt.show()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "5935d8b5-9a1c-4498-b689-3ae3ed4d47ac",
-   "metadata": {},
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.9.7"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/demos/mcpi/.pre-commit-config.yaml b/demos/mcpi/.pre-commit-config.yaml
deleted file mode 100644
index 8a4eb1e..0000000
--- a/demos/mcpi/.pre-commit-config.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# See https://pre-commit.com for more information
-# See https://pre-commit.com/hooks.html for more hooks
-repos:
--   repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.3.0
-    hooks:
-    -   id: end-of-file-fixer
-    -   id: trailing-whitespace
--   repo: https://github.com/psf/black
-    rev: 23.1.0
-    hooks:
-    -   id: black
--   repo: https://github.com/pycqa/isort
-    rev: 5.12.0
-    hooks:
-    -   id: isort
-        name: isort (python)
-        args: ["--profile", "black", "--filter-files", "-sl"]
--   repo: https://github.com/pycqa/flake8
-    rev: 3.9.2
-    hooks:
-    -   id: flake8
diff --git a/demos/mcpi/README.md b/demos/mcpi/README.md
deleted file mode 100644
index e31d55f..0000000
--- a/demos/mcpi/README.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# MCPI - Monte Carlo estimation of Pi using numpy, numba, dpnp, numba-dpex
-
-This is a "Hello, World" application in Monte Carlo methods. It stresses random number generation
-along with some other math required for implementation of the Acceptance-Rejection technique.
-
-![Monte Carlo Pi image](https://github.com/IntelPython/DPEP/blob/main/demos/mcpi/draw_points.png)
-
-For details please refer to [Wikipedia](https://en.wikipedia.org/wiki/Monte_Carlo_method)
-
-## How to run
-
-`python -m mcpi_demo [options]`
-
-Demo can be invoked in several ways:
-
-1. Cloning Github repo and running `python mcpi.py [options]`
-2. Cloning Github repo and running `python -m mcpi_demo [options]`
-3. Installing conda package and invoking executable
-   * `conda install -c pycoddiy/label/dev mcpi-demo`
-   * `mcpi [options]`
-
-### Options
-
-The following options are allowed:
-* `--variant [numpy, numba, dpnp, numba-dpex]` (default `numpy`): Implementation variant
-* `--batch-size`: Number of trial points in the batch
-* `--n-batches`:  Number of batches
-
-## Jupyter Notebook
-The Monte Carlo Pi demo is also supplemented with the [Jupyter Notebook](https://github.com/IntelPython/DPEP/blob/main/demos/mcpi/mcpi.ipynb),
-where step by step we illustrate the idea of the algorithm.
-
-![Pi animation](https://github.com/IntelPython/DPEP/blob/main/demos/mcpi/pi-animation.gif)
diff --git a/demos/mcpi/conda-recipe/conda_build_config.yaml b/demos/mcpi/conda-recipe/conda_build_config.yaml
deleted file mode 100644
index 801d7cf..0000000
--- a/demos/mcpi/conda-recipe/conda_build_config.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-python:
-  - 3.8
-  - 3.9
-  - 3.10
-numpy:
-  - 1.23
diff --git a/demos/mcpi/conda-recipe/meta.yaml b/demos/mcpi/conda-recipe/meta.yaml
deleted file mode 100644
index 7479ea2..0000000
--- a/demos/mcpi/conda-recipe/meta.yaml
+++ /dev/null
@@ -1,50 +0,0 @@
-package:
-  name: mcpi-demo
-  version: {{ GIT_DESCRIBE_TAG }}
-
-source:
-  path: ../../..
-
-build:
-  entry_points:
-    - mcpi = mcpi_demo.pi:main
-  number: {{ GIT_DESCRIBE_NUMBER }}
-  script: {{ PYTHON }} -m pip install ./demos/mcpi --no-deps --ignore-installed --no-cache-dir -vvv
-
-requirements:
-  host:
-    - python
-  run:
-    - python
-    - matplotlib >=3.7.1
-    - numpy >=1.21
-    - numba >=0.55
-    - dpnp
-    - numba-dpex
-
-test:
-  requires:
-    - pytest
-  commands:
-    - mcpi --help
-    - python -m mcpi_demo --variant numba
-    - mcpi --batch-size 10 --n-batches 1
-  imports:
-    - mcpi_demo
-    - mcpi_demo.impl.impl_versioner
-    - mcpi_demo.impl.arg_parser
-
-about:
-  home: https://intelpython.github.io/DPEP/main/
-  license: BSD-2-Clause
-  license_family: BSD
-  license_file:
-    - LICENSE
-  summary: Monte Carlo demo to compute Pi using numpy, numba, dpnp, and numba-dpex
-  description: |
-    This is a Hello, World application in Monte Carlo methods. It stresses random number generation along
-    with some other math required for implementation of the Acceptance-Rejection technique.
-
-extra:
-  recipe-maintainers:
-    - samaid
diff --git a/demos/mcpi/draw_points.png b/demos/mcpi/draw_points.png
deleted file mode 100644
index 68102d3..0000000
Binary files a/demos/mcpi/draw_points.png and /dev/null differ
diff --git a/demos/mcpi/mcpi.ipynb b/demos/mcpi/mcpi.ipynb
deleted file mode 100644
index 50f76bf..0000000
--- a/demos/mcpi/mcpi.ipynb
+++ /dev/null
@@ -1,378 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "id": "9b84948c-bb52-4eb4-a33c-27592513be8c",
-   "metadata": {},
-   "source": [
-    "Monte Carlo $\\pi$ Estimation\n",
-    "============================\n",
-    "Monte Carlo methods are closely connected to the problem of numerical integration. Specifically, this particular method relies on the fact that the area of the unit circle is equal to $\\pi$. If the circle is inscribed in the square of size 2 then the ratio between areas of two figures will be $4/\\pi$. Now if we draw points $(x, y)$ randomly within the square and calculate the proportion of those in the square to those in the circle the proportion will be approximately $4/\\pi$. Large sample size is more accurate the estimate.\n",
-    "\n",
-    "Using this method we will generate random points in batches of size `batch_size` and compute the $\\pi$ estimate for each batch as described above. The total number of batches is `n_batches`. With each new estimate we will progressively show how the overall estimate converges to the true value of $\\pi$. We will also display an interval $(-stdev, +stdev)$, which is the measure of accuracy of the estimate"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "id": "6ae615da-c4d4-43dd-b30d-402b8f5972c5",
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "image/png": "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",
-      "text/plain": [
-       "<Figure size 600x600 with 1 Axes>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
-   "source": [
-    "%matplotlib inline\n",
-    "import matplotlib.pyplot as plt\n",
-    "from math import sqrt\n",
-    "import numpy as np\n",
-    "\n",
-    "N = 1000\n",
-    "x = np.random.uniform(-1, 1, N)\n",
-    "y = np.random.uniform(-1, 1, N)\n",
-    "\n",
-    "c = plt.Circle((0, 0), 1, color='red', alpha=0.3)\n",
-    "r = plt.Rectangle((-1, -1), 2, 2, color='blue', alpha=0.3)\n",
-    "fig, ax = plt.subplots()\n",
-    "fig.set_size_inches(6, 6)\n",
-    "plt.xlim(-1,1)\n",
-    "plt.ylim(-1,1)\n",
-    "plt.grid(visible=True)\n",
-    "ax.annotate(\"\", xy=(sqrt(2)/2, sqrt(2)/2), xytext=(0.0, 0.0), arrowprops=dict(arrowstyle=\"->\"))\n",
-    "ax.add_patch(c)\n",
-    "ax.add_patch(r)\n",
-    "\n",
-    "for i in range(N):\n",
-    "    plt.scatter(x[i], y[i], s=5, color='red' if x[i]*x[i]+y[i]*y[i]<=1 else 'blue')\n",
-    "    \n",
-    "plt.show()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "id": "064512cf-189a-4002-a93a-9af00b4e7b9f",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "%matplotlib inline\n",
-    "import matplotlib.pyplot as plt\n",
-    "from IPython.display import clear_output\n",
-    "import numpy as np\n",
-    "from time import time"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "23a9a619-f1f8-483a-a0cf-9b6f1fde2481",
-   "metadata": {},
-   "source": [
-    "Monte Carlo $\\pi$ Estimation Using NumPy\n",
-    "----------------------------------------\n",
-    "The estimate is computed using NumPy vector operations on CPU. For implementation details please refer to the `monte_carlo_pi_batch()` function located in the file `/impl/impl_numpy.py`"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "id": "65c73a9a-8ed0-42b5-8d02-01c4c8242729",
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAGzCAYAAADg2in0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOydCXgUVfbFbxKyACFh32RfBAVZFBdQlEVUUARFcQFEBx111BkUHQWcURwV1HEQZVTkjyIqA+MgiwuMKLKI4gDKrgjIGiDsWSAJWfr/zntdne6kO+k16U7O7/sq3amurq6qrq536t7z7ouyKYQQQgghhHhNtNdLEkIIIYQQCihCCCGEEH9gBIoQQgghhAKKEEIIISS0MAJFCCGEEEIBRQghhBASWhiBIoQQQgihgCKEEEIICS2MQBFCCCGEUEARQgghhIQWRqAIIYQQQiigSKQzc+ZMiYqK0tPy5cuLvY7hG9u0aaNf79WrV0i35bvvvpNnn31WTp06FZL1b9q0Se655x5p2bKlJCQkSGJiolx44YXy8ssvy4kTJ4J+TPfs2RO0dYYLnr6j8tznks6bivJdVJT9IMRfGIEiYUuNGjVkxowZxeavWLFCdu3apV8vi4ZwwoQJIRFQ06dPl4suukjWrl0rTzzxhCxZskTmz58vt956q7z99tsyatSooH9mRcTTd3T99dfL999/L40aNQqbbSrv7QomFWU/CPGXKv6+kZBQc9ttt8lHH30k//znPyUpKckxH6Kqe/fukp6eHrFfAhqeBx98UPr16ycLFiyQ+Ph4x2uYN2bMGC2ogsGZM2eCsp5Io169enoKN8J1u3ylouwHIf7CCBQJW+644w79+K9//csxLy0tTebNmye/+93v3L7n22+/lb59++roVLVq1aRHjx7y+eefuyyD1ApSD1u3btWfkZycLA0aNNDrxPqdl0NkCCDFVjStuGPHDrnzzjulfv36WgCdd955Wux5w4svvqjX9c4777iIJ4u4uDi58cYb9fOdO3fqNF/btm31Pp1zzjkycOBA2bx5c7H3Wfv2448/yi233CK1atWS1q1be9wOb46XJ37/+987jomnaffu3R7f783xO3r0qP6cpk2b6mXQYF9++eXy1VdflfoduUsxWccHqVNE+vDd165dWx577DHJy8uT7du3y3XX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",
-      "text/plain": [
-       "<Figure size 640x480 with 1 Axes>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
-   "source": [
-    "from mcpi_demo.impl.impl_numpy import monte_carlo_pi_batch\n",
-    "batch_size = 1024*10000\n",
-    "n_batches = 50\n",
-    "print(batch_size, n_batches)\n",
-    "\n",
-    "x = []\n",
-    "y = []\n",
-    "zl = []\n",
-    "zh = []\n",
-    "est = np.empty(n_batches)\n",
-    "for i in range(n_batches):\n",
-    "    clear_output(wait=True)\n",
-    "    \n",
-    "    t1 = time()\n",
-    "    est[i] = monte_carlo_pi_batch(batch_size)\n",
-    "    t2 = time()\n",
-    "    \n",
-    "    avg = est[:i].mean()\n",
-    "    std = est[:i].std()\n",
-    "    \n",
-    "    x.append(i)\n",
-    "    y.append(avg)\n",
-    "    zl.append(avg-std)\n",
-    "    zh.append(avg+std)\n",
-    "    \n",
-    "    plt.xlim([1, n_batches])\n",
-    "    plt.ylim([3.1405, 3.1425])\n",
-    "   \n",
-    "    plt.plot(x, y, '-r', color='red')\n",
-    "    plt.fill_between(x, zl, zh, color='orange', alpha=0.3)\n",
-    "    plt.text(5, 3.1423, f\"{batch_size/(t2-t1)/1e6:.0f} Msamples/sec\")\n",
-    "    plt.title(r\"Monte Carlo $\\pi$ estimation using numpy\")\n",
-    "    plt.show()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "20da6210-ed32-4137-bc08-de7dced17ac2",
-   "metadata": {},
-   "source": [
-    "Monte Carlo $\\pi$ Estimation Using Data Parallel Extension for NumPy\n",
-    "--------------------------------------------------------------------\n",
-    "Having the above NumPy example it is straightforward to run the same implementation on GPU by substituting `import numpy as np` with `import dpnp as np`. The `dpnp.random.random` will generate random points on the default device, which is GPU:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "id": "7d8b8ae2-8070-42fc-98ca-1ae7a74445d1",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Device(level_zero:gpu:0)\n"
-     ]
-    }
-   ],
-   "source": [
-    "import dpnp as np\n",
-    "x = np.random.random(10)\n",
-    "print(x.device)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "0c06642a-82c9-425a-ab80-4a101a7652a8",
-   "metadata": {},
-   "source": [
-    "For details please refer to the implementation of `monte_carlo_pi_batch()` located in the file `/impl/impl_dpnp.py`"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "c7b5eb1d-25b8-491e-b6bf-232be0113b4e",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from mcpi_demo.impl.impl_dpnp import monte_carlo_pi_batch\n",
-    "import numpy as np\n",
-    "batch_size = 1024*10000\n",
-    "n_batches = 50\n",
-    "print(batch_size, n_batches)\n",
-    "\n",
-    "x = []\n",
-    "y = []\n",
-    "zl = []\n",
-    "zh = []\n",
-    "est = np.empty(n_batches)\n",
-    "for i in range(n_batches):\n",
-    "    clear_output(wait=True)\n",
-    "    \n",
-    "    t1 = time()\n",
-    "    est[i] = monte_carlo_pi_batch(batch_size)\n",
-    "    t2 = time()\n",
-    "    \n",
-    "    avg = est[:i].mean()\n",
-    "    std = est[:i].std()\n",
-    "    \n",
-    "    x.append(i)\n",
-    "    y.append(avg)\n",
-    "    zl.append(avg-std)\n",
-    "    zh.append(avg+std)\n",
-    "    \n",
-    "    plt.xlim([1, n_batches])\n",
-    "    plt.ylim([3.1405, 3.1425])\n",
-    "   \n",
-    "    plt.plot(x, y, '-r', color='red')\n",
-    "    plt.fill_between(x, zl, zh, color='orange', alpha=0.3)\n",
-    "    plt.text(5, 3.1423, f\"{batch_size/(t2-t1)/1e6:.0f} Msamples/sec\")\n",
-    "    plt.title(r\"Monte Carlo $\\pi$ estimation using dpnp\")\n",
-    "    plt.show()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "60698e01-f90d-4816-9e63-b3045652cdbf",
-   "metadata": {},
-   "source": [
-    "Monte Carlo $\\pi$ Estimation Using Numba\n",
-    "----------------------------------------\n",
-    "Numba is the Just-In-Time (JIT) compiler for Python functions. Using the `@njit(parallel=True)` function decorator you can trigger the compilation of that function into native code with automatic parallelization, which would allow using all CPU cores. For implementation details please refer to For details please refer to the file `/impl/impl_numba.py`"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "6590364f-069b-471a-85a3-001645285e04",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from mcpi_demo.impl.impl_numba import monte_carlo_pi_batch\n",
-    "batch_size = 1024*10000\n",
-    "n_batches = 50\n",
-    "print(batch_size, n_batches)\n",
-    "\n",
-    "x = []\n",
-    "y = []\n",
-    "zl = []\n",
-    "zh = []\n",
-    "est = np.empty(n_batches)\n",
-    "for i in range(n_batches):\n",
-    "    clear_output(wait=True)\n",
-    "    \n",
-    "    t1 = time()\n",
-    "    est[i] = monte_carlo_pi_batch(batch_size)\n",
-    "    t2 = time()\n",
-    "    \n",
-    "    avg = est[:i].mean()\n",
-    "    std = est[:i].std()\n",
-    "    \n",
-    "    x.append(i)\n",
-    "    y.append(avg)\n",
-    "    zl.append(avg-std)\n",
-    "    zh.append(avg+std)\n",
-    "    \n",
-    "    plt.xlim([1, n_batches])\n",
-    "    plt.ylim([3.1405, 3.1425])\n",
-    "   \n",
-    "    plt.plot(x, y, '-r', color='red')\n",
-    "    plt.fill_between(x, zl, zh, color='orange', alpha=0.3)\n",
-    "    plt.text(5, 3.1423, f\"{batch_size/(t2-t1)/1e6:.0f} Msamples/sec\")\n",
-    "    plt.title(r\"Monte Carlo $\\pi$ estimation using numba\")\n",
-    "    plt.show()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "7e6c72f2-e759-4409-a102-c0fc1f7feaca",
-   "metadata": {},
-   "source": [
-    "Can Numba compile the code for GPU? The answer is yes, if you use Data Parallel Extension for Numba, or `numba-dpex`. Using its `@dpjit` decorator you can trigger code compilation to a specific device. The device is selected based on where data is allocated. Since we generate random points using `dpnp.random.random` by default it allocates these points on GPU, hence respective `@dpjit` code will trigger compilation for GPU too.\n",
-    "\n",
-    "For details please refer to the implementation of `monte_carlo_pi_batch()` located in the file `/impl/impl_numba_dpex.py`"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "id": "b088f776-274e-4eee-b003-2fa04dc4f8bd",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "C:\\Users\\smaidano\\AppData\\Local\\miniconda3\\envs\\dp-mpl\\lib\\site-packages\\scipy\\__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.5\n",
-      "  warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "10240000 50\n"
-     ]
-    },
-    {
-     "ename": "NameError",
-     "evalue": "name 'np' is not defined",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
-      "Cell \u001b[1;32mIn[1], line 10\u001b[0m\n\u001b[0;32m      8\u001b[0m zl \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m      9\u001b[0m zh \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m---> 10\u001b[0m est \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241m.\u001b[39mempty(n_batches)\n\u001b[0;32m     11\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(n_batches):\n\u001b[0;32m     12\u001b[0m     clear_output(wait\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n",
-      "\u001b[1;31mNameError\u001b[0m: name 'np' is not defined"
-     ]
-    }
-   ],
-   "source": [
-    "from mcpi_demo.impl.impl_numba_dpex import monte_carlo_pi_batch\n",
-    "batch_size = 1024*10000\n",
-    "n_batches = 50\n",
-    "print(batch_size, n_batches)\n",
-    "\n",
-    "x = []\n",
-    "y = []\n",
-    "zl = []\n",
-    "zh = []\n",
-    "est = np.empty(n_batches)\n",
-    "for i in range(n_batches):\n",
-    "    clear_output(wait=True)\n",
-    "    \n",
-    "    t1 = time()\n",
-    "    est[i] = monte_carlo_pi_batch(batch_size)\n",
-    "    t2 = time()\n",
-    "    \n",
-    "    avg = est[:i].mean()\n",
-    "    std = est[:i].std()\n",
-    "    \n",
-    "    x.append(i)\n",
-    "    y.append(avg)\n",
-    "    zl.append(avg-std)\n",
-    "    zh.append(avg+std)\n",
-    "    \n",
-    "    plt.xlim([1, n_batches])\n",
-    "    plt.ylim([3.1405, 3.1425])\n",
-    "   \n",
-    "    plt.plot(x, y, '-r', color='red')\n",
-    "    plt.fill_between(x, zl, zh, color='orange', alpha=0.3)\n",
-    "    plt.text(5, 3.1423, f\"{batch_size/(t2-t1)/1e6:.0f} Msamples/sec\")\n",
-    "    plt.title(r\"Monte Carlo $\\pi$ estimation using numba\")\n",
-    "    plt.show()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "5935d8b5-9a1c-4498-b689-3ae3ed4d47ac",
-   "metadata": {},
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.9.7"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/demos/mcpi/mcpi.py b/demos/mcpi/mcpi.py
deleted file mode 100644
index 3ffa4ba..0000000
--- a/demos/mcpi/mcpi.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from mcpi_demo.pi import main
-
-main()
diff --git a/demos/mcpi/mcpi_demo/__init__.py b/demos/mcpi/mcpi_demo/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/demos/mcpi/mcpi_demo/__main__.py b/demos/mcpi/mcpi_demo/__main__.py
deleted file mode 100644
index 3ffa4ba..0000000
--- a/demos/mcpi/mcpi_demo/__main__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from mcpi_demo.pi import main
-
-main()
diff --git a/demos/mcpi/mcpi_demo/impl/__init__.py b/demos/mcpi/mcpi_demo/impl/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/demos/mcpi/mcpi_demo/impl/arg_parser.py b/demos/mcpi/mcpi_demo/impl/arg_parser.py
deleted file mode 100644
index 2c7dc12..0000000
--- a/demos/mcpi/mcpi_demo/impl/arg_parser.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import argparse
-
-
-def int_tuple(tuple_str):
-    return tuple(map(int, tuple_str.split(",")))
-
-
-def parse_args(argv=None):
-    parser = argparse.ArgumentParser(description="Monte Carlo Pi")
-    parser.add_argument(
-        "--variant",
-        help="Implementation variant",
-        type=str.casefold,
-        choices=["numpy", "numba", "dpnp", "numba-dpex"],
-        default="numpy",
-    )
-    batch_size = 102400000
-    parser.add_argument(
-        "--batch-size",
-        help=f"Size of the grid. E.g. 102400000. Default {batch_size}",
-        type=int,
-        default=int(f"{batch_size}"),
-    )
-    n_batches = 8
-    parser.add_argument(
-        "--n-batches",
-        help=f"Size of the grid. E.g. 8. Default {n_batches}",
-        type=int,
-        default=int(f"{n_batches}"),
-    )
-
-    args = parser.parse_args(argv)
-    return args
diff --git a/demos/mcpi/mcpi_demo/impl/impl_dpnp.py b/demos/mcpi/mcpi_demo/impl/impl_dpnp.py
deleted file mode 100644
index 2726294..0000000
--- a/demos/mcpi/mcpi_demo/impl/impl_dpnp.py
+++ /dev/null
@@ -1,8 +0,0 @@
-import dpnp as np
-
-
-def monte_carlo_pi_batch(batch_size):
-    x = np.random.random(batch_size)
-    y = np.random.random(batch_size)
-    acc = np.count_nonzero(x * x + y * y <= 1.0)
-    return 4.0 * acc / batch_size
diff --git a/demos/mcpi/mcpi_demo/impl/impl_numba.py b/demos/mcpi/mcpi_demo/impl/impl_numba.py
deleted file mode 100644
index ba01813..0000000
--- a/demos/mcpi/mcpi_demo/impl/impl_numba.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import numpy as np
-from numba import njit
-from numba import prange
-
-
-@njit(parallel=True)
-def monte_carlo_pi_batch(batch_size):
-    x = np.random.random(batch_size)
-    y = np.random.random(batch_size)
-    acc = 0
-    for i in prange(batch_size):
-        if x[i] * x[i] + y[i] * y[i] <= 1.0:
-            acc += 1
-    return 4.0 * acc / batch_size
diff --git a/demos/mcpi/mcpi_demo/impl/impl_numba_dpex.py b/demos/mcpi/mcpi_demo/impl/impl_numba_dpex.py
deleted file mode 100644
index 918da4f..0000000
--- a/demos/mcpi/mcpi_demo/impl/impl_numba_dpex.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import dpnp as np
-from numba_dpex import dpjit
-from numba_dpex import prange
-
-
-@dpjit(parallel=True)
-def monte_carlo_pi_batch(batch_size):
-    x = np.random.random(batch_size)
-    y = np.random.random(batch_size)
-    acc = 0
-    for i in prange(batch_size):
-        if x[i] * x[i] + y[i] * y[i] <= 1.0:
-            acc += 1
-    return 4.0 * acc / batch_size
diff --git a/demos/mcpi/mcpi_demo/impl/impl_numpy.py b/demos/mcpi/mcpi_demo/impl/impl_numpy.py
deleted file mode 100644
index c745ff0..0000000
--- a/demos/mcpi/mcpi_demo/impl/impl_numpy.py
+++ /dev/null
@@ -1,8 +0,0 @@
-import numpy as np
-
-
-def monte_carlo_pi_batch(batch_size):
-    x = np.random.random(batch_size)
-    y = np.random.random(batch_size)
-    acc = np.count_nonzero(x * x + y * y <= 1.0)
-    return 4.0 * acc / batch_size
diff --git a/demos/mcpi/mcpi_demo/impl/impl_versioner.py b/demos/mcpi/mcpi_demo/impl/impl_versioner.py
deleted file mode 100644
index 8cc3775..0000000
--- a/demos/mcpi/mcpi_demo/impl/impl_versioner.py
+++ /dev/null
@@ -1,21 +0,0 @@
-import numpy as np
-from mcpi_demo.impl.arg_parser import parse_args
-
-RUN_VERSION = parse_args().variant
-
-if RUN_VERSION == "Numba".casefold():
-    from mcpi_demo.impl.impl_numba import monte_carlo_pi_batch
-elif RUN_VERSION == "NumPy".casefold():
-    from mcpi_demo.impl.impl_numpy import monte_carlo_pi_batch
-elif RUN_VERSION == "DPNP".casefold():
-    from mcpi_demo.impl.impl_dpnp import monte_carlo_pi_batch
-elif RUN_VERSION == "Numba-DPEX".casefold():
-    from mcpi_demo.impl.impl_numba_dpex import monte_carlo_pi_batch
-
-
-def monte_carlo_pi(batch_size, n_batches):
-    s = np.empty(n_batches)
-    for i in range(n_batches):
-        print(f"Batch #{i}")
-        s[i] = monte_carlo_pi_batch(batch_size)
-    return s.mean(), s.std()
diff --git a/demos/mcpi/mcpi_demo/pi.py b/demos/mcpi/mcpi_demo/pi.py
deleted file mode 100644
index 442f204..0000000
--- a/demos/mcpi/mcpi_demo/pi.py
+++ /dev/null
@@ -1,23 +0,0 @@
-import time
-
-from mcpi_demo.impl.arg_parser import parse_args
-from mcpi_demo.impl.impl_versioner import monte_carlo_pi
-
-
-def main():
-    args = parse_args()
-    batch_size = args.batch_size
-    n_batches = args.n_batches
-    print(
-        f"Estimating Pi with {args.variant} for {n_batches} "
-        f"Sbatches of size {batch_size}..."
-    )
-    t1 = time.time()
-    pi, pi_std = monte_carlo_pi(batch_size, n_batches)
-    t2 = time.time()
-    print(f"Pi={pi}, std={pi_std}")
-    print("Done in ", t2 - t1, "seconds...")
-
-
-if __name__ == "__main__":
-    main()
diff --git a/demos/mcpi/mcpi_demo/tests/__init__.py b/demos/mcpi/mcpi_demo/tests/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/demos/mcpi/mcpi_demo/tests/_test_numba_dpex.py b/demos/mcpi/mcpi_demo/tests/_test_numba_dpex.py
deleted file mode 100644
index 281403e..0000000
--- a/demos/mcpi/mcpi_demo/tests/_test_numba_dpex.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from math import fabs
-
-import dpnp as np
-from mcpi_demo.impl.impl_numba_dpex import monte_carlo_pi_batch
-
-
-def test_numba_dpex():
-    batch_size = 100000
-    np.random.seed(7777777)
-    pi = monte_carlo_pi_batch(batch_size)
-    assert fabs(pi - 3.14) <= 0.1
diff --git a/demos/mcpi/mcpi_demo/tests/test_dpnp.py b/demos/mcpi/mcpi_demo/tests/test_dpnp.py
deleted file mode 100644
index 3af18e5..0000000
--- a/demos/mcpi/mcpi_demo/tests/test_dpnp.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from math import fabs
-
-import dpnp as np
-from mcpi_demo.impl.impl_dpnp import monte_carlo_pi_batch
-
-
-def test_dpnp():
-    batch_size = 100000
-    np.random.seed(7777777)
-    pi = monte_carlo_pi_batch(batch_size)
-    assert fabs(pi - 3.14) <= 0.1
diff --git a/demos/mcpi/mcpi_demo/tests/test_numba.py b/demos/mcpi/mcpi_demo/tests/test_numba.py
deleted file mode 100644
index a7b84cd..0000000
--- a/demos/mcpi/mcpi_demo/tests/test_numba.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from math import fabs
-
-import numpy as np
-from mcpi_demo.impl.impl_numba import monte_carlo_pi_batch
-
-
-def test_numba():
-    batch_size = 100000
-    np.random.seed(7777777)
-    pi = monte_carlo_pi_batch(batch_size)
-    assert fabs(pi - 3.14) <= 0.1
diff --git a/demos/mcpi/mcpi_demo/tests/test_numpy.py b/demos/mcpi/mcpi_demo/tests/test_numpy.py
deleted file mode 100644
index c2c499d..0000000
--- a/demos/mcpi/mcpi_demo/tests/test_numpy.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from math import fabs
-
-import numpy as np
-from mcpi_demo.impl.impl_numpy import monte_carlo_pi_batch
-
-
-def test_numpy():
-    batch_size = 100000
-    np.random.seed(7777777)
-    pi = monte_carlo_pi_batch(batch_size)
-    assert fabs(pi - 3.14) <= 0.1
diff --git a/demos/mcpi/pi-animation.gif b/demos/mcpi/pi-animation.gif
deleted file mode 100644
index 7feb0b4..0000000
Binary files a/demos/mcpi/pi-animation.gif and /dev/null differ
diff --git a/demos/mcpi/setup.py b/demos/mcpi/setup.py
deleted file mode 100644
index 7f1a176..0000000
--- a/demos/mcpi/setup.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from setuptools import setup
-
-if __name__ == "__main__":
-    setup()
diff --git a/docs/.gitignore b/docs/.gitignore
deleted file mode 100644
index e35d885..0000000
--- a/docs/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-_build
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index c336a62..0000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# Minimal makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line, and also
-# from the environment for the first two.
-SPHINXOPTS    ?=
-SPHINXBUILD   ?= sphinx-build
-SOURCEDIR     = ./sources
-BUILDDIR      = _build
-
-# Put it first so that "make" without argument is like "make help".
-help:
-	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-
-.PHONY: help Makefile
-
-# Catch-all target: route all unknown targets to Sphinx using the new
-# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
-%: Makefile
-	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100644
index a54f0df..0000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
-	set SPHINXBUILD=sphinx-build
-)
-set SOURCEDIR=./sources
-set BUILDDIR=_build
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
-	echo.
-	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
-	echo.installed, then set the SPHINXBUILD environment variable to point
-	echo.to the full path of the 'sphinx-build' executable. Alternatively you
-	echo.may add the Sphinx directory to PATH.
-	echo.
-	echo.If you don't have Sphinx installed, grab it from
-	echo.http://sphinx-doc.org/
-	exit /b 1
-)
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
-:end
-popd
diff --git a/docs/sources/_images/dpctl-logo.png b/docs/sources/_images/dpctl-logo.png
deleted file mode 100644
index 4db2a17..0000000
Binary files a/docs/sources/_images/dpctl-logo.png and /dev/null differ
diff --git a/docs/sources/_images/dpnp-logo.png b/docs/sources/_images/dpnp-logo.png
deleted file mode 100644
index 5d9571e..0000000
Binary files a/docs/sources/_images/dpnp-logo.png and /dev/null differ
diff --git a/docs/sources/_images/numba-dpex-logo.png b/docs/sources/_images/numba-dpex-logo.png
deleted file mode 100644
index a0f224e..0000000
Binary files a/docs/sources/_images/numba-dpex-logo.png and /dev/null differ
diff --git a/docs/sources/conf.py b/docs/sources/conf.py
deleted file mode 100644
index b7a1de9..0000000
--- a/docs/sources/conf.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# *****************************************************************************
-# Copyright (c) 2020-2023, Intel Corporation All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-#     Redistributions of source code must retain the above copyright notice,
-#     this list of conditions and the following disclaimer.
-#
-#     Redistributions in binary form must reproduce the above copyright notice,
-#     this list of conditions and the following disclaimer in the documentation
-#     and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# *****************************************************************************
-
-# coding: utf-8
-# Configuration file for the Sphinx documentation builder.
-
-import errno
-import shutil
-from pathlib import Path
-
-# -- Project information -----------------------------------------------------
-
-project = "Data Parallel Extensions for Python*"
-copyright = "2020-2023, Intel Corporation"
-author = "Intel Corporation"
-
-# The full version, including alpha/beta/rc tags
-release = "0.1"
-
-# -- General configuration ----------------------------------------------------
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = [
-    "sphinx.ext.todo",
-    "sphinx.ext.intersphinx",
-    "sphinx.ext.extlinks",
-    "sphinx.ext.githubpages",
-    "sphinx.ext.napoleon",
-    "sphinx.ext.autosectionlabel",
-    "sphinxcontrib.programoutput",
-    "sphinxcontrib.googleanalytics",
-    "nbsphinx",
-    "IPython.sphinxext.ipython_console_highlighting",
-]
-
-googleanalytics_id = "G-KVSVYMBQ0W"
-googleanalytics_enabled = True
-
-# Add any paths that contain templates here, relative to this directory.
-# templates_path = ['_templates']
-templates_path = []
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ["_build", "**.ipynb_checkpoints"]
-
-
-# -- Options for HTML output -------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-#
-html_theme = "sdc-sphinx-theme"
-
-html_theme_path = ["."]
-
-html_theme_options = {}
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = []
-
-html_sidebars = {
-    "**": ["globaltoc.html", "sourcelink.html", "searchbox.html", "relations.html"],
-}
-
-html_show_sourcelink = False
-
-# -- Todo extension configuration  ----------------------------------------------
-todo_include_todos = True
-todo_link_only = True
-
-intersphinx_mapping = {}
-
-# -- Prepend module name to an object name or not -----------------------------------
-add_module_names = False
-
-# -- Copy notebooks into ./docs/sources/notebooks -----------------------------------
-notebooks_src_path = "../../notebooks"
-notebooks_dst_path = "notebooks"
-
-dirpath = Path(notebooks_dst_path)
-if dirpath.exists() and dirpath.is_dir():
-    shutil.rmtree(dirpath)
-
-try:
-    shutil.copytree(notebooks_src_path, notebooks_dst_path)
-except OSError as exc:  # python >2.5
-    if exc.errno in (errno.ENOTDIR, errno.EINVAL):
-        shutil.copy(notebooks_src_path, notebooks_dst_path)
-    else:
-        raise
diff --git a/docs/sources/ext_links.txt b/docs/sources/ext_links.txt
deleted file mode 100644
index 7dde5a6..0000000
--- a/docs/sources/ext_links.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-..
-    **********************************************************
-    THESE ARE EXTERNAL PROJECT LINKS USED IN THE DOCUMENTATION
-    **********************************************************
-.. _NumPy*: https://numpy.org/
-.. _Numba*: https://numba.pydata.org/
-.. _Python* Array API Standard: https://data-apis.org/array-api/
-.. _Intel Distribution for Python*: https://www.intel.com/content/www/us/en/developer/tools/oneapi/distribution-for-python.html
-.. _OpenCl*: https://www.khronos.org/opencl/
-.. _DPC++: https://www.apress.com/gp/book/9781484255735
-.. _Data Parallel Extension for Numba*: https://intelpython.github.io/numba-dpex/latest/index.html
-.. _SYCL*: https://www.khronos.org/sycl/
-.. _Data Parallel Control: https://intelpython.github.io/dpctl/latest/index.html
-.. _Data Parallel Extension for Numpy*: https://intelpython.github.io/dpnp/
-.. _IEEE 754-2019 Standard for Floating-Point Arithmetic: https://standards.ieee.org/ieee/754/6210/
-.. _David Goldberg, What every computer scientist should know about floating-point arithmetic: https://www.itu.dk/~sestoft/bachelor/IEEE754_article.pdf>
-.. _Intel oneAPI Base Toolkit: https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit.html
-.. _Intel VTune Profiler: https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html
-.. _Intel Advisor: https://www.intel.com/content/www/us/en/developer/tools/oneapi/advisor.html
-.. _Data Parallel Extensions for Python GitHub repository: https://github.com/IntelPython/dpep
diff --git a/docs/sources/sdc-sphinx-theme/globaltoc.html b/docs/sources/sdc-sphinx-theme/globaltoc.html
deleted file mode 100644
index d96aefd..0000000
--- a/docs/sources/sdc-sphinx-theme/globaltoc.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<h3>Table of Contents</h3>
-{{ toctree(maxdepth=-1, titles_only=true) }}
diff --git a/docs/sources/sdc-sphinx-theme/layout.html b/docs/sources/sdc-sphinx-theme/layout.html
deleted file mode 100644
index d58f22a..0000000
--- a/docs/sources/sdc-sphinx-theme/layout.html
+++ /dev/null
@@ -1,99 +0,0 @@
-{% extends "basic/layout.html" %}
-
-{%- block scripts %}
-    {{ super() }}
-    <script type="text/javascript" src="{{ pathto('_static/sidebar.js', 1) }}"></script>
-    {% if not embedded %}<script type="text/javascript" src="{{ pathto('_static/copybutton.js', 1) }}"></script>{% endif %}
-{%- endblock %}
-
-{# Add the google webfonts needed for the logo #}
-{% block extrahead %}
-    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
-{% endblock %}
-
-{% block header %}
-<div class="topbar">
-  <a class="brand" title="{{ _('Intel Python projects') }}" href="{{ pathto('other_intel_python_projects') }}"></a>
-  <a class="brand_sdc" title="{{ _('Documentation Home') }}" href="{{ pathto(master_doc) }}"></a>
-
-  <ul>
-    <li><a class="exampleslink" title="Examples" href="{{ pathto('examples') }}"></a></li>
-    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
-    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
-    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
-    <li>
-      {% block sidebarsearch %}
-      {% include "searchbox.html" %}
-      {% endblock %}
-    </li>
-  </ul>
-</div>
-{% endblock %}
-
-{% block relbar1 %}
-<div class="related">
-    <h3>{{ _('Navigation') }}</h3>
-    <ul>
-      {%- if next %}
-      <li class="right">
-	<a href="{{ next.link|e }}" title="{{ next.title|striptags|e }}">
-	  next {{ "&raquo;"|safe }}
-	</a>
-      </li>
-      {%- endif %}
-      {%- if prev %}
-      <li class="right">
-	<a href="{{ prev.link|e }}" title="{{ prev.title|striptags|e }}">
-	  {{ "&laquo;"|safe }} previous
-	</a>
-	{% if next %}{{ reldelim2 }}{% endif %}
-      </li>
-      {%- endif %}
-      {%- block rootrellink %}
-      <li>
-	<a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>
-	{{ reldelim1 }}
-      </li>
-      {%- endblock %}
-      {%- for parent in parents %}
-      <li><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
-      {%- endfor %}
-      {# Don't put the title in the relbar for the first (index) page. #}
-      {% if prev %}<li>{{ title }}</li>{% endif %}
-      {%- block relbaritems %} {% endblock %}
-    </ul>
-</div>
-{% endblock %}
-
-{# Silence the bottom relbar. #}
-{% block relbar2 %}{% endblock %}
-
-
-{%- block footer %}
-<footer class="footer">
-  <p class="pull-right">
-    {%- if edit_on_github %}
-    <a href="{{ edit_on_github }}">{{ edit_on_github_page_message }}</a> &nbsp;
-    {%- endif %}
-    {%- if show_source and has_source and sourcename %}
-    <a href="{{ pathto('_sources/' + sourcename, true)|e }}"
-       rel="nofollow">{{ _('Page Source') }}</a>
-    {%- endif %} &nbsp;
-    <a href="#">Back to Top</a></p>
-  <p>
-    {%- if show_copyright %}
-    {%- if hasdoc('copyright') %}
-    {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}<br/>
-    {%- else %}
-    {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}<br/>
-    {%- endif %}
-    {%- endif %}
-    {%- if show_sphinx %}
-    {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> {{ sphinx_version }}.{% endtrans %} &nbsp;
-    {%- endif %}
-    {%- if last_updated %}
-    {% trans last_updated=last_updated|e %}Last built {{ last_updated }}.{% endtrans %} <br/>
-    {%- endif %}
-  </p>
-</footer>
-{%- endblock %}
diff --git a/docs/sources/sdc-sphinx-theme/localtoc.html b/docs/sources/sdc-sphinx-theme/localtoc.html
deleted file mode 100644
index 00752f4..0000000
--- a/docs/sources/sdc-sphinx-theme/localtoc.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<h3>Page Contents</h3>
-{{ toc }}
diff --git a/docs/sources/sdc-sphinx-theme/searchbox.html b/docs/sources/sdc-sphinx-theme/searchbox.html
deleted file mode 100644
index 0d17cc1..0000000
--- a/docs/sources/sdc-sphinx-theme/searchbox.html
+++ /dev/null
@@ -1,7 +0,0 @@
-{%- if pagename != "search" %}
-<form action="{{ pathto('search') }}" method="get">
-  <input type="text" name="q" placeholder="Search" />
-  <input type="hidden" name="check_keywords" value="yes" />
-  <input type="hidden" name="area" value="default" />
-</form>
-{%- endif %}
diff --git a/docs/sources/sdc-sphinx-theme/theme.conf b/docs/sources/sdc-sphinx-theme/theme.conf
deleted file mode 100644
index 4184857..0000000
--- a/docs/sources/sdc-sphinx-theme/theme.conf
+++ /dev/null
@@ -1,11 +0,0 @@
-# Intel(R) SDC theme based on Bootstrap-AstroPy CSS
-[theme]
-inherit = basic
-stylesheet = sdc.css
-pygments_style = sphinx
-
-[options]
-logotext1 = astro
-logotext2 = py
-logotext3 = :docs
-astropy_project_menubar = False
diff --git a/environment.yml b/environment.yml
deleted file mode 100644
index 9cf3739..0000000
--- a/environment.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-name: docs
-channels:
-  - conda-forge
-dependencies:
-  - python=3.9
-  - ipython
-  - pip
-  - sphinx
-  - sphinxcontrib-programoutput
-  - nbsphinx
-  - nbconvert=7.3.1
-  - pip:
-    - sphinxcontrib-googleanalytics
diff --git a/examples/01-hello_dpnp.py b/examples/01-hello_dpnp.py
deleted file mode 100644
index 932f64e..0000000
--- a/examples/01-hello_dpnp.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# *****************************************************************************
-# Copyright (c) 2022, Intel Corporation All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-#     Redistributions of source code must retain the above copyright notice,
-#     this list of conditions and the following disclaimer.
-#
-#     Redistributions in binary form must reproduce the above copyright notice,
-#     this list of conditions and the following disclaimer in the documentation
-#     and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# *****************************************************************************
-
-import dpnp as np
-
-x = np.asarray([1, 2, 3])
-print("Array x allocated on the device:", x.device)
-
-y = np.sum(x)
-
-print("Result y is located on the device:", y.device)  # The same device as x
-print("Shape of y is:", y.shape)  # 0-dimensional array
-print("y=", y)  # Expect 6
diff --git a/examples/02-dpnp_device.py b/examples/02-dpnp_device.py
deleted file mode 100644
index 11548ef..0000000
--- a/examples/02-dpnp_device.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# *****************************************************************************
-# Copyright (c) 2022, Intel Corporation All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-#     Redistributions of source code must retain the above copyright notice,
-#     this list of conditions and the following disclaimer.
-#
-#     Redistributions in binary form must reproduce the above copyright notice,
-#     this list of conditions and the following disclaimer in the documentation
-#     and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# *****************************************************************************
-
-import dpnp as np
-
-x = np.empty(3)
-try:
-    x = np.asarray([1, 2, 3], device="gpu")
-except Exception:
-    print("GPU device is not available")
-
-print("Array x allocated on the device:", x.device)
-
-y = np.sum(x)
-
-print("Result y is located on the device:", y.device)  # The same device as x
-print("Shape of y is:", y.shape)  # 0-dimensional array
-print("y=", y)  # Expect 6
diff --git a/examples/03-dpnp2numba-dpex.py b/examples/03-dpnp2numba-dpex.py
deleted file mode 100644
index a087033..0000000
--- a/examples/03-dpnp2numba-dpex.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# *****************************************************************************
-# Copyright (c) 2022, Intel Corporation All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-#     Redistributions of source code must retain the above copyright notice,
-#     this list of conditions and the following disclaimer.
-#
-#     Redistributions in binary form must reproduce the above copyright notice,
-#     this list of conditions and the following disclaimer in the documentation
-#     and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# *****************************************************************************
-
-import dpnp as np
-from numba_dpex import dpjit as njit
-
-
-@njit()
-def sum_it(x):  # Device queue is inferred from x. The kernel is submitted to that queue
-    return np.sum(x)
-
-
-x = np.empty(3)
-try:
-    x = np.asarray([1, 2, 3], device="gpu")
-except Exception:
-    print("GPU device is not available")
-
-print("Array x allocated on the device:", x.device)
-
-y = sum_it(x)
-
-print("Result y is located on the device:", y.device)  # The same device as x
-print("Shape of y is:", y.shape)  # 0-dimensional array
-print("y=", y)  # Expect 6
diff --git a/examples/04-dpctl_device_query.py b/examples/04-dpctl_device_query.py
deleted file mode 100644
index ad140f6..0000000
--- a/examples/04-dpctl_device_query.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# *****************************************************************************
-# Copyright (c) 2022, Intel Corporation All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-#     Redistributions of source code must retain the above copyright notice,
-#     this list of conditions and the following disclaimer.
-#
-#     Redistributions in binary form must reproduce the above copyright notice,
-#     this list of conditions and the following disclaimer in the documentation
-#     and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# *****************************************************************************
-
-import dpctl
-
-dpctl.lsplatform()  # Print platform information
-print(
-    "GPU devices:", dpctl.get_devices(device_type="gpu")
-)  # Get the list of all GPU devices
-print(
-    "Number of GPU devices", dpctl.get_num_devices(device_type="gpu")
-)  # Get the number of GPU devices
-print("Has CPU devices?", dpctl.has_cpu_devices())  # Check if there are CPU devices
diff --git a/main/.buildinfo b/main/.buildinfo
new file mode 100644
index 0000000..b00e2c1
--- /dev/null
+++ b/main/.buildinfo
@@ -0,0 +1,4 @@
+# Sphinx build info version 1
+# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
+config: f6559a5f534fe3fb7c807cfbb435275b
+tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/demos/game-of-life/game_of_life_demo/tests/__init__.py b/main/.nojekyll
similarity index 100%
rename from demos/game-of-life/game_of_life_demo/tests/__init__.py
rename to main/.nojekyll
diff --git a/docs/sources/_images/DPEP-large.png b/main/_images/DPEP-large.png
similarity index 100%
rename from docs/sources/_images/DPEP-large.png
rename to main/_images/DPEP-large.png
diff --git a/docs/sources/_images/advisor_roofline_gen9.png b/main/_images/advisor_roofline_gen9.png
similarity index 100%
rename from docs/sources/_images/advisor_roofline_gen9.png
rename to main/_images/advisor_roofline_gen9.png
diff --git a/docs/sources/_images/dpep-all.png b/main/_images/dpep-all.png
similarity index 100%
rename from docs/sources/_images/dpep-all.png
rename to main/_images/dpep-all.png
diff --git a/docs/sources/_images/dpep-cores.png b/main/_images/dpep-cores.png
similarity index 100%
rename from docs/sources/_images/dpep-cores.png
rename to main/_images/dpep-cores.png
diff --git a/docs/sources/_images/dpep-ilp.png b/main/_images/dpep-ilp.png
similarity index 100%
rename from docs/sources/_images/dpep-ilp.png
rename to main/_images/dpep-ilp.png
diff --git a/docs/sources/_images/dpep-simd.png b/main/_images/dpep-simd.png
similarity index 100%
rename from docs/sources/_images/dpep-simd.png
rename to main/_images/dpep-simd.png
diff --git a/docs/sources/_images/fp-cancellation.png b/main/_images/fp-cancellation.png
similarity index 100%
rename from docs/sources/_images/fp-cancellation.png
rename to main/_images/fp-cancellation.png
diff --git a/docs/sources/_images/hetero-devices.png b/main/_images/hetero-devices.png
similarity index 100%
rename from docs/sources/_images/hetero-devices.png
rename to main/_images/hetero-devices.png
diff --git a/docs/sources/_images/kernel-queue-device.png b/main/_images/kernel-queue-device.png
similarity index 100%
rename from docs/sources/_images/kernel-queue-device.png
rename to main/_images/kernel-queue-device.png
diff --git a/docs/sources/_images/queue-exception1.png b/main/_images/queue-exception1.png
similarity index 100%
rename from docs/sources/_images/queue-exception1.png
rename to main/_images/queue-exception1.png
diff --git a/docs/sources/_images/queue-exception2.png b/main/_images/queue-exception2.png
similarity index 100%
rename from docs/sources/_images/queue-exception2.png
rename to main/_images/queue-exception2.png
diff --git a/docs/sources/_images/queue-exception3.png b/main/_images/queue-exception3.png
similarity index 100%
rename from docs/sources/_images/queue-exception3.png
rename to main/_images/queue-exception3.png
diff --git a/docs/sources/benchmarks.rst b/main/_sources/benchmarks.rst.txt
similarity index 100%
rename from docs/sources/benchmarks.rst
rename to main/_sources/benchmarks.rst.txt
diff --git a/docs/sources/demos.rst b/main/_sources/demos.rst.txt
similarity index 100%
rename from docs/sources/demos.rst
rename to main/_sources/demos.rst.txt
diff --git a/docs/sources/examples.rst b/main/_sources/examples.rst.txt
similarity index 100%
rename from docs/sources/examples.rst
rename to main/_sources/examples.rst.txt
diff --git a/docs/sources/heterogeneous_computing.rst b/main/_sources/heterogeneous_computing.rst.txt
similarity index 100%
rename from docs/sources/heterogeneous_computing.rst
rename to main/_sources/heterogeneous_computing.rst.txt
diff --git a/docs/sources/index.rst b/main/_sources/index.rst.txt
similarity index 100%
rename from docs/sources/index.rst
rename to main/_sources/index.rst.txt
diff --git a/docs/sources/jupyter_notebook.rst b/main/_sources/jupyter_notebook.rst.txt
similarity index 100%
rename from docs/sources/jupyter_notebook.rst
rename to main/_sources/jupyter_notebook.rst.txt
diff --git a/notebooks/01-get_started.ipynb b/main/_sources/notebooks/01-get_started.ipynb.txt
similarity index 100%
rename from notebooks/01-get_started.ipynb
rename to main/_sources/notebooks/01-get_started.ipynb.txt
diff --git a/notebooks/.ipynb_checkpoints/02-dpnp_numpy_fallback-checkpoint.ipynb b/main/_sources/notebooks/02-dpnp_numpy_fallback.ipynb.txt
similarity index 100%
rename from notebooks/.ipynb_checkpoints/02-dpnp_numpy_fallback-checkpoint.ipynb
rename to main/_sources/notebooks/02-dpnp_numpy_fallback.ipynb.txt
diff --git a/notebooks/dpep_scalability_journey_example-pairwise_distance.ipynb b/main/_sources/notebooks/dpep_scalability_journey_example-pairwise_distance.ipynb.txt
similarity index 100%
rename from notebooks/dpep_scalability_journey_example-pairwise_distance.ipynb
rename to main/_sources/notebooks/dpep_scalability_journey_example-pairwise_distance.ipynb.txt
diff --git a/docs/sources/parallelism.rst b/main/_sources/parallelism.rst.txt
similarity index 100%
rename from docs/sources/parallelism.rst
rename to main/_sources/parallelism.rst.txt
diff --git a/docs/sources/prerequisites_and_installation.rst b/main/_sources/prerequisites_and_installation.rst.txt
similarity index 100%
rename from docs/sources/prerequisites_and_installation.rst
rename to main/_sources/prerequisites_and_installation.rst.txt
diff --git a/docs/sources/programming_dpep.rst b/main/_sources/programming_dpep.rst.txt
similarity index 100%
rename from docs/sources/programming_dpep.rst
rename to main/_sources/programming_dpep.rst.txt
diff --git a/docs/sources/useful_links.rst b/main/_sources/useful_links.rst.txt
similarity index 100%
rename from docs/sources/useful_links.rst
rename to main/_sources/useful_links.rst.txt
diff --git a/docs/sources/_images/DPEP.png b/main/_static/DPEP.png
similarity index 100%
rename from docs/sources/_images/DPEP.png
rename to main/_static/DPEP.png
diff --git a/main/_static/basic.css b/main/_static/basic.css
new file mode 100644
index 0000000..30fee9d
--- /dev/null
+++ b/main/_static/basic.css
@@ -0,0 +1,925 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+    clear: both;
+}
+
+div.section::after {
+    display: block;
+    content: '';
+    clear: left;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+    width: 100%;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+    word-wrap: break-word;
+    overflow-wrap : break-word;
+}
+
+div.sphinxsidebar ul {
+    list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox form.search {
+    overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+    float: left;
+    width: 80%;
+    padding: 0.25em;
+    box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+    float: left;
+    width: 20%;
+    border-left: none;
+    padding: 0.25em;
+    box-sizing: border-box;
+}
+
+
+img {
+    border: 0;
+    max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li p.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+    width: 90%;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+    width: 100%;
+}
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable ul {
+    margin-top: 0;
+    margin-bottom: 0;
+    list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+    padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+div.modindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+    padding: 2px;
+    border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+    min-width: 360px;
+    max-width: 800px;
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+    -moz-hyphens: auto;
+    -ms-hyphens: auto;
+    -webkit-hyphens: auto;
+    hyphens: auto;
+}
+
+a.headerlink {
+    visibility: hidden;
+}
+
+a:visited {
+    color: #551A8B;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+    clear: left;
+    float: left;
+    margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+    clear: right;
+    float: right;
+    margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+    text-align: left;
+}
+
+.align-center {
+    text-align: center;
+}
+
+.align-default {
+    text-align: center;
+}
+
+.align-right {
+    text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar,
+aside.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+    clear: right;
+    overflow-x: auto;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+nav.contents,
+aside.topic,
+div.admonition, div.topic, blockquote {
+    clear: left;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+    border: 1px solid #ccc;
+    padding: 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+nav.contents > :last-child,
+aside.topic > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+    margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+nav.contents::after,
+aside.topic::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+    display: block;
+    content: '';
+    clear: both;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    border: 0;
+    border-collapse: collapse;
+}
+
+table.align-center {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table.align-default {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table caption span.caption-number {
+    font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 5px;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+table.citation {
+    border-left: solid 1px gray;
+    margin-left: 1px;
+}
+
+table.citation td {
+    border-bottom: none;
+}
+
+th > :first-child,
+td > :first-child {
+    margin-top: 0px;
+}
+
+th > :last-child,
+td > :last-child {
+    margin-bottom: 0px;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure, figure {
+    margin: 0.5em;
+    padding: 0.5em;
+}
+
+div.figure p.caption, figcaption {
+    padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+    font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.field-name {
+    -moz-hyphens: manual;
+    -ms-hyphens: manual;
+    -webkit-hyphens: manual;
+    hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist {
+    margin: 1em 0;
+}
+
+table.hlist td {
+    vertical-align: top;
+}
+
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+	font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.sig-name {
+	font-size: 1.1em;
+}
+
+code.descname {
+    font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.sig-paren {
+    font-size: larger;
+}
+
+.sig-param.n {
+	font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+	font-family: unset;
+}
+
+.sig.c   .k, .sig.c   .kt,
+.sig.cpp .k, .sig.cpp .kt {
+	color: #0033B3;
+}
+
+.sig.c   .m,
+.sig.cpp .m {
+	color: #1750EB;
+}
+
+.sig.c   .s, .sig.c   .sc,
+.sig.cpp .s, .sig.cpp .sc {
+	color: #067D17;
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+    list-style: decimal;
+}
+
+ol.loweralpha {
+    list-style: lower-alpha;
+}
+
+ol.upperalpha {
+    list-style: upper-alpha;
+}
+
+ol.lowerroman {
+    list-style: lower-roman;
+}
+
+ol.upperroman {
+    list-style: upper-roman;
+}
+
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
+    margin-top: 0px;
+}
+
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+    margin-bottom: 0px;
+}
+
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+    margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+    margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+    margin-bottom: 0;
+}
+
+aside.footnote > span,
+div.citation > span {
+    float: left;
+}
+aside.footnote > span:last-of-type,
+div.citation > span:last-of-type {
+  padding-right: 0.5em;
+}
+aside.footnote > p {
+  margin-left: 2em;
+}
+div.citation > p {
+  margin-left: 4em;
+}
+aside.footnote > p:last-of-type,
+div.citation > p:last-of-type {
+    margin-bottom: 0em;
+}
+aside.footnote > p:last-of-type:after,
+div.citation > p:last-of-type:after {
+    content: "";
+    clear: both;
+}
+
+dl.field-list {
+    display: grid;
+    grid-template-columns: fit-content(30%) auto;
+}
+
+dl.field-list > dt {
+    font-weight: bold;
+    word-break: break-word;
+    padding-left: 0.5em;
+    padding-right: 5px;
+}
+
+dl.field-list > dd {
+    padding-left: 0.5em;
+    margin-top: 0em;
+    margin-left: 0em;
+    margin-bottom: 0em;
+}
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd > :first-child {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+.sig dd {
+    margin-top: 0px;
+    margin-bottom: 0px;
+}
+
+.sig dl {
+    margin-top: 0px;
+    margin-bottom: 0px;
+}
+
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+    margin-bottom: 0;
+}
+
+dt:target, span.highlighted {
+    background-color: #fbe54e;
+}
+
+rect.highlighted {
+    fill: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+.footnote:target  {
+    background-color: #ffa;
+}
+
+.line-block {
+    display: block;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.line-block .line-block {
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+    font-family: sans-serif;
+}
+
+.accelerator {
+    text-decoration: underline;
+}
+
+.classifier {
+    font-style: oblique;
+}
+
+.classifier:before {
+    font-style: normal;
+    margin: 0 0.5em;
+    content: ":";
+    display: inline-block;
+}
+
+abbr, acronym {
+    border-bottom: dotted 1px;
+    cursor: help;
+}
+
+.translated {
+    background-color: rgba(207, 255, 207, 0.2)
+}
+
+.untranslated {
+    background-color: rgba(255, 207, 207, 0.2)
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+    overflow: auto;
+    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
+}
+
+pre, div[class*="highlight-"] {
+    clear: both;
+}
+
+span.pre {
+    -moz-hyphens: none;
+    -ms-hyphens: none;
+    -webkit-hyphens: none;
+    hyphens: none;
+    white-space: nowrap;
+}
+
+div[class*="highlight-"] {
+    margin: 1em 0;
+}
+
+td.linenos pre {
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    display: block;
+}
+
+table.highlighttable tbody {
+    display: block;
+}
+
+table.highlighttable tr {
+    display: flex;
+}
+
+table.highlighttable td {
+    margin: 0;
+    padding: 0;
+}
+
+table.highlighttable td.linenos {
+    padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+    flex: 1;
+    overflow: hidden;
+}
+
+.highlight .hll {
+    display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+    margin: 0;
+}
+
+div.code-block-caption + div {
+    margin-top: 0;
+}
+
+div.code-block-caption {
+    margin-top: 1em;
+    padding: 2px 5px;
+    font-size: small;
+}
+
+div.code-block-caption code {
+    background-color: transparent;
+}
+
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp {  /* gp: Generic.Prompt */
+  user-select: none;
+  -webkit-user-select: text; /* Safari fallback only */
+  -webkit-user-select: none; /* Chrome/Safari */
+  -moz-user-select: none; /* Firefox */
+  -ms-user-select: none; /* IE10+ */
+}
+
+div.code-block-caption span.caption-number {
+    padding: 0.1em 0.3em;
+    font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+    margin: 1em 0;
+}
+
+code.xref, a code {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+    background-color: transparent;
+}
+
+.viewcode-link {
+    float: right;
+}
+
+.viewcode-back {
+    float: right;
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    margin: -1px -10px;
+    padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+    vertical-align: middle;
+}
+
+div.body div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+span.eqno a.headerlink {
+    position: absolute;
+    z-index: 1;
+}
+
+div.math:hover a.headerlink {
+    visibility: visible;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0 !important;
+        width: 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    #top-link {
+        display: none;
+    }
+}
\ No newline at end of file
diff --git a/docs/sources/sdc-sphinx-theme/static/copybutton.js b/main/_static/copybutton.js
similarity index 100%
rename from docs/sources/sdc-sphinx-theme/static/copybutton.js
rename to main/_static/copybutton.js
diff --git a/main/_static/doctools.js b/main/_static/doctools.js
new file mode 100644
index 0000000..d06a71d
--- /dev/null
+++ b/main/_static/doctools.js
@@ -0,0 +1,156 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Base JavaScript utilities for all Sphinx HTML documentation.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
+  "TEXTAREA",
+  "INPUT",
+  "SELECT",
+  "BUTTON",
+]);
+
+const _ready = (callback) => {
+  if (document.readyState !== "loading") {
+    callback();
+  } else {
+    document.addEventListener("DOMContentLoaded", callback);
+  }
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const Documentation = {
+  init: () => {
+    Documentation.initDomainIndexTable();
+    Documentation.initOnKeyListeners();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS: {},
+  PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
+  LOCALE: "unknown",
+
+  // gettext and ngettext don't access this so that the functions
+  // can safely bound to a different name (_ = Documentation.gettext)
+  gettext: (string) => {
+    const translated = Documentation.TRANSLATIONS[string];
+    switch (typeof translated) {
+      case "undefined":
+        return string; // no translation
+      case "string":
+        return translated; // translation exists
+      default:
+        return translated[0]; // (singular, plural) translation tuple exists
+    }
+  },
+
+  ngettext: (singular, plural, n) => {
+    const translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated !== "undefined")
+      return translated[Documentation.PLURAL_EXPR(n)];
+    return n === 1 ? singular : plural;
+  },
+
+  addTranslations: (catalog) => {
+    Object.assign(Documentation.TRANSLATIONS, catalog.messages);
+    Documentation.PLURAL_EXPR = new Function(
+      "n",
+      `return (${catalog.plural_expr})`
+    );
+    Documentation.LOCALE = catalog.locale;
+  },
+
+  /**
+   * helper function to focus on search bar
+   */
+  focusSearchBar: () => {
+    document.querySelectorAll("input[name=q]")[0]?.focus();
+  },
+
+  /**
+   * Initialise the domain index toggle buttons
+   */
+  initDomainIndexTable: () => {
+    const toggler = (el) => {
+      const idNumber = el.id.substr(7);
+      const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
+      if (el.src.substr(-9) === "minus.png") {
+        el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
+        toggledRows.forEach((el) => (el.style.display = "none"));
+      } else {
+        el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
+        toggledRows.forEach((el) => (el.style.display = ""));
+      }
+    };
+
+    const togglerElements = document.querySelectorAll("img.toggler");
+    togglerElements.forEach((el) =>
+      el.addEventListener("click", (event) => toggler(event.currentTarget))
+    );
+    togglerElements.forEach((el) => (el.style.display = ""));
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
+  },
+
+  initOnKeyListeners: () => {
+    // only install a listener if it is really needed
+    if (
+      !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
+      !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
+    )
+      return;
+
+    document.addEventListener("keydown", (event) => {
+      // bail for input elements
+      if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+      // bail with special keys
+      if (event.altKey || event.ctrlKey || event.metaKey) return;
+
+      if (!event.shiftKey) {
+        switch (event.key) {
+          case "ArrowLeft":
+            if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+            const prevLink = document.querySelector('link[rel="prev"]');
+            if (prevLink && prevLink.href) {
+              window.location.href = prevLink.href;
+              event.preventDefault();
+            }
+            break;
+          case "ArrowRight":
+            if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+            const nextLink = document.querySelector('link[rel="next"]');
+            if (nextLink && nextLink.href) {
+              window.location.href = nextLink.href;
+              event.preventDefault();
+            }
+            break;
+        }
+      }
+
+      // some keyboard layouts may need Shift to get /
+      switch (event.key) {
+        case "/":
+          if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
+          Documentation.focusSearchBar();
+          event.preventDefault();
+      }
+    });
+  },
+};
+
+// quick alias for translations
+const _ = Documentation.gettext;
+
+_ready(Documentation.init);
diff --git a/main/_static/documentation_options.js b/main/_static/documentation_options.js
new file mode 100644
index 0000000..e21c068
--- /dev/null
+++ b/main/_static/documentation_options.js
@@ -0,0 +1,13 @@
+const DOCUMENTATION_OPTIONS = {
+    VERSION: '0.1',
+    LANGUAGE: 'en',
+    COLLAPSE_INDEX: false,
+    BUILDER: 'html',
+    FILE_SUFFIX: '.html',
+    LINK_SUFFIX: '.html',
+    HAS_SOURCE: true,
+    SOURCELINK_SUFFIX: '.txt',
+    NAVIGATION_WITH_KEYS: false,
+    SHOW_SEARCH_SUMMARY: true,
+    ENABLE_SEARCH_SHORTCUTS: true,
+};
\ No newline at end of file
diff --git a/main/_static/file.png b/main/_static/file.png
new file mode 100644
index 0000000..a858a41
Binary files /dev/null and b/main/_static/file.png differ
diff --git a/docs/sources/sdc-sphinx-theme/static/intel_logo.png b/main/_static/intel_logo.png
similarity index 100%
rename from docs/sources/sdc-sphinx-theme/static/intel_logo.png
rename to main/_static/intel_logo.png
diff --git a/main/_static/language_data.js b/main/_static/language_data.js
new file mode 100644
index 0000000..250f566
--- /dev/null
+++ b/main/_static/language_data.js
@@ -0,0 +1,199 @@
+/*
+ * language_data.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * This script contains the language-specific data used by searchtools.js,
+ * namely the list of stopwords, stemmer, scorer and splitter.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
+
+
+/* Non-minified version is copied as a separate JS file, is available */
+
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
diff --git a/main/_static/minus.png b/main/_static/minus.png
new file mode 100644
index 0000000..d96755f
Binary files /dev/null and b/main/_static/minus.png differ
diff --git a/main/_static/nbsphinx-broken-thumbnail.svg b/main/_static/nbsphinx-broken-thumbnail.svg
new file mode 100644
index 0000000..4919ca8
--- /dev/null
+++ b/main/_static/nbsphinx-broken-thumbnail.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+  <style>
+    svg { fill: lightcoral; }
+    @media (prefers-color-scheme: dark) {
+      svg { fill: crimson; }
+    }
+  </style>
+  <path d="m 80.856887,38.34474 h 2.903414 l 7.066397,13.332221 V 38.34474 h 2.092166 V 54.281494 H 90.01545 L 82.949053,40.949273 v 13.332221 h -2.092166 z m -13.812565,0 h 10.076555 v 1.814633 h -7.920343 v 4.718048 h 7.589439 v 1.814634 h -7.589439 v 5.774805 h 8.11248 v 1.814634 H 67.044322 Z m -14.335606,0 h 2.156212 v 6.735493 L 62.01672,38.34474 h 2.775323 l -7.909669,7.429324 8.475407,8.50743 h -2.839368 l -7.653485,-7.674833 v 7.674833 h -2.156212 z m -10.738365,1.462381 q -2.348349,0 -3.73601,1.750588 -1.376987,1.750588 -1.376987,4.771419 0,3.010158 1.376987,4.760746 1.387661,1.750587 3.73601,1.750587 2.34835,0 3.714663,-1.750587 1.376986,-1.750588 1.376986,-4.760746 0,-3.020831 -1.376986,-4.771419 -1.366313,-1.750588 -3.714663,-1.750588 z m 0,-1.750588 q 3.351736,0 5.358507,2.252281 2.006772,2.241606 2.006772,6.020314 0,3.768034 -2.006772,6.020315 -2.006771,2.241606 -5.358507,2.241606 -3.362409,0 -5.379855,-2.241606 -2.006772,-2.241607 -2.006772,-6.020315 0,-3.778708 2.006772,-6.020314 2.017446,-2.252281 5.379855,-2.252281 z m -14.100771,8.75294 q 0.693831,0.234835 1.344964,1.003385 0.661808,0.768551 1.323615,2.113515 l 2.188235,4.355121 H 30.410068 L 28.371273,50.193231 Q 27.581374,48.592083 26.834172,48.069042 26.097644,47.546 24.816726,47.546 h -2.34835 v 6.735494 H 20.312164 V 38.34474 h 4.867489 q 2.732625,0 4.077588,1.142152 1.344964,1.142151 1.344964,3.447804 0,1.505078 -0.704505,2.49779 -0.69383,0.992711 -2.02812,1.376987 z m -5.401204,-6.692797 v 5.657388 h 2.711277 q 1.55845,0 2.348349,-0.715179 0.800574,-0.725854 0.800574,-2.124189 0,-1.398336 -0.800574,-2.102841 -0.789899,-0.715179 -2.348349,-0.715179 z M 7.4709616,46.670707 v 5.838851 H 10.92944 q 1.739914,0 2.57251,-0.71518 0.843271,-0.725853 0.843271,-2.209583 0,-1.494404 -0.843271,-2.198909 -0.832596,-0.715179 -2.57251,-0.715179 z m 0,-6.554031 v 4.803443 h 3.1916204 q 1.579799,0 2.34835,-0.587088 0.779225,-0.597761 0.779225,-1.814634 0,-1.206197 -0.779225,-1.803959 -0.768551,-0.597762 -2.34835,-0.597762 z M 5.3147497,38.34474 h 5.5079473 q 2.465767,0 3.800057,1.024734 1.334289,1.024734 1.334289,2.914088 0,1.462382 -0.683156,2.327001 -0.683156,0.86462 -2.006772,1.078106 1.590474,0.341579 2.465768,1.430359 0.885968,1.078106 0.885968,2.700602 0,2.134863 -1.451707,3.298364 -1.451707,1.1635 -4.130961,1.1635 H 5.3147497 Z M 65.365328,74.550032 H 67.52154 V 88.67217 h 7.760238 v 1.814634 h -9.91645 z m -6.447298,0 h 2.156214 V 90.486804 H 58.91803 Z m -9.955303,2.124192 -2.924765,7.931025 h 5.860208 z m -1.216872,-2.124192 h 2.444423 l 6.073692,15.936772 h -2.241606 l -1.451709,-4.088268 h -7.183824 l -1.451707,4.088268 H 41.66149 Z m -21.264514,0 h 2.903417 L 36.45116,87.882271 V 74.550032 h 2.092171 V 90.486804 H 35.639914 L 28.573506,77.154569 v 13.332235 h -2.092165 z m 53.454813,-9.781663 v 5.838858 h 3.458479 q 1.739919,0 2.572513,-0.71518 0.843272,-0.725854 0.843272,-2.209586 0,-1.494406 -0.843272,-2.198912 -0.832594,-0.71518 -2.572513,-0.71518 z m 0,-6.554037 v 4.803447 h 3.191622 q 1.579803,0 2.348355,-0.587087 0.779225,-0.597763 0.779225,-1.814636 0,-1.206199 -0.779225,-1.803962 -0.768552,-0.597762 -2.348355,-0.597762 z m -2.156212,-1.771939 h 5.507949 q 2.465772,0 3.800065,1.024736 1.334288,1.024735 1.334288,2.914092 0,1.462383 -0.683157,2.327003 -0.683157,0.864621 -2.006771,1.078107 1.590471,0.341579 2.46577,1.43036 0.885967,1.078107 0.885967,2.700605 0,2.134866 -1.451708,3.298368 -1.451709,1.163502 -4.130963,1.163502 h -5.72144 z m -18.86154,0 h 3.212969 l 4.066921,10.845118 4.088269,-10.845118 H 73.49953 V 72.379166 H 71.396692 V 58.385121 L 67.287075,69.315634 H 65.120183 L 61.010567,58.385121 v 13.994045 h -2.092165 z m -16.246333,0 h 2.166892 v 9.681616 q 0,2.561839 0.928668,3.693318 0.928667,1.120804 3.010159,1.120804 2.070819,0 2.999486,-1.120804 0.928667,-1.131479 0.928667,-3.693318 v -9.681616 h 2.166886 v 9.948474 q 0,3.116904 -1.547776,4.70738 -1.537104,1.590474 -4.547263,1.590474 -3.020833,0 -4.568615,-1.590474 -1.537104,-1.590476 -1.537104,-4.70738 z m -16.192953,0 h 2.156213 v 6.532689 h 7.83496 v -6.532689 h 2.156213 v 15.936773 h -2.156213 v -7.589448 h -7.83496 v 7.589448 h -2.156213 z m -15.563168,0 h 13.481671 v 1.814636 H 18.740226 V 72.379166 H 16.573339 V 58.257029 h -5.657391 z" />
+</svg>
diff --git a/main/_static/nbsphinx-code-cells.css b/main/_static/nbsphinx-code-cells.css
new file mode 100644
index 0000000..a3fb27c
--- /dev/null
+++ b/main/_static/nbsphinx-code-cells.css
@@ -0,0 +1,259 @@
+/* remove conflicting styling from Sphinx themes */
+div.nbinput.container div.prompt *,
+div.nboutput.container div.prompt *,
+div.nbinput.container div.input_area pre,
+div.nboutput.container div.output_area pre,
+div.nbinput.container div.input_area .highlight,
+div.nboutput.container div.output_area .highlight {
+    border: none;
+    padding: 0;
+    margin: 0;
+    box-shadow: none;
+}
+
+div.nbinput.container > div[class*=highlight],
+div.nboutput.container > div[class*=highlight] {
+    margin: 0;
+}
+
+div.nbinput.container div.prompt *,
+div.nboutput.container div.prompt * {
+    background: none;
+}
+
+div.nboutput.container div.output_area .highlight,
+div.nboutput.container div.output_area pre {
+    background: unset;
+}
+
+div.nboutput.container div.output_area div.highlight {
+    color: unset;  /* override Pygments text color */
+}
+
+/* avoid gaps between output lines */
+div.nboutput.container div[class*=highlight] pre {
+    line-height: normal;
+}
+
+/* input/output containers */
+div.nbinput.container,
+div.nboutput.container {
+    display: -webkit-flex;
+    display: flex;
+    align-items: flex-start;
+    margin: 0;
+    width: 100%;
+}
+@media (max-width: 540px) {
+    div.nbinput.container,
+    div.nboutput.container {
+        flex-direction: column;
+    }
+}
+
+/* input container */
+div.nbinput.container {
+    padding-top: 5px;
+}
+
+/* last container */
+div.nblast.container {
+    padding-bottom: 5px;
+}
+
+/* input prompt */
+div.nbinput.container div.prompt pre,
+/* for sphinx_immaterial theme: */
+div.nbinput.container div.prompt pre > code {
+    color: #307FC1;
+}
+
+/* output prompt */
+div.nboutput.container div.prompt pre,
+/* for sphinx_immaterial theme: */
+div.nboutput.container div.prompt pre > code {
+    color: #BF5B3D;
+}
+
+/* all prompts */
+div.nbinput.container div.prompt,
+div.nboutput.container div.prompt {
+    width: 4.5ex;
+    padding-top: 5px;
+    position: relative;
+    user-select: none;
+}
+
+div.nbinput.container div.prompt > div,
+div.nboutput.container div.prompt > div {
+    position: absolute;
+    right: 0;
+    margin-right: 0.3ex;
+}
+
+@media (max-width: 540px) {
+    div.nbinput.container div.prompt,
+    div.nboutput.container div.prompt {
+        width: unset;
+        text-align: left;
+        padding: 0.4em;
+    }
+    div.nboutput.container div.prompt.empty {
+        padding: 0;
+    }
+
+    div.nbinput.container div.prompt > div,
+    div.nboutput.container div.prompt > div {
+        position: unset;
+    }
+}
+
+/* disable scrollbars and line breaks on prompts */
+div.nbinput.container div.prompt pre,
+div.nboutput.container div.prompt pre {
+    overflow: hidden;
+    white-space: pre;
+}
+
+/* input/output area */
+div.nbinput.container div.input_area,
+div.nboutput.container div.output_area {
+    -webkit-flex: 1;
+    flex: 1;
+    overflow: auto;
+}
+@media (max-width: 540px) {
+    div.nbinput.container div.input_area,
+    div.nboutput.container div.output_area {
+        width: 100%;
+    }
+}
+
+/* input area */
+div.nbinput.container div.input_area {
+    border: 1px solid #e0e0e0;
+    border-radius: 2px;
+    /*background: #f5f5f5;*/
+}
+
+/* override MathJax center alignment in output cells */
+div.nboutput.container div[class*=MathJax] {
+    text-align: left !important;
+}
+
+/* override sphinx.ext.imgmath center alignment in output cells */
+div.nboutput.container div.math p {
+    text-align: left;
+}
+
+/* standard error */
+div.nboutput.container div.output_area.stderr {
+    background: #fdd;
+}
+
+/* ANSI colors */
+.ansi-black-fg { color: #3E424D; }
+.ansi-black-bg { background-color: #3E424D; }
+.ansi-black-intense-fg { color: #282C36; }
+.ansi-black-intense-bg { background-color: #282C36; }
+.ansi-red-fg { color: #E75C58; }
+.ansi-red-bg { background-color: #E75C58; }
+.ansi-red-intense-fg { color: #B22B31; }
+.ansi-red-intense-bg { background-color: #B22B31; }
+.ansi-green-fg { color: #00A250; }
+.ansi-green-bg { background-color: #00A250; }
+.ansi-green-intense-fg { color: #007427; }
+.ansi-green-intense-bg { background-color: #007427; }
+.ansi-yellow-fg { color: #DDB62B; }
+.ansi-yellow-bg { background-color: #DDB62B; }
+.ansi-yellow-intense-fg { color: #B27D12; }
+.ansi-yellow-intense-bg { background-color: #B27D12; }
+.ansi-blue-fg { color: #208FFB; }
+.ansi-blue-bg { background-color: #208FFB; }
+.ansi-blue-intense-fg { color: #0065CA; }
+.ansi-blue-intense-bg { background-color: #0065CA; }
+.ansi-magenta-fg { color: #D160C4; }
+.ansi-magenta-bg { background-color: #D160C4; }
+.ansi-magenta-intense-fg { color: #A03196; }
+.ansi-magenta-intense-bg { background-color: #A03196; }
+.ansi-cyan-fg { color: #60C6C8; }
+.ansi-cyan-bg { background-color: #60C6C8; }
+.ansi-cyan-intense-fg { color: #258F8F; }
+.ansi-cyan-intense-bg { background-color: #258F8F; }
+.ansi-white-fg { color: #C5C1B4; }
+.ansi-white-bg { background-color: #C5C1B4; }
+.ansi-white-intense-fg { color: #A1A6B2; }
+.ansi-white-intense-bg { background-color: #A1A6B2; }
+
+.ansi-default-inverse-fg { color: #FFFFFF; }
+.ansi-default-inverse-bg { background-color: #000000; }
+
+.ansi-bold { font-weight: bold; }
+.ansi-underline { text-decoration: underline; }
+
+
+div.nbinput.container div.input_area div[class*=highlight] > pre,
+div.nboutput.container div.output_area div[class*=highlight] > pre,
+div.nboutput.container div.output_area div[class*=highlight].math,
+div.nboutput.container div.output_area.rendered_html,
+div.nboutput.container div.output_area > div.output_javascript,
+div.nboutput.container div.output_area:not(.rendered_html) > img{
+    padding: 5px;
+    margin: 0;
+}
+
+/* fix copybtn overflow problem in chromium (needed for 'sphinx_copybutton') */
+div.nbinput.container div.input_area > div[class^='highlight'],
+div.nboutput.container div.output_area > div[class^='highlight']{
+    overflow-y: hidden;
+}
+
+/* hide copy button on prompts for 'sphinx_copybutton' extension ... */
+.prompt .copybtn,
+/* ... and 'sphinx_immaterial' theme */
+.prompt .md-clipboard.md-icon {
+    display: none;
+}
+
+/* Some additional styling taken form the Jupyter notebook CSS */
+.jp-RenderedHTMLCommon table,
+div.rendered_html table {
+  border: none;
+  border-collapse: collapse;
+  border-spacing: 0;
+  color: black;
+  font-size: 12px;
+  table-layout: fixed;
+}
+.jp-RenderedHTMLCommon thead,
+div.rendered_html thead {
+  border-bottom: 1px solid black;
+  vertical-align: bottom;
+}
+.jp-RenderedHTMLCommon tr,
+.jp-RenderedHTMLCommon th,
+.jp-RenderedHTMLCommon td,
+div.rendered_html tr,
+div.rendered_html th,
+div.rendered_html td {
+  text-align: right;
+  vertical-align: middle;
+  padding: 0.5em 0.5em;
+  line-height: normal;
+  white-space: normal;
+  max-width: none;
+  border: none;
+}
+.jp-RenderedHTMLCommon th,
+div.rendered_html th {
+  font-weight: bold;
+}
+.jp-RenderedHTMLCommon tbody tr:nth-child(odd),
+div.rendered_html tbody tr:nth-child(odd) {
+  background: #f5f5f5;
+}
+.jp-RenderedHTMLCommon tbody tr:hover,
+div.rendered_html tbody tr:hover {
+  background: rgba(66, 165, 245, 0.2);
+}
+
diff --git a/main/_static/nbsphinx-gallery.css b/main/_static/nbsphinx-gallery.css
new file mode 100644
index 0000000..365c27a
--- /dev/null
+++ b/main/_static/nbsphinx-gallery.css
@@ -0,0 +1,31 @@
+.nbsphinx-gallery {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
+    gap: 5px;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.nbsphinx-gallery > a {
+    padding: 5px;
+    border: 1px dotted currentColor;
+    border-radius: 2px;
+    text-align: center;
+}
+
+.nbsphinx-gallery > a:hover {
+    border-style: solid;
+}
+
+.nbsphinx-gallery img {
+    max-width: 100%;
+    max-height: 100%;
+}
+
+.nbsphinx-gallery > a > div:first-child {
+    display: flex;
+    align-items: start;
+    justify-content: center;
+    height: 120px;
+    margin-bottom: 5px;
+}
diff --git a/main/_static/nbsphinx-no-thumbnail.svg b/main/_static/nbsphinx-no-thumbnail.svg
new file mode 100644
index 0000000..9dca758
--- /dev/null
+++ b/main/_static/nbsphinx-no-thumbnail.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+  <style>
+    svg { fill: #ccc; }
+    @media (prefers-color-scheme: dark) {
+      svg { fill: #999; }
+    }
+  </style>
+  <path d="M 65.365328,74.550032 H 67.52154 V 88.67217 h 7.760238 v 1.814634 h -9.91645 z m -6.447298,0 h 2.156214 V 90.486804 H 58.91803 Z m -9.955303,2.124192 -2.924765,7.931025 h 5.860208 z m -1.216872,-2.124192 h 2.444423 l 6.073692,15.936772 h -2.241606 l -1.451709,-4.088268 h -7.183824 l -1.451707,4.088268 H 41.66149 Z m -21.264514,0 h 2.903417 L 36.45116,87.882271 V 74.550032 h 2.092171 V 90.486804 H 35.639914 L 28.573506,77.154569 v 13.332235 h -2.092165 z m 53.454813,-9.781663 v 5.838858 h 3.458479 q 1.739919,0 2.572513,-0.71518 0.843272,-0.725854 0.843272,-2.209586 0,-1.494406 -0.843272,-2.198912 -0.832594,-0.71518 -2.572513,-0.71518 z m 0,-6.554037 v 4.803447 h 3.191622 q 1.579803,0 2.348355,-0.587087 0.779225,-0.597763 0.779225,-1.814636 0,-1.206199 -0.779225,-1.803962 -0.768552,-0.597762 -2.348355,-0.597762 z m -2.156212,-1.771939 h 5.507949 q 2.465772,0 3.800065,1.024736 1.334288,1.024735 1.334288,2.914092 0,1.462383 -0.683157,2.327003 -0.683157,0.864621 -2.006771,1.078107 1.590471,0.341579 2.46577,1.43036 0.885967,1.078107 0.885967,2.700605 0,2.134866 -1.451708,3.298368 -1.451709,1.163502 -4.130963,1.163502 h -5.72144 z m -18.86154,0 h 3.212969 l 4.066921,10.845118 4.088269,-10.845118 H 73.49953 V 72.379166 H 71.396692 V 58.385121 L 67.287075,69.315634 H 65.120183 L 61.010567,58.385121 v 13.994045 h -2.092165 z m -16.246333,0 h 2.166892 v 9.681616 q 0,2.561839 0.928668,3.693318 0.928667,1.120804 3.010159,1.120804 2.070819,0 2.999486,-1.120804 0.928667,-1.131479 0.928667,-3.693318 v -9.681616 h 2.166886 v 9.948474 q 0,3.116904 -1.547776,4.70738 -1.537104,1.590474 -4.547263,1.590474 -3.020833,0 -4.568615,-1.590474 -1.537104,-1.590476 -1.537104,-4.70738 z m -16.192953,0 h 2.156213 v 6.532689 h 7.83496 v -6.532689 h 2.156213 v 15.936773 h -2.156213 v -7.589448 h -7.83496 v 7.589448 h -2.156213 z m -15.563168,0 h 13.481671 v 1.814636 H 18.740226 V 72.379166 H 16.573339 V 58.257029 H 10.915948 Z M 65.497127,39.809967 q -2.34835,0 -3.736011,1.750588 -1.376987,1.750588 -1.376987,4.771419 0,3.010157 1.376987,4.760745 1.387661,1.750588 3.736011,1.750588 2.348349,0 3.714662,-1.750588 1.376986,-1.750588 1.376986,-4.760745 0,-3.020831 -1.376986,-4.771419 -1.366313,-1.750588 -3.714662,-1.750588 z m 0,-1.750588 q 3.351735,0 5.358506,2.252281 2.006772,2.241606 2.006772,6.020314 0,3.768034 -2.006772,6.020315 -2.006771,2.241606 -5.358506,2.241606 -3.36241,0 -5.379856,-2.241606 -2.006771,-2.241607 -2.006771,-6.020315 0,-3.778708 2.006771,-6.020314 2.017446,-2.252281 5.379856,-2.252281 z m -22.821688,0.288206 h 2.903414 L 52.64525,51.679807 V 38.347585 h 2.092166 V 54.28434 H 51.834001 L 44.767605,40.952119 V 54.28434 h -2.092166 z" />
+</svg>
diff --git a/main/_static/plus.png b/main/_static/plus.png
new file mode 100644
index 0000000..7107cec
Binary files /dev/null and b/main/_static/plus.png differ
diff --git a/main/_static/pygments.css b/main/_static/pygments.css
new file mode 100644
index 0000000..0d49244
--- /dev/null
+++ b/main/_static/pygments.css
@@ -0,0 +1,75 @@
+pre { line-height: 125%; }
+td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+.highlight .hll { background-color: #ffffcc }
+.highlight { background: #eeffcc; }
+.highlight .c { color: #408090; font-style: italic } /* Comment */
+.highlight .err { border: 1px solid #FF0000 } /* Error */
+.highlight .k { color: #007020; font-weight: bold } /* Keyword */
+.highlight .o { color: #666666 } /* Operator */
+.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #007020 } /* Comment.Preproc */
+.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
+.highlight .gd { color: #A00000 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+.highlight .gr { color: #FF0000 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #00A000 } /* Generic.Inserted */
+.highlight .go { color: #333333 } /* Generic.Output */
+.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #0044DD } /* Generic.Traceback */
+.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #007020 } /* Keyword.Pseudo */
+.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #902000 } /* Keyword.Type */
+.highlight .m { color: #208050 } /* Literal.Number */
+.highlight .s { color: #4070a0 } /* Literal.String */
+.highlight .na { color: #4070a0 } /* Name.Attribute */
+.highlight .nb { color: #007020 } /* Name.Builtin */
+.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.highlight .no { color: #60add5 } /* Name.Constant */
+.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.highlight .ne { color: #007020 } /* Name.Exception */
+.highlight .nf { color: #06287e } /* Name.Function */
+.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
+.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #bb60d5 } /* Name.Variable */
+.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mb { color: #208050 } /* Literal.Number.Bin */
+.highlight .mf { color: #208050 } /* Literal.Number.Float */
+.highlight .mh { color: #208050 } /* Literal.Number.Hex */
+.highlight .mi { color: #208050 } /* Literal.Number.Integer */
+.highlight .mo { color: #208050 } /* Literal.Number.Oct */
+.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
+.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
+.highlight .sc { color: #4070a0 } /* Literal.String.Char */
+.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
+.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
+.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
+.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.highlight .sx { color: #c65d09 } /* Literal.String.Other */
+.highlight .sr { color: #235388 } /* Literal.String.Regex */
+.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
+.highlight .ss { color: #517918 } /* Literal.String.Symbol */
+.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #06287e } /* Name.Function.Magic */
+.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
+.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
+.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
+.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
+.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/docs/sources/sdc-sphinx-theme/static/sdc.css b/main/_static/sdc.css
similarity index 100%
rename from docs/sources/sdc-sphinx-theme/static/sdc.css
rename to main/_static/sdc.css
diff --git a/docs/sources/sdc-sphinx-theme/static/sdc_email.png b/main/_static/sdc_email.png
similarity index 100%
rename from docs/sources/sdc-sphinx-theme/static/sdc_email.png
rename to main/_static/sdc_email.png
diff --git a/docs/sources/sdc-sphinx-theme/static/sdc_examples.png b/main/_static/sdc_examples.png
similarity index 100%
rename from docs/sources/sdc-sphinx-theme/static/sdc_examples.png
rename to main/_static/sdc_examples.png
diff --git a/docs/sources/sdc-sphinx-theme/static/sdc_github.png b/main/_static/sdc_github.png
similarity index 100%
rename from docs/sources/sdc-sphinx-theme/static/sdc_github.png
rename to main/_static/sdc_github.png
diff --git a/docs/sources/sdc-sphinx-theme/static/sdc_issues.png b/main/_static/sdc_issues.png
similarity index 100%
rename from docs/sources/sdc-sphinx-theme/static/sdc_issues.png
rename to main/_static/sdc_issues.png
diff --git a/main/_static/searchtools.js b/main/_static/searchtools.js
new file mode 100644
index 0000000..7918c3f
--- /dev/null
+++ b/main/_static/searchtools.js
@@ -0,0 +1,574 @@
+/*
+ * searchtools.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for the full-text search.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+/**
+ * Simple result scoring code.
+ */
+if (typeof Scorer === "undefined") {
+  var Scorer = {
+    // Implement the following function to further tweak the score for each result
+    // The function takes a result array [docname, title, anchor, descr, score, filename]
+    // and returns the new score.
+    /*
+    score: result => {
+      const [docname, title, anchor, descr, score, filename] = result
+      return score
+    },
+    */
+
+    // query matches the full name of an object
+    objNameMatch: 11,
+    // or matches in the last dotted part of the object name
+    objPartialMatch: 6,
+    // Additive scores depending on the priority of the object
+    objPrio: {
+      0: 15, // used to be importantResults
+      1: 5, // used to be objectResults
+      2: -5, // used to be unimportantResults
+    },
+    //  Used when the priority is not in the mapping.
+    objPrioDefault: 0,
+
+    // query found in title
+    title: 15,
+    partialTitle: 7,
+    // query found in terms
+    term: 5,
+    partialTerm: 2,
+  };
+}
+
+const _removeChildren = (element) => {
+  while (element && element.lastChild) element.removeChild(element.lastChild);
+};
+
+/**
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
+ */
+const _escapeRegExp = (string) =>
+  string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
+
+const _displayItem = (item, searchTerms, highlightTerms) => {
+  const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
+  const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
+  const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
+  const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
+  const contentRoot = document.documentElement.dataset.content_root;
+
+  const [docName, title, anchor, descr, score, _filename] = item;
+
+  let listItem = document.createElement("li");
+  let requestUrl;
+  let linkUrl;
+  if (docBuilder === "dirhtml") {
+    // dirhtml builder
+    let dirname = docName + "/";
+    if (dirname.match(/\/index\/$/))
+      dirname = dirname.substring(0, dirname.length - 6);
+    else if (dirname === "index/") dirname = "";
+    requestUrl = contentRoot + dirname;
+    linkUrl = requestUrl;
+  } else {
+    // normal html builders
+    requestUrl = contentRoot + docName + docFileSuffix;
+    linkUrl = docName + docLinkSuffix;
+  }
+  let linkEl = listItem.appendChild(document.createElement("a"));
+  linkEl.href = linkUrl + anchor;
+  linkEl.dataset.score = score;
+  linkEl.innerHTML = title;
+  if (descr) {
+    listItem.appendChild(document.createElement("span")).innerHTML =
+      " (" + descr + ")";
+    // highlight search terms in the description
+    if (SPHINX_HIGHLIGHT_ENABLED)  // set in sphinx_highlight.js
+      highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
+  }
+  else if (showSearchSummary)
+    fetch(requestUrl)
+      .then((responseData) => responseData.text())
+      .then((data) => {
+        if (data)
+          listItem.appendChild(
+            Search.makeSearchSummary(data, searchTerms)
+          );
+        // highlight search terms in the summary
+        if (SPHINX_HIGHLIGHT_ENABLED)  // set in sphinx_highlight.js
+          highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
+      });
+  Search.output.appendChild(listItem);
+};
+const _finishSearch = (resultCount) => {
+  Search.stopPulse();
+  Search.title.innerText = _("Search Results");
+  if (!resultCount)
+    Search.status.innerText = Documentation.gettext(
+      "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
+    );
+  else
+    Search.status.innerText = _(
+      `Search finished, found ${resultCount} page(s) matching the search query.`
+    );
+};
+const _displayNextItem = (
+  results,
+  resultCount,
+  searchTerms,
+  highlightTerms,
+) => {
+  // results left, load the summary and display it
+  // this is intended to be dynamic (don't sub resultsCount)
+  if (results.length) {
+    _displayItem(results.pop(), searchTerms, highlightTerms);
+    setTimeout(
+      () => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
+      5
+    );
+  }
+  // search finished, update title and status message
+  else _finishSearch(resultCount);
+};
+
+/**
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
+ * custom function per language.
+ *
+ * The regular expression works by splitting the string on consecutive characters
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
+ */
+if (typeof splitQuery === "undefined") {
+  var splitQuery = (query) => query
+      .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
+      .filter(term => term)  // remove remaining empty strings
+}
+
+/**
+ * Search Module
+ */
+const Search = {
+  _index: null,
+  _queued_query: null,
+  _pulse_status: -1,
+
+  htmlToText: (htmlString) => {
+    const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
+    htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
+    const docContent = htmlElement.querySelector('[role="main"]');
+    if (docContent !== undefined) return docContent.textContent;
+    console.warn(
+      "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
+    );
+    return "";
+  },
+
+  init: () => {
+    const query = new URLSearchParams(window.location.search).get("q");
+    document
+      .querySelectorAll('input[name="q"]')
+      .forEach((el) => (el.value = query));
+    if (query) Search.performSearch(query);
+  },
+
+  loadIndex: (url) =>
+    (document.body.appendChild(document.createElement("script")).src = url),
+
+  setIndex: (index) => {
+    Search._index = index;
+    if (Search._queued_query !== null) {
+      const query = Search._queued_query;
+      Search._queued_query = null;
+      Search.query(query);
+    }
+  },
+
+  hasIndex: () => Search._index !== null,
+
+  deferQuery: (query) => (Search._queued_query = query),
+
+  stopPulse: () => (Search._pulse_status = -1),
+
+  startPulse: () => {
+    if (Search._pulse_status >= 0) return;
+
+    const pulse = () => {
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      Search.dots.innerText = ".".repeat(Search._pulse_status);
+      if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
+    };
+    pulse();
+  },
+
+  /**
+   * perform a search for something (or wait until index is loaded)
+   */
+  performSearch: (query) => {
+    // create the required interface elements
+    const searchText = document.createElement("h2");
+    searchText.textContent = _("Searching");
+    const searchSummary = document.createElement("p");
+    searchSummary.classList.add("search-summary");
+    searchSummary.innerText = "";
+    const searchList = document.createElement("ul");
+    searchList.classList.add("search");
+
+    const out = document.getElementById("search-results");
+    Search.title = out.appendChild(searchText);
+    Search.dots = Search.title.appendChild(document.createElement("span"));
+    Search.status = out.appendChild(searchSummary);
+    Search.output = out.appendChild(searchList);
+
+    const searchProgress = document.getElementById("search-progress");
+    // Some themes don't use the search progress node
+    if (searchProgress) {
+      searchProgress.innerText = _("Preparing search...");
+    }
+    Search.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (Search.hasIndex()) Search.query(query);
+    else Search.deferQuery(query);
+  },
+
+  /**
+   * execute search (requires search index to be loaded)
+   */
+  query: (query) => {
+    const filenames = Search._index.filenames;
+    const docNames = Search._index.docnames;
+    const titles = Search._index.titles;
+    const allTitles = Search._index.alltitles;
+    const indexEntries = Search._index.indexentries;
+
+    // stem the search terms and add them to the correct list
+    const stemmer = new Stemmer();
+    const searchTerms = new Set();
+    const excludedTerms = new Set();
+    const highlightTerms = new Set();
+    const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
+    splitQuery(query.trim()).forEach((queryTerm) => {
+      const queryTermLower = queryTerm.toLowerCase();
+
+      // maybe skip this "word"
+      // stopwords array is from language_data.js
+      if (
+        stopwords.indexOf(queryTermLower) !== -1 ||
+        queryTerm.match(/^\d+$/)
+      )
+        return;
+
+      // stem the word
+      let word = stemmer.stemWord(queryTermLower);
+      // select the correct list
+      if (word[0] === "-") excludedTerms.add(word.substr(1));
+      else {
+        searchTerms.add(word);
+        highlightTerms.add(queryTermLower);
+      }
+    });
+
+    if (SPHINX_HIGHLIGHT_ENABLED) {  // set in sphinx_highlight.js
+      localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
+    }
+
+    // console.debug("SEARCH: searching for:");
+    // console.info("required: ", [...searchTerms]);
+    // console.info("excluded: ", [...excludedTerms]);
+
+    // array of [docname, title, anchor, descr, score, filename]
+    let results = [];
+    _removeChildren(document.getElementById("search-progress"));
+
+    const queryLower = query.toLowerCase();
+    for (const [title, foundTitles] of Object.entries(allTitles)) {
+      if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
+        for (const [file, id] of foundTitles) {
+          let score = Math.round(100 * queryLower.length / title.length)
+          results.push([
+            docNames[file],
+            titles[file] !== title ? `${titles[file]} > ${title}` : title,
+            id !== null ? "#" + id : "",
+            null,
+            score,
+            filenames[file],
+          ]);
+        }
+      }
+    }
+
+    // search for explicit entries in index directives
+    for (const [entry, foundEntries] of Object.entries(indexEntries)) {
+      if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
+        for (const [file, id] of foundEntries) {
+          let score = Math.round(100 * queryLower.length / entry.length)
+          results.push([
+            docNames[file],
+            titles[file],
+            id ? "#" + id : "",
+            null,
+            score,
+            filenames[file],
+          ]);
+        }
+      }
+    }
+
+    // lookup as object
+    objectTerms.forEach((term) =>
+      results.push(...Search.performObjectSearch(term, objectTerms))
+    );
+
+    // lookup as search terms in fulltext
+    results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
+
+    // let the scorer override scores with a custom scoring function
+    if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
+
+    // now sort the results by score (in opposite order of appearance, since the
+    // display function below uses pop() to retrieve items) and then
+    // alphabetically
+    results.sort((a, b) => {
+      const leftScore = a[4];
+      const rightScore = b[4];
+      if (leftScore === rightScore) {
+        // same score: sort alphabetically
+        const leftTitle = a[1].toLowerCase();
+        const rightTitle = b[1].toLowerCase();
+        if (leftTitle === rightTitle) return 0;
+        return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+      }
+      return leftScore > rightScore ? 1 : -1;
+    });
+
+    // remove duplicate search results
+    // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
+    let seen = new Set();
+    results = results.reverse().reduce((acc, result) => {
+      let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
+      if (!seen.has(resultStr)) {
+        acc.push(result);
+        seen.add(resultStr);
+      }
+      return acc;
+    }, []);
+
+    results = results.reverse();
+
+    // for debugging
+    //Search.lastresults = results.slice();  // a copy
+    // console.info("search results:", Search.lastresults);
+
+    // print the results
+    _displayNextItem(results, results.length, searchTerms, highlightTerms);
+  },
+
+  /**
+   * search for object names
+   */
+  performObjectSearch: (object, objectTerms) => {
+    const filenames = Search._index.filenames;
+    const docNames = Search._index.docnames;
+    const objects = Search._index.objects;
+    const objNames = Search._index.objnames;
+    const titles = Search._index.titles;
+
+    const results = [];
+
+    const objectSearchCallback = (prefix, match) => {
+      const name = match[4]
+      const fullname = (prefix ? prefix + "." : "") + name;
+      const fullnameLower = fullname.toLowerCase();
+      if (fullnameLower.indexOf(object) < 0) return;
+
+      let score = 0;
+      const parts = fullnameLower.split(".");
+
+      // check for different match types: exact matches of full name or
+      // "last name" (i.e. last dotted part)
+      if (fullnameLower === object || parts.slice(-1)[0] === object)
+        score += Scorer.objNameMatch;
+      else if (parts.slice(-1)[0].indexOf(object) > -1)
+        score += Scorer.objPartialMatch; // matches in last name
+
+      const objName = objNames[match[1]][2];
+      const title = titles[match[0]];
+
+      // If more than one term searched for, we require other words to be
+      // found in the name/title/description
+      const otherTerms = new Set(objectTerms);
+      otherTerms.delete(object);
+      if (otherTerms.size > 0) {
+        const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
+        if (
+          [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
+        )
+          return;
+      }
+
+      let anchor = match[3];
+      if (anchor === "") anchor = fullname;
+      else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
+
+      const descr = objName + _(", in ") + title;
+
+      // add custom score for some objects according to scorer
+      if (Scorer.objPrio.hasOwnProperty(match[2]))
+        score += Scorer.objPrio[match[2]];
+      else score += Scorer.objPrioDefault;
+
+      results.push([
+        docNames[match[0]],
+        fullname,
+        "#" + anchor,
+        descr,
+        score,
+        filenames[match[0]],
+      ]);
+    };
+    Object.keys(objects).forEach((prefix) =>
+      objects[prefix].forEach((array) =>
+        objectSearchCallback(prefix, array)
+      )
+    );
+    return results;
+  },
+
+  /**
+   * search for full-text terms in the index
+   */
+  performTermsSearch: (searchTerms, excludedTerms) => {
+    // prepare search
+    const terms = Search._index.terms;
+    const titleTerms = Search._index.titleterms;
+    const filenames = Search._index.filenames;
+    const docNames = Search._index.docnames;
+    const titles = Search._index.titles;
+
+    const scoreMap = new Map();
+    const fileMap = new Map();
+
+    // perform the search on the required terms
+    searchTerms.forEach((word) => {
+      const files = [];
+      const arr = [
+        { files: terms[word], score: Scorer.term },
+        { files: titleTerms[word], score: Scorer.title },
+      ];
+      // add support for partial matches
+      if (word.length > 2) {
+        const escapedWord = _escapeRegExp(word);
+        Object.keys(terms).forEach((term) => {
+          if (term.match(escapedWord) && !terms[word])
+            arr.push({ files: terms[term], score: Scorer.partialTerm });
+        });
+        Object.keys(titleTerms).forEach((term) => {
+          if (term.match(escapedWord) && !titleTerms[word])
+            arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
+        });
+      }
+
+      // no match but word was a required one
+      if (arr.every((record) => record.files === undefined)) return;
+
+      // found search word in contents
+      arr.forEach((record) => {
+        if (record.files === undefined) return;
+
+        let recordFiles = record.files;
+        if (recordFiles.length === undefined) recordFiles = [recordFiles];
+        files.push(...recordFiles);
+
+        // set score for the word in each file
+        recordFiles.forEach((file) => {
+          if (!scoreMap.has(file)) scoreMap.set(file, {});
+          scoreMap.get(file)[word] = record.score;
+        });
+      });
+
+      // create the mapping
+      files.forEach((file) => {
+        if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
+          fileMap.get(file).push(word);
+        else fileMap.set(file, [word]);
+      });
+    });
+
+    // now check if the files don't contain excluded terms
+    const results = [];
+    for (const [file, wordList] of fileMap) {
+      // check if all requirements are matched
+
+      // as search terms with length < 3 are discarded
+      const filteredTermCount = [...searchTerms].filter(
+        (term) => term.length > 2
+      ).length;
+      if (
+        wordList.length !== searchTerms.size &&
+        wordList.length !== filteredTermCount
+      )
+        continue;
+
+      // ensure that none of the excluded terms is in the search result
+      if (
+        [...excludedTerms].some(
+          (term) =>
+            terms[term] === file ||
+            titleTerms[term] === file ||
+            (terms[term] || []).includes(file) ||
+            (titleTerms[term] || []).includes(file)
+        )
+      )
+        break;
+
+      // select one (max) score for the file.
+      const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
+      // add result to the result list
+      results.push([
+        docNames[file],
+        titles[file],
+        "",
+        null,
+        score,
+        filenames[file],
+      ]);
+    }
+    return results;
+  },
+
+  /**
+   * helper function to return a node containing the
+   * search summary for a given text. keywords is a list
+   * of stemmed words.
+   */
+  makeSearchSummary: (htmlText, keywords) => {
+    const text = Search.htmlToText(htmlText);
+    if (text === "") return null;
+
+    const textLower = text.toLowerCase();
+    const actualStartPosition = [...keywords]
+      .map((k) => textLower.indexOf(k.toLowerCase()))
+      .filter((i) => i > -1)
+      .slice(-1)[0];
+    const startWithContext = Math.max(actualStartPosition - 120, 0);
+
+    const top = startWithContext === 0 ? "" : "...";
+    const tail = startWithContext + 240 < text.length ? "..." : "";
+
+    let summary = document.createElement("p");
+    summary.classList.add("context");
+    summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
+
+    return summary;
+  },
+};
+
+_ready(Search.init);
diff --git a/docs/sources/sdc-sphinx-theme/static/sidebar.js b/main/_static/sidebar.js
similarity index 100%
rename from docs/sources/sdc-sphinx-theme/static/sidebar.js
rename to main/_static/sidebar.js
diff --git a/main/_static/sphinx_highlight.js b/main/_static/sphinx_highlight.js
new file mode 100644
index 0000000..8a96c69
--- /dev/null
+++ b/main/_static/sphinx_highlight.js
@@ -0,0 +1,154 @@
+/* Highlighting utilities for Sphinx HTML documentation. */
+"use strict";
+
+const SPHINX_HIGHLIGHT_ENABLED = true
+
+/**
+ * highlight a given string on a node by wrapping it in
+ * span elements with the given class name.
+ */
+const _highlight = (node, addItems, text, className) => {
+  if (node.nodeType === Node.TEXT_NODE) {
+    const val = node.nodeValue;
+    const parent = node.parentNode;
+    const pos = val.toLowerCase().indexOf(text);
+    if (
+      pos >= 0 &&
+      !parent.classList.contains(className) &&
+      !parent.classList.contains("nohighlight")
+    ) {
+      let span;
+
+      const closestNode = parent.closest("body, svg, foreignObject");
+      const isInSVG = closestNode && closestNode.matches("svg");
+      if (isInSVG) {
+        span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+      } else {
+        span = document.createElement("span");
+        span.classList.add(className);
+      }
+
+      span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+      const rest = document.createTextNode(val.substr(pos + text.length));
+      parent.insertBefore(
+        span,
+        parent.insertBefore(
+          rest,
+          node.nextSibling
+        )
+      );
+      node.nodeValue = val.substr(0, pos);
+      /* There may be more occurrences of search term in this node. So call this
+       * function recursively on the remaining fragment.
+       */
+      _highlight(rest, addItems, text, className);
+
+      if (isInSVG) {
+        const rect = document.createElementNS(
+          "http://www.w3.org/2000/svg",
+          "rect"
+        );
+        const bbox = parent.getBBox();
+        rect.x.baseVal.value = bbox.x;
+        rect.y.baseVal.value = bbox.y;
+        rect.width.baseVal.value = bbox.width;
+        rect.height.baseVal.value = bbox.height;
+        rect.setAttribute("class", className);
+        addItems.push({ parent: parent, target: rect });
+      }
+    }
+  } else if (node.matches && !node.matches("button, select, textarea")) {
+    node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
+  }
+};
+const _highlightText = (thisNode, text, className) => {
+  let addItems = [];
+  _highlight(thisNode, addItems, text, className);
+  addItems.forEach((obj) =>
+    obj.parent.insertAdjacentElement("beforebegin", obj.target)
+  );
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const SphinxHighlight = {
+
+  /**
+   * highlight the search words provided in localstorage in the text
+   */
+  highlightSearchWords: () => {
+    if (!SPHINX_HIGHLIGHT_ENABLED) return;  // bail if no highlight
+
+    // get and clear terms from localstorage
+    const url = new URL(window.location);
+    const highlight =
+        localStorage.getItem("sphinx_highlight_terms")
+        || url.searchParams.get("highlight")
+        || "";
+    localStorage.removeItem("sphinx_highlight_terms")
+    url.searchParams.delete("highlight");
+    window.history.replaceState({}, "", url);
+
+    // get individual terms from highlight string
+    const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
+    if (terms.length === 0) return; // nothing to do
+
+    // There should never be more than one element matching "div.body"
+    const divBody = document.querySelectorAll("div.body");
+    const body = divBody.length ? divBody[0] : document.querySelector("body");
+    window.setTimeout(() => {
+      terms.forEach((term) => _highlightText(body, term, "highlighted"));
+    }, 10);
+
+    const searchBox = document.getElementById("searchbox");
+    if (searchBox === null) return;
+    searchBox.appendChild(
+      document
+        .createRange()
+        .createContextualFragment(
+          '<p class="highlight-link">' +
+            '<a href="javascript:SphinxHighlight.hideSearchWords()">' +
+            _("Hide Search Matches") +
+            "</a></p>"
+        )
+    );
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords: () => {
+    document
+      .querySelectorAll("#searchbox .highlight-link")
+      .forEach((el) => el.remove());
+    document
+      .querySelectorAll("span.highlighted")
+      .forEach((el) => el.classList.remove("highlighted"));
+    localStorage.removeItem("sphinx_highlight_terms")
+  },
+
+  initEscapeListener: () => {
+    // only install a listener if it is really needed
+    if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
+
+    document.addEventListener("keydown", (event) => {
+      // bail for input elements
+      if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+      // bail with special keys
+      if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
+      if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
+        SphinxHighlight.hideSearchWords();
+        event.preventDefault();
+      }
+    });
+  },
+};
+
+_ready(() => {
+  /* Do not call highlightSearchWords() when we are on the search page.
+   * It will highlight words from the *previous* search query.
+   */
+  if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
+  SphinxHighlight.initEscapeListener();
+});
diff --git a/main/benchmarks.html b/main/benchmarks.html
new file mode 100644
index 0000000..9f0b27f
--- /dev/null
+++ b/main/benchmarks.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Benchmarks &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Demos" href="demos.html" />
+    <link rel="prev" title="Jupyter Notebook 2: Falling back to NumPy" href="notebooks/02-dpnp_numpy_fallback.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="demos.html" title="Demos">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="notebooks/02-dpnp_numpy_fallback.html" title="Jupyter Notebook 2: Falling back to NumPy">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Benchmarks</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="benchmarks"></span><section id="id1">
+<h1>Benchmarks<a class="headerlink" href="#id1" title="Link to this heading">¶</a></h1>
+<p><strong>Data Parallel Extensions for Python</strong> provide a set of
+<a class="reference external" href="https://github.com/IntelPython/dpbench">benchmarks</a> illustrating different aspects of
+implementing the performant code with Data Parallel Extensions for Python.
+Benchmarks represent some real life numerical problem or some important part (kernel) of real life application.
+Each application/kernel is implemented in several variants (not necessarily all variants):</p>
+<ul class="simple">
+<li><p>Pure Python: Typically the slowest and used just as a reference implementation</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numpy</span></code>: Same application/kernel implemented using NumPy library</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">dpnp</span></code>: Modified numpy implementation to run on a specific device. You can use numpy as a baseline while evaluating the dpnp implementation and its performance</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba</span> <span class="pre">&#64;njit</span></code> array-style: application/kernel implemented using NumPy and compiled with Numba. You can use numpy as a baseline when evaluate numba &#64;njit array-style implementat and its performance</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba</span> <span class="pre">&#64;njit</span></code> direct loops (prange): Same application/kernel implemented using Numba compiler using direct loops. Sometimes array-style programming is cumbersome and performance inefficient. Using direct loop programming may lead to more readable and performance code. Thus, while evaluating the performance of direct loop implementation it is useful to compare array-style Numba implementation as a baseline</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-dpex</span> <span class="pre">&#64;dpjit</span></code> array-style: Modified numba &#64;njit array-style implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing numba-dpex implementation details and performance. You can also compare it against dpnp implementation to see how much extra performance numba-dpex can bring when you compile NumPy code for a given device</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-dpex</span> <span class="pre">&#64;dpjit</span></code> direct loops (prange): Modified numba &#64;njit direct loop implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing numba-dpex implementation details and performance. You can also compare it against dpnp implementation to see how much extra performance numba-dpex can bring when you compile NumPy code for a given device</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-dpex</span> <span class="pre">&#64;dpjit</span></code> kernel: Kernel-style programming, which is close to &#64;cuda.jit programming model used in vanilla Numba</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-mlir</span></code>: Array-style, direct loops and kernel-style implementations for experimental MLIR-based backend for Numba</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">cupy</span></code>: NumPy-like implementation using CuPy to run on CUDA-compatible devices</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">&#64;cuda.jit</span></code>: Kernel-style Numba implementation to run on CUDA-compatible devices</p></li>
+<li><p>Native SYCL: Most applications/kernels also have DPC++ implementation, which can be used to compare performance of above implementations to DPC++ compiled code.</p></li>
+</ul>
+<p>These benchmarks are implemented in <code class="docutils literal notranslate"><span class="pre">dpbench</span></code> framework, which allows you to run all or select benchmarks and variants to evaluate their performance on different hardware.</p>
+<p>For more details please refer to <code class="docutils literal notranslate"><span class="pre">dpbench</span></code>
+<a class="reference external" href="https://github.com/IntelPython/dpbench/blob/main/README.md">documentation</a>.</p>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="notebooks/02-dpnp_numpy_fallback.html"
+                          title="previous chapter">Jupyter Notebook 2: Falling back to NumPy</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="demos.html"
+                          title="next chapter">Demos</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/demos.html b/main/demos.html
new file mode 100644
index 0000000..9e59997
--- /dev/null
+++ b/main/demos.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Demos &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Useful links" href="useful_links.html" />
+    <link rel="prev" title="Benchmarks" href="benchmarks.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="useful_links.html" title="Useful links">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="benchmarks.html" title="Benchmarks">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Demos</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="demos"></span><section id="id1">
+<h1>Demos<a class="headerlink" href="#id1" title="Link to this heading">¶</a></h1>
+<p>There are several demo applications illustrating the power of the <strong>Data Parallel Extensions for Python</strong>. They are:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos/mcpi">Monte Carlo Pi</a>
+The Monte Carlo method to estimate the value of <span class="math notranslate nohighlight">\(\pi\)</span>.</p></li>
+<li><p><a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos/mandelbrot">Mandelbrot Set</a>
+Visualization of the breathtaking process of diving in the famous Mandelbrot fractal</p></li>
+<li><p><a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos/game-of-life">Game of Life</a>
+Visualization of the life evolution using famous Conway’s model</p></li>
+</ul>
+<p>All demos are located in the <a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos">GitHub repository</a>.
+For more details please refer to the documentation located in the individual demo directory.</p>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="benchmarks.html"
+                          title="previous chapter">Benchmarks</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="useful_links.html"
+                          title="next chapter">Useful links</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/examples.html b/main/examples.html
new file mode 100644
index 0000000..cf2e38d
--- /dev/null
+++ b/main/examples.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Examples &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Tutorials" href="jupyter_notebook.html" />
+    <link rel="prev" title="Programming with Data Parallel Extensions for Python" href="programming_dpep.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="#"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="jupyter_notebook.html" title="Tutorials">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="programming_dpep.html" title="Programming with Data Parallel Extensions for Python">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Examples</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="examples"></span><section id="id1">
+<h1>Examples<a class="headerlink" href="#id1" title="Link to this heading">¶</a></h1>
+<p>All examples are located in the <a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/examples">GitHub repository</a>.
+Their names start with the 2-digit number followed by a descriptive name.
+You can run examples in any order, however, if
+you are new to the Data Parallel Extensions for Python, it is recommended to go in the order examples are enumerated.</p>
+<p>The following command will run the very first example of using Data Parallel Extensions for Python</p>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">python ./examples/01-hello_dpnp.py</span>
+</pre></div>
+</div>
+<p>These are listings of these examples:</p>
+<div class="literal-block-wrapper docutils container" id="examples-01-hello-dpnp">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 01:</strong> Your first NumPy code running on GPU</span><a class="headerlink" href="#examples-01-hello-dpnp" title="Link to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="examples-02-dpnp-device">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 02:</strong> Select device type while creating array</span><a class="headerlink" href="#examples-02-dpnp-device" title="Link to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="examples-03-dpnp2numba-dpex">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 03:</strong> Compile dpnp code with numba-dpex</span><a class="headerlink" href="#examples-03-dpnp2numba-dpex" title="Link to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">from</span> <span class="nn">numba_dpex</span> <span class="kn">import</span> <span class="n">dpjit</span> <span class="k">as</span> <span class="n">njit</span>
+
+
+<span class="nd">@njit</span><span class="p">()</span>
+<span class="k">def</span> <span class="nf">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>  <span class="c1"># Device queue is inferred from x. The kernel is submitted to that queue</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="examples-04-dpctl-device-query">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 04:</strong> Get information about devices</span><a class="headerlink" href="#examples-04-dpctl-device-query" title="Link to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">()</span>  <span class="c1"># Print platform information</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;GPU devices:&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the list of all GPU devices</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;Number of GPU devices&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_num_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the number of GPU devices</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has CPU devices?&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">has_cpu_devices</span><span class="p">())</span>  <span class="c1"># Check if there are CPU devices</span>
+</pre></div>
+</div>
+</div>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="programming_dpep.html"
+                          title="previous chapter">Programming with Data Parallel Extensions for Python</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="jupyter_notebook.html"
+                          title="next chapter">Tutorials</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/genindex.html b/main/genindex.html
new file mode 100644
index 0000000..aa0885e
--- /dev/null
+++ b/main/genindex.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Index &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="#" />
+    <link rel="search" title="Search" href="search.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+       
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+
+<h1 id="index">Index</h1>
+
+<div class="genindex-jumpbox">
+ 
+</div>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/heterogeneous_computing.html b/main/heterogeneous_computing.html
new file mode 100644
index 0000000..23c4945
--- /dev/null
+++ b/main/heterogeneous_computing.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Heterogeneous Computing &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Programming with Data Parallel Extensions for Python" href="programming_dpep.html" />
+    <link rel="prev" title="Parallelism in Modern Data-Parallel Architectures" href="parallelism.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="programming_dpep.html" title="Programming with Data Parallel Extensions for Python">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="parallelism.html" title="Parallelism in Modern Data-Parallel Architectures">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Heterogeneous Computing</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="heterogeneous-computing"></span><section id="id1">
+<h1>Heterogeneous Computing<a class="headerlink" href="#id1" title="Link to this heading">¶</a></h1>
+<section id="device-offload">
+<h2>Device Offload<a class="headerlink" href="#device-offload" title="Link to this heading">¶</a></h2>
+<p>Python is an interpreted language, which implies that most of the Python script will run on CPU,
+and only a few data parallel regions will execute on data parallel devices.
+That is why the concept of the host and offload devices is helpful when it comes to conceptualizing
+a heterogeneous programming model in Python.</p>
+<a class="reference internal image-reference" href="_images/hetero-devices.png"><img alt="SIMD" class="align-center" src="_images/hetero-devices.png" style="width: 600px;" /></a>
+<p>The above diagram illustrates the <em>host</em> (the CPU which runs Python interpreter) and three <em>devices</em>
+(two GPU devices and one attached accelerator device). <strong>Data Parallel Extensions for Python</strong>
+offer a programming model where a script executed by Python interpreter on the host can <em>offload</em> data-parallel
+kernels to a user-specified device. A <em>kernel</em> is the <em>data-parallel region</em> of a program submitted
+for execution on the device. There can be multiple data-parallel regions, and hence multiple <em>offload kernels</em>.</p>
+<p>Kernels can be pre-compiled into a library, such as <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>, or directly coded
+in a programming language for heterogeneous computing, such as <a class="reference external" href="https://www.khronos.org/opencl/">OpenCl*</a> or <a class="reference external" href="https://www.apress.com/gp/book/9781484255735">DPC++</a> .
+<strong>Data Parallel Extensions for Python</strong> offer the way of writing kernels directly in Python
+using <a class="reference external" href="https://numba.pydata.org/">Numba*</a> compiler along with <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code>, the <a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a>.</p>
+<p>One or more kernels are submitted for execution into a <em>queue</em> targeting an <em>offload device</em>.
+For each device, you can create one or more queues. In most cases, you do not need to work
+with device queues directly. Data Parallel Extensions for Python will do necessary underlying
+work with queues for you through the <a class="reference internal" href="#compute-follows-data"><span class="std std-ref">Compute-Follows-Data</span></a>.</p>
+</section>
+<section id="unified-shared-memory">
+<h2>Unified Shared Memory<a class="headerlink" href="#unified-shared-memory" title="Link to this heading">¶</a></h2>
+<p>Each device has its memory, not necessarily accessible from another device.</p>
+<a class="reference internal image-reference" href="_images/hetero-devices.png"><img alt="SIMD" class="align-center" src="_images/hetero-devices.png" style="width: 600px;" /></a>
+<p>For example, <strong>Device 1</strong> memory may not be directly accessible from the host but accessible
+via expensive copying by a driver software. Similarly, depending on the architecture, direct data
+exchange between <strong>Device 2</strong> and <strong>Device 1</strong> may be only impossible possible via expensive
+copying through the host memory. These aspects must be taken into consideration when programming
+data parallel devices.</p>
+<p>On the illustration above the <strong>Device 2</strong> logically consists of two sub-devices: <strong>Sub-Device 1</strong>
+and <strong>Sub-Device 2</strong>. The programming model allows accessing <strong>Device 2</strong> as a single logical device, or
+by working with each individual sub-devices. For the former case a programmer needs to create
+a queue for <strong>Device 2</strong>. For the latter case a programmer needs to create 2 queues, one for each sub-device.</p>
+<p><a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> standard introduces a concept of the <em>Unified Shared Memory</em> (USM). USM requires hardware support
+for unified virtual address space, which allows coherency between the host and the device
+pointers. The host allocates all memory, but offers three distinct allocation types:</p>
+<ul class="simple">
+<li><p><strong>Host: located on the host, accessible by the host or device.</strong> This type of memory is useful in a situation
+when you need to stream read-only data from the host to the device once.</p></li>
+<li><p><strong>Device: located on the device, accessible by device only.</strong> The fastest type of memory.
+Useful in a situation when most of the data crunching happens on the device.</p></li>
+<li><p><strong>Shared: location is both host and device, accessible by the host and device</strong>.
+Shared allocations are useful when both host and device access data,
+since a user does not need to manage data migration explicitly.
+However, it is much slower than the USM Device memory type.</p></li>
+</ul>
+</section>
+<section id="compute-follows-data">
+<h2>Compute-Follows-Data<a class="headerlink" href="#compute-follows-data" title="Link to this heading">¶</a></h2>
+<p>Since data copying between devices is typically very expensive, for performance reasons it is essential
+to process data close to where it is allocated. This is the premise of the <em>Compute-Follows-Data</em> programming model,
+which states that the compute happens where the data resides. Tensors implemented in <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> and <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>
+carry information about allocation queues, and hence, about the device on which an array is allocated.
+Based on tensor input arguments of the offload kernel, it deduces the queue on which the execution happens.</p>
+<a class="reference internal image-reference" href="_images/kernel-queue-device.png"><img alt="SIMD" class="align-center" src="_images/kernel-queue-device.png" style="width: 600px;" /></a>
+<p>The picture above illustrates the <em>Compute-Follows-Data</em> concept. Arrays <code class="docutils literal notranslate"><span class="pre">A</span></code> and <code class="docutils literal notranslate"><span class="pre">B</span></code> are inputs to the
+<strong>Offload Kernel</strong>. These arrays carry information about their <em>allocation queue</em> (<strong>Device Queue</strong>) and the
+<em>device</em> (<strong>Device 1</strong>) where they were created. According to the Compute-Follows-Data paradigm
+the <strong>Offload Kernel</strong> will be submitted to this <strong>Device Queue</strong>, and the resulting array <code class="docutils literal notranslate"><span class="pre">C</span></code> will
+be created on the <strong>Device Queue</strong> associated with the <strong>Device 1</strong>.</p>
+<p><strong>Data Parallel Extensions for Python</strong> require all input tensor arguments to have the <strong>same</strong> allocation queue.
+Otherwise, an exception is thrown. For example, the following usages will result in an exception.</p>
+<figure class="align-center" id="id2">
+<a class="reference internal image-reference" href="_images/queue-exception1.png"><img alt="SIMD" src="_images/queue-exception1.png" style="width: 600px;" /></a>
+<figcaption>
+<p><span class="caption-text">Input tensors are on different devices and different queues. Exception is thrown.</span><a class="headerlink" href="#id2" title="Link to this image">¶</a></p>
+</figcaption>
+</figure>
+<figure class="align-center" id="id3">
+<a class="reference internal image-reference" href="_images/queue-exception2.png"><img alt="SIMD" src="_images/queue-exception2.png" style="width: 600px;" /></a>
+<figcaption>
+<p><span class="caption-text">Input tensors are on the same device, but queues are different. Exception is thrown.</span><a class="headerlink" href="#id3" title="Link to this image">¶</a></p>
+</figcaption>
+</figure>
+<figure class="align-center" id="id4">
+<a class="reference internal image-reference" href="_images/queue-exception3.png"><img alt="SIMD" src="_images/queue-exception3.png" style="width: 600px;" /></a>
+<figcaption>
+<p><span class="caption-text">Data belongs to the same device, but queues are different and associated with different sub-devices.</span><a class="headerlink" href="#id4" title="Link to this image">¶</a></p>
+</figcaption>
+</figure>
+</section>
+<section id="copying-data-between-devices-and-queues">
+<h2>Copying Data Between Devices and Queues<a class="headerlink" href="#copying-data-between-devices-and-queues" title="Link to this heading">¶</a></h2>
+<p><strong>Data Parallel Extensions for Python</strong> create <strong>one</strong> <em>canonical queue</em> per device. Normally,
+you do not need to directly manage queues. Having one canonical queue per device
+allows you to copy data between devices using the <code class="docutils literal notranslate"><span class="pre">to_device()</span></code> method:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a_new</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">to_device</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Array <code class="docutils literal notranslate"><span class="pre">a</span></code> is copied to the device associated with array <code class="docutils literal notranslate"><span class="pre">b</span></code> into the new array <code class="docutils literal notranslate"><span class="pre">a_new</span></code>.
+The same queue is associated with <code class="docutils literal notranslate"><span class="pre">b</span></code> and <code class="docutils literal notranslate"><span class="pre">a_new</span></code>.</p>
+<p>Alternatively, you can do this as follows:</p>
+<div class="literal-block-wrapper docutils container" id="id5">
+<div class="code-block-caption"><span class="caption-text">DPNP array</span><a class="headerlink" href="#id5" title="Link to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a_new</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="id6">
+<div class="code-block-caption"><span class="caption-text">DPCtl array</span><a class="headerlink" href="#id6" title="Link to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a_new</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">tensor</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+</section>
+<section id="creating-additional-queues">
+<h2>Creating Additional Queues<a class="headerlink" href="#creating-additional-queues" title="Link to this heading">¶</a></h2>
+<p>As said before, <strong>Data Parallel Extensions for Python</strong> automatically creates one canonical queue per device,
+and you normally work with this queue implicitly. However, you can always create as many additional queues per device
+as needed and work explicitly with them, for example, for profiling purposes.</p>
+<p>Read <a class="reference external" href="https://intelpython.github.io/dpctl/latest/index.html">Data Parallel Control</a> documentation for more details about queues.</p>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="parallelism.html"
+                          title="previous chapter">Parallelism in Modern Data-Parallel Architectures</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="programming_dpep.html"
+                          title="next chapter">Programming with Data Parallel Extensions for Python</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/index.html b/main/index.html
new file mode 100644
index 0000000..21f8d95
--- /dev/null
+++ b/main/index.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Data Parallel Extensions for Python &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Prerequisites and Installation" href="prerequisites_and_installation.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="#"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="prerequisites_and_installation.html" title="Prerequisites and Installation">
+	  next &raquo;
+	</a>
+      </li>
+      <li>
+	<a href="#">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+       
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="index"></span><a class="reference internal image-reference" href="_images/DPEP-large.png"><img alt="Data Parallel Extensions for Python" class="align-center" src="_images/DPEP-large.png" style="width: 400px;" /></a>
+<section id="data-parallel-extensions-for-python">
+<h1>Data Parallel Extensions for Python<a class="headerlink" href="#data-parallel-extensions-for-python" title="Link to this heading">¶</a></h1>
+<p>Data Parallel Extensions for Python* extend numerical Python capabilities beyond CPU and allow even higher performance
+gains on data parallel devices, such as GPUs. It consists of three foundational packages:</p>
+<ul class="simple">
+<li><p><strong>dpnp</strong> - Data Parallel Extensions for <a class="reference external" href="https://numpy.org/">Numpy*</a> - a library that implements a subset of
+Numpy that can be executed on any data parallel device. The subset is a drop-in replacement
+of core Numpy functions and numerical data types.</p></li>
+<li><p><strong>numba_dpex</strong> - Data Parallel Extensions for <a class="reference external" href="https://numba.pydata.org/">Numba*</a> - an extension for Numba compiler
+that lets you program data-parallel devices as you program CPU with Numba.</p></li>
+<li><p><strong>dpctl - Data Parallel Control library</strong> that provides utilities for device selection,
+allocation of data on devices, tensor data structure along with <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> implementation, and support for creation of user-defined data-parallel extensions.</p></li>
+</ul>
+<section id="table-of-contents">
+<h2>Table of Contents<a class="headerlink" href="#table-of-contents" title="Link to this heading">¶</a></h2>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="prerequisites_and_installation.html#device-drivers">1. Device Drivers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="prerequisites_and_installation.html#python-interpreter">2. Python Interpreter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="prerequisites_and_installation.html#data-parallel-extensions-for-python">3. Data Parallel Extensions for Python</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#device-offload">Device Offload</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#unified-shared-memory">Unified Shared Memory</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#compute-follows-data">Compute-Follows-Data</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#copying-data-between-devices-and-queues">Copying Data Between Devices and Queues</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#creating-additional-queues">Creating Additional Queues</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#scalars-vs-0-dimensional-arrays">Scalars vs. 0-Dimensional Arrays</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#data-parallel-extension-for-numpy-dpnp">Data Parallel Extension for Numpy - dpnp</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#data-parallel-extension-for-numba-numba-dpex">Data Parallel Extension for Numba - numba-dpex</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#data-parallel-control-dpctl">Data Parallel Control - dpctl</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#debugging-and-profiling-data-parallel-extensions-for-python">Debugging and Profiling Data Parallel Extensions for Python</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#writing-robust-numerical-codes-for-heterogeneous-computing">Writing Robust Numerical Codes for Heterogeneous Computing</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/01-get_started.html">Getting Started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+</div>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="prerequisites_and_installation.html"
+                          title="next chapter">Prerequisites and Installation</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/jupyter_notebook.html b/main/jupyter_notebook.html
new file mode 100644
index 0000000..de21aa6
--- /dev/null
+++ b/main/jupyter_notebook.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Tutorials &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python" href="notebooks/01-get_started.html" />
+    <link rel="prev" title="Examples" href="examples.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="notebooks/01-get_started.html" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="examples.html" title="Examples">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Tutorials</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="jupyter-notebook"></span><section id="tutorials">
+<h1>Tutorials<a class="headerlink" href="#tutorials" title="Link to this heading">¶</a></h1>
+<p>Getting started Jupyter* Notebooks illustrating the usage of <strong>Data Parallel Extensions for Python</strong> are located
+in the <a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/notebooks">GitHub repository</a></p>
+<p>To run the tutorial, in the command line prompt type:</p>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">jupyter notebook</span>
+</pre></div>
+</div>
+<p>This will print some information about the notebook server in your terminal, including the URL of
+the web application (by default, <code class="docutils literal notranslate"><span class="pre">http://localhost:8888</span></code>):</p>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>jupyter<span class="w"> </span>notebook
+<span class="go">[I 08:58:24.417 NotebookApp] Serving notebooks from local directory: /Users/catherine</span>
+<span class="go">[I 08:58:24.417 NotebookApp] 0 active kernels</span>
+<span class="go">[I 08:58:24.417 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/</span>
+<span class="go">[I 08:58:24.417 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).</span>
+<span class="go">It will then open your default web browser to this URL.</span>
+</pre></div>
+</div>
+<p>When the notebook opens in your browser, you will see the Notebook Dashboard,
+which will show a list of the notebooks, files, and subdirectories
+in the directory where the notebook server was started.
+Navigate to the notebook of your interest and open it in the dashboard.</p>
+<p>For more information please refer to <a class="reference external" href="https://docs.jupyter.org/en/latest/running.html">Jupyter documentation</a></p>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="notebooks/01-get_started.html">Getting Started</a></li>
+<li class="toctree-l1"><a class="reference internal" href="notebooks/02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+</ul>
+</div>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Tutorials</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/01-get_started.html">Getting Started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="examples.html"
+                          title="previous chapter">Examples</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="notebooks/01-get_started.html"
+                          title="next chapter">Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/notebooks/01-get_started.html b/main/notebooks/01-get_started.html
new file mode 100644
index 0000000..e1e3d6c
--- /dev/null
+++ b/main/notebooks/01-get_started.html
@@ -0,0 +1,472 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="../_static/sdc.css?v=8cc1021e" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
+    
+    <script src="../_static/documentation_options.js?v=2709fde1"></script>
+    <script src="../_static/doctools.js?v=888ff710"></script>
+    <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="../_static/sidebar.js"></script>
+    <script type="text/javascript" src="../_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" />
+    <link rel="next" title="Jupyter Notebook 2: Falling back to NumPy" href="02-dpnp_numpy_fallback.html" />
+    <link rel="prev" title="Tutorials" href="../jupyter_notebook.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="../other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="../index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="../examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="02-dpnp_numpy_fallback.html" title="Jupyter Notebook 2: Falling back to NumPy">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="../jupyter_notebook.html" title="Tutorials">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="../index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      <li><a href="../jupyter_notebook.html" accesskey="U">Tutorials</a> &#187;</li>
+      
+      <li>Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <section id="Jupyter-Notebook-1:-Getting-started-with-Data-Parallel-Extensions-for-Python">
+<h1>Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python<a class="headerlink" href="#Jupyter-Notebook-1:-Getting-started-with-Data-Parallel-Extensions-for-Python" title="Link to this heading">¶</a></h1>
+<p><img alt="cc54eb7cec074b4d817607443095401d" class="no-scaled-link" src="https://intelpython.github.io/DPEP/main/_images/DPEP-large.png" style="width: 300px;" /></p>
+<p><a class="reference external" href="https://intelpython.github.io/DPEP/main/">Data Parallel Extensions for Python</a> allow you to run NumPy-like code beyond CPU using <strong>Data Parallel Extension for NumPy</strong>. It will also allow you to compile the code using <strong>Data Parallel Extension for Numba</strong>.</p>
+<section id="Modifying-CPU-script-to-run-on-GPU">
+<h2>Modifying CPU script to run on GPU<a class="headerlink" href="#Modifying-CPU-script-to-run-on-GPU" title="Link to this heading">¶</a></h2>
+<p>In many cases the process of running Python on GPU is about making minor changes to your CPU script, which are: 1. Changing import statement(s) 2. Specifying on which device(s) the data is allocated 3. Explicitly copying data between devices and the host as needed</p>
+<p>We will illustrate these concepts on series of short examples. Let’s assume we have the following NumPy script originally written to run on CPU, which is nothing more than creating two matrices <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code> and performing matrix-matrix multiplication with <code class="docutils literal notranslate"><span class="pre">numpy.matmul()</span></code>, and prining the resulting matrix:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># CPU script for matrix-matrix multiplication using NumPy</span>
+
+<span class="c1"># 1. Import numpy</span>
+<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="c1"># 2. Create two matrices</span>
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+
+<span class="c1"># 3. Perform matrix-matrix multiplication</span>
+<span class="n">res</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">matmul</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
+
+<span class="c1"># 4. Print resulting matrix</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+[[2 2]
+ [2 2]]
+</pre></div></div>
+</div>
+<p>As stated before in many cases to run the same code on GPU is a trivial modification of a few lines of the code, like this:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Modified script to run the same code on GPU using dpnp</span>
+
+<span class="c1"># 1. Import dpnp</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>  <span class="c1"># Note, we changed the import statement. Since dpnp is a drop-in replacement of numpy the rest of the code will run lik regular numpy</span>
+
+<span class="c1"># 2. Create two matrices</span>
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+
+<span class="c1"># 3. Perform matrix-matrix multiplication</span>
+<span class="n">res</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">matmul</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
+
+<span class="c1"># 4. Print what&#39;s going on under the hood</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array y is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;res is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+[[2 2]
+ [2 2]]
+Array x is allocated on the device: Device(level_zero:gpu:0)
+Array y is allocated on the device: Device(level_zero:gpu:0)
+res is allocated on the device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+<p>Let’s see what we actually changed.</p>
+<ol class="arabic simple">
+<li><p>Obviously we changed the import statement. Now we import <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>, which is a drop-in replacement for a subset of <code class="docutils literal notranslate"><span class="pre">numpy</span></code> that extends numpy-like codes beyond CPU</p></li>
+<li><p>No change in matrix creation code. How does <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> know that matrices <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code> need to be allocated on GPU? This is because, if we do not specify the device explicitly, the driver will use the default device, which is GPU on systems with installed GPU drivers.</p></li>
+<li><p>No change in matrix multiplication code. This is because <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> programming model is the Compute-Follows-Data. It means that <code class="docutils literal notranslate"><span class="pre">dpnp.matmul()</span></code> determines which device will execute an operation based on where array inputs are allocated. Since our inputs <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code> are allocated on the default device (GPU) the matrix-matrix multiplication will follow data allocation and execute on GPU too.</p></li>
+<li><p>Note, arrays <code class="docutils literal notranslate"><span class="pre">x</span></code>, <code class="docutils literal notranslate"><span class="pre">y</span></code>, <code class="docutils literal notranslate"><span class="pre">res</span></code> all have the <code class="docutils literal notranslate"><span class="pre">device</span></code> attribute by printing which we make sure that all inputs are indeed on the GPU device, and the result is also on the GPU deivice. To be precise the data allocation (and execution) happened on GPU device 0 through Level-Zero driver.</p></li>
+</ol>
+</section>
+<section id="More-on-data-allocation-and-the-Compute-Follows-Data">
+<h2>More on data allocation and the Compute-Follows-Data<a class="headerlink" href="#More-on-data-allocation-and-the-Compute-Follows-Data" title="Link to this heading">¶</a></h2>
+<p>Sometimes you may want to be specific about the device type, not relying on the default behavior. You can do so by specifying the device in a keyword arguments for <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array creation functions and random number generators.</p>
+<div class="nbinput nblast docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="n">step</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<p><code class="docutils literal notranslate"><span class="pre">dpnp.arange()</span></code> is the array creation function that has optional keyword argument <code class="docutils literal notranslate"><span class="pre">device</span></code>, using which you can specify the device you want data to be allocated on with filter selector string. In our case the string specifies device type <code class="docutils literal notranslate"><span class="pre">&quot;gpu&quot;</span></code>. The proper way of handling situations when the specified device is not available would be as follows:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="n">step</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The a is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+    <span class="c1"># Do some fallback code</span>
+
+<span class="c1"># Do reduction on the selected device</span>
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Reduction sum y: &quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 75</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y.shape=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+The a is allocated on the device: Device(level_zero:gpu:0)
+Reduction sum y:  75
+Result y is located on the device: Device(level_zero:gpu:0)
+y.shape= ()
+</pre></div></div>
+</div>
+<p>Note that <code class="docutils literal notranslate"><span class="pre">y</span></code> is itself a device array (not a scalar!), its data resides on the same device as input array <code class="docutils literal notranslate"><span class="pre">a</span></code>.</p>
+<section id="Advanced-data-and-device-control-with-Data-Parallel-Control-library-dpctl">
+<h3>Advanced data and device control with Data Parallel Control library <code class="docutils literal notranslate"><span class="pre">dpctl</span></code><a class="headerlink" href="#Advanced-data-and-device-control-with-Data-Parallel-Control-library-dpctl" title="Link to this heading">¶</a></h3>
+<p>Data Parallel Control library, <code class="docutils literal notranslate"><span class="pre">dpctl</span></code>, among other things provide advanced capabilities for controling devices and data. Among its useful functions is <code class="docutils literal notranslate"><span class="pre">dpctl.lsplatform(verbosity)</span></code>, printing information about the list of available devices on the system with different levels of verbosity:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">()</span>  <span class="c1"># Print platform information</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Intel(R) OpenCL HD Graphics OpenCL 3.0
+Intel(R) Level-Zero 1.3
+</pre></div></div>
+</div>
+<p>Using a different verbosity setting to print extra meta-data:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>  <span class="c1"># Print platform information with verbocitz level 2 (highest level)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Platform  0 ::
+    Name        Intel(R) OpenCL HD Graphics
+    Version     OpenCL 3.0
+    Vendor      Intel(R) Corporation
+    Backend     opencl
+    Num Devices 1
+      # 0
+        Name                Intel(R) UHD Graphics 620
+        Version             31.0.101.2111
+        Filter string       opencl:gpu:0
+Platform  1 ::
+    Name        Intel(R) Level-Zero
+    Version     1.3
+    Vendor      Intel(R) Corporation
+    Backend     ext_oneapi_level_zero
+    Num Devices 1
+      # 0
+        Name                Intel(R) UHD Graphics 620
+        Version             1.3.0
+        Filter string       level_zero:gpu:0
+</pre></div></div>
+</div>
+<p>You can also query whether system has GPU devices and retrieve respective device objects:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="k">if</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">has_gpu_devices</span><span class="p">():</span>
+    <span class="n">devices</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s1">&#39;gpu&#39;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;This system has </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">devices</span><span class="p">)</span><span class="si">}</span><span class="s2"> GPUs&quot;</span><span class="p">)</span>
+    <span class="k">for</span> <span class="n">device</span> <span class="ow">in</span> <span class="n">devices</span><span class="p">:</span>
+        <span class="n">device</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span>
+
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="n">devices</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>  <span class="c1"># Another way of selecting on which device to allocate the data</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x is on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="k">else</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU devices are not available on this system&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+This system has 2 GPUs
+    Name            Intel(R) UHD Graphics 620
+    Driver version  31.0.101.2111
+    Vendor          Intel(R) Corporation
+    Filter string   opencl:gpu:0
+
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+Array x is on the device: Device(opencl:gpu:0)
+</pre></div></div>
+</div>
+<p>The following snapshot illustrates how to select the default GPU device using <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> and generate an array of random numbers on this device:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
+    <span class="n">gpu</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">select_gpu_device</span><span class="p">()</span>
+    <span class="n">gpu</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span> <span class="c1"># print GPU device information</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">gpu</span><span class="p">)</span>  <span class="c1"># Create array of random numbers on the default GPU device</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x.device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;No GPU devices available&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+Array x: [0.87253657 0.87415047 0.61092713 0.1395424  0.95248436]
+Array x.device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+<p>Or by creating GPU device object from the filter selector string:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[9]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">l0_gpu_0</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">SyclDevice</span><span class="p">(</span><span class="s2">&quot;level_zero:gpu:0&quot;</span><span class="p">)</span>
+    <span class="n">l0_gpu_0</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Cannot create the device object from a given filter selector string&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+</pre></div></div>
+</div>
+<p>The following snapshot checks whether a given device supports certain aspects, which may be important for the application, such as support for float64 (double precision) or the amount of available global memory on the device, etc.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">gpu</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">select_gpu_device</span><span class="p">()</span>
+    <span class="n">gpu</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has double precision:&quot;</span><span class="p">,</span> <span class="n">gpu</span><span class="o">.</span><span class="n">has_aspect_fp64</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has atomic operations support:&quot;</span><span class="p">,</span> <span class="n">gpu</span><span class="o">.</span><span class="n">has_aspect_atomic64</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Global memory size: </span><span class="si">{</span><span class="n">gpu</span><span class="o">.</span><span class="n">global_mem_size</span><span class="o">/</span><span class="mi">1024</span><span class="o">/</span><span class="mi">1024</span><span class="si">}</span><span class="s2"> MB&quot;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Global memory cache size: </span><span class="si">{</span><span class="n">gpu</span><span class="o">.</span><span class="n">global_mem_cache_size</span><span class="o">/</span><span class="mi">1024</span><span class="si">}</span><span class="s2"> KB&quot;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Maximum compute units: </span><span class="si">{</span><span class="n">gpu</span><span class="o">.</span><span class="n">max_compute_units</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The GPU device is not available&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+Has double precision: True
+Has atomic operations support: True
+Global memory size: 6284.109375 MB
+Global memory cache size: 512.0 KB
+Maximum compute units: 24
+</pre></div></div>
+</div>
+<p>For more information about <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> device selection please refer to <a class="reference external" href="https://intelpython.github.io/dpctl/latest/docfiles/user_guides/manual/dpctl/device_selection.html">Data Parallel Control: Device Selection</a></p>
+<p>For more information about <code class="docutils literal notranslate"><span class="pre">dpctl.SyclDevice</span></code> class methods and attributes please refer to <a class="reference external" href="https://intelpython.github.io/dpctl/latest/docfiles/dpctl/SyclDevice.html">Data Parallel Control: dpctl.SyclDevice</a></p>
+</section>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../examples.html">Examples</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../jupyter_notebook.html">Tutorials</a><ul class="current">
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Getting Started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="../jupyter_notebook.html"
+                          title="previous chapter">Tutorials</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="02-dpnp_numpy_fallback.html"
+                          title="next chapter">Jupyter Notebook 2: Falling back to NumPy</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/notebooks/.ipynb_checkpoints/01-get_started-checkpoint.ipynb b/main/notebooks/01-get_started.ipynb
similarity index 99%
rename from notebooks/.ipynb_checkpoints/01-get_started-checkpoint.ipynb
rename to main/notebooks/01-get_started.ipynb
index 452ca11..e0a970a 100644
--- a/notebooks/.ipynb_checkpoints/01-get_started-checkpoint.ipynb
+++ b/main/notebooks/01-get_started.ipynb
@@ -7,7 +7,7 @@
     "tags": []
    },
    "source": [
-    "# Getting started with Data Parallel Extensions for Python\n",
+    "# Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python\n",
     "<img src=\"https://intelpython.github.io/DPEP/main/_images/DPEP-large.png\" width=\"300\"/>\n",
     "\n",
     "[Data Parallel Extensions for Python](https://intelpython.github.io/DPEP/main/) allow you to run NumPy-like code beyond CPU using **Data Parallel Extension for NumPy**. It will also allow you to compile the code using **Data Parallel Extension for Numba**. "
diff --git a/main/notebooks/02-dpnp_numpy_fallback.html b/main/notebooks/02-dpnp_numpy_fallback.html
new file mode 100644
index 0000000..edf8ce9
--- /dev/null
+++ b/main/notebooks/02-dpnp_numpy_fallback.html
@@ -0,0 +1,286 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Jupyter Notebook 2: Falling back to NumPy &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="../_static/sdc.css?v=8cc1021e" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
+    
+    <script src="../_static/documentation_options.js?v=2709fde1"></script>
+    <script src="../_static/doctools.js?v=888ff710"></script>
+    <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="../_static/sidebar.js"></script>
+    <script type="text/javascript" src="../_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" />
+    <link rel="next" title="Benchmarks" href="../benchmarks.html" />
+    <link rel="prev" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python" href="01-get_started.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="../other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="../index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="../examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="../benchmarks.html" title="Benchmarks">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="01-get_started.html" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="../index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      <li><a href="../jupyter_notebook.html" accesskey="U">Tutorials</a> &#187;</li>
+      
+      <li>Jupyter Notebook 2: Falling back to NumPy</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <section id="Jupyter-Notebook-2:-Falling-back-to-NumPy">
+<h1>Jupyter Notebook 2: Falling back to NumPy<a class="headerlink" href="#Jupyter-Notebook-2:-Falling-back-to-NumPy" title="Link to this heading">¶</a></h1>
+<p><strong>Data Parallel Extensions for Python</strong> are still in active development and have not yet reached production quality. This in particular means that some functional and performance gaps may exist in certain <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> functions that require workarounds. The functional gaps include:</p>
+<ul class="simple">
+<li><p>Certain NumPy APIs are not supported. For complete reference please see the <a class="reference external" href="https://intelpython.github.io/dpnp/reference/comparison.html">comparison table</a> for <strong>Data Parallel Extension for NumPy</strong>.</p></li>
+<li><p>Limited support of <code class="docutils literal notranslate"><span class="pre">dtypes</span></code>. At present the <strong>Data Parallel Extension for NumPy</strong> supports <code class="docutils literal notranslate"><span class="pre">float32</span></code>, <code class="docutils literal notranslate"><span class="pre">float64</span></code>, <code class="docutils literal notranslate"><span class="pre">int32</span></code>, and <code class="docutils literal notranslate"><span class="pre">int64</span></code> types.</p></li>
+<li><p>Certain keyword arguments are supported for default settings only. Please refer to the <a class="reference external" href="https://intelpython.github.io/dpnp/reference/index.html">Data Parallel Extension for NumPy API Reference</a> for details.</p></li>
+</ul>
+<p>Since NumPy API is versatily there are typically some workaround options exist. Please refer to <a class="reference external" href="https://intelpython.github.io/dpnp/reference/index.html">Data Parallel Extension for NumPy API Reference</a> and <a class="reference external" href="https://numpy.org/doc/stable/">NumPy documentation</a> for hints for possible alternatives.</p>
+<p>Another possible workaround is to fall back to the host and execute the script via NumPy. This is a discouraged use because it typically results in significant performance penalties associated with copying data from the device to the host and back. However, for debugging purposes you may still want to enable this behavior.</p>
+<p>To do so you must set the <code class="docutils literal notranslate"><span class="pre">DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK</span></code> environment variable to <code class="docutils literal notranslate"><span class="pre">0</span></code>.</p>
+<p>Let’s take the following example:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span>
+<span class="kn">import</span> <span class="nn">numpy</span>
+
+<span class="n">N</span> <span class="o">=</span> <span class="mi">200</span><span class="o">*</span><span class="mi">100</span>
+
+<span class="c1"># Create an two dimencial array with singular element and array like option</span>
+<span class="n">a_np</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">like</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)))</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a_np</span><span class="p">)</span>
+<span class="n">a_dp</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">like</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)))</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a_dp</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+[[3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ ...
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]]
+</pre></div></div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+<span class="ansi-red-intense-fg ansi-bold">---------------------------------------------------------------------------</span>
+<span class="ansi-red-intense-fg ansi-bold">NotImplementedError</span>                       Traceback (most recent call last)
+Cell <span class="ansi-green-intense-fg ansi-bold">In[3], line 9</span>
+<span class="ansi-green-fg">      7</span> a_np <span style="color: rgb(98,98,98)">=</span> numpy<span style="color: rgb(98,98,98)">.</span>full((N, N), <span style="color: rgb(98,98,98)">3.</span>, like <span style="color: rgb(98,98,98)">=</span> numpy<span style="color: rgb(98,98,98)">.</span>zeros((N, <span style="color: rgb(98,98,98)">0</span>)))
+<span class="ansi-green-fg">      8</span> <span style="color: rgb(0,135,0)">print</span>(a_np)
+<span class="ansi-green-intense-fg ansi-bold">----&gt; 9</span> a_dp <span style="color: rgb(98,98,98)">=</span> <span class="ansi-yellow-bg">dpnp</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">full</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">N</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">N</span><span class="ansi-yellow-bg">)</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">3.</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">like</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">=</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">dpnp</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">zeros</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">N</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">0</span><span class="ansi-yellow-bg">)</span><span class="ansi-yellow-bg">)</span><span class="ansi-yellow-bg">)</span>
+<span class="ansi-green-fg">     10</span> <span style="color: rgb(0,135,0)">print</span>(a_dp)
+
+File <span class="ansi-green-intense-fg ansi-bold">~\AppData\Local\Continuum\miniconda3\envs\ndpex-examples\lib\site-packages\dpnp\dpnp_iface_arraycreation.py:747</span>, in <span class="ansi-cyan-fg">full</span><span class="ansi-blue-intense-fg ansi-bold">(shape, fill_value, dtype, order, like, device, usm_type, sycl_queue)</span>
+<span class="ansi-green-fg">    738</span> <span class="ansi-bold" style="color: rgb(0,135,0)">else</span>:
+<span class="ansi-green-fg">    739</span>     <span class="ansi-bold" style="color: rgb(0,135,0)">return</span> dpnp_container<span style="color: rgb(98,98,98)">.</span>full(shape,
+<span class="ansi-green-fg">    740</span>                                fill_value,
+<span class="ansi-green-fg">    741</span>                                dtype<span style="color: rgb(98,98,98)">=</span>dtype,
+<span class="ansi-green-intense-fg ansi-bold">   (...)</span>
+<span class="ansi-green-fg">    744</span>                                usm_type<span style="color: rgb(98,98,98)">=</span>usm_type,
+<span class="ansi-green-fg">    745</span>                                sycl_queue<span style="color: rgb(98,98,98)">=</span>sycl_queue)
+<span class="ansi-green-intense-fg ansi-bold">--&gt; 747</span> <span class="ansi-bold" style="color: rgb(0,135,0)">return</span> <span class="ansi-yellow-bg">call_origin</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">numpy</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">full</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">shape</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">fill_value</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">dtype</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">order</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">like</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">=</span><span class="ansi-yellow-bg">like</span><span class="ansi-yellow-bg">)</span>
+
+File <span class="ansi-green-intense-fg ansi-bold">dpnp\dpnp_utils\dpnp_algo_utils.pyx:132</span>, in <span class="ansi-cyan-fg">dpnp.dpnp_utils.dpnp_algo_utils.call_origin</span><span class="ansi-blue-intense-fg ansi-bold">()</span>
+
+<span class="ansi-red-intense-fg ansi-bold">NotImplementedError</span>: Requested funtion=full with args=((20000, 20000), 3.0, None, &#39;C&#39;) and kwargs={&#39;like&#39;: array([])} isn&#39;t currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception.
+</pre></div></div>
+</div>
+<p>We are attempting to call <code class="docutils literal notranslate"><span class="pre">dpnp.full()</span></code> function with the keyword argument <code class="docutils literal notranslate"><span class="pre">like</span></code> set to another <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array, which is currently unsupported. A possible alternative would be to use <code class="docutils literal notranslate"><span class="pre">dpnp.full_like</span></code> function:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">time</span>
+
+<span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
+<span class="n">a</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">full_like</span><span class="p">(</span><span class="n">dpnp</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">))</span>
+<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Elapsed </span><span class="si">{</span><span class="p">(</span><span class="n">time</span><span class="p">()</span><span class="o">-</span><span class="n">t</span><span class="p">)</span><span class="o">*</span><span class="mi">1000</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> ms&quot;</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array a is located on the device:&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Elapsed 1494.33 ms
+[[3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ ...
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]]
+Array a is located on the device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+<p>Now we enable <code class="docutils literal notranslate"><span class="pre">DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK</span></code> to fall back to NumPy in case of <code class="docutils literal notranslate"><span class="pre">NotImplementedError</span></code>.</p>
+<p><strong>Note: Restart Jupyter Notebook kernel before running the following code</strong></p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
+<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;0&quot;</span>
+
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK =&quot;</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">__DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK__</span><span class="p">)</span>  <span class="c1"># Expect 0</span>
+
+<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">time</span>
+
+<span class="n">N</span> <span class="o">=</span> <span class="mi">200</span><span class="o">*</span><span class="mi">100</span>
+
+<span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
+<span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">like</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)))</span>
+<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Elapsed </span><span class="si">{</span><span class="p">(</span><span class="n">time</span><span class="p">()</span><span class="o">-</span><span class="n">t</span><span class="p">)</span><span class="o">*</span><span class="mi">1000</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> ms&quot;</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array a is located on the device:&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK = 0
+Elapsed 2231.62 ms
+[[3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ ...
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]]
+Array a is located on the device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../examples.html">Examples</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../jupyter_notebook.html">Tutorials</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="01-get_started.html">Getting Started</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Controlling `dpnp` fallback to `numpy`</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="01-get_started.html"
+                          title="previous chapter">Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="../benchmarks.html"
+                          title="next chapter">Benchmarks</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/notebooks/02-dpnp_numpy_fallback.ipynb b/main/notebooks/02-dpnp_numpy_fallback.ipynb
similarity index 100%
rename from notebooks/02-dpnp_numpy_fallback.ipynb
rename to main/notebooks/02-dpnp_numpy_fallback.ipynb
diff --git a/main/notebooks/dpep_scalability_journey_example-pairwise_distance.html b/main/notebooks/dpep_scalability_journey_example-pairwise_distance.html
new file mode 100644
index 0000000..ffb8c47
--- /dev/null
+++ b/main/notebooks/dpep_scalability_journey_example-pairwise_distance.html
@@ -0,0 +1,406 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="../">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Pairwise Distance: Open-Source XPU Programming with Data Parallel Extensions for Python* language &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="../_static/sdc.css?v=8cc1021e" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
+    
+    <script src="../_static/documentation_options.js?v=2709fde1"></script>
+    <script src="../_static/doctools.js?v=888ff710"></script>
+    <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="../_static/sidebar.js"></script>
+    <script type="text/javascript" src="../_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="../other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="../index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="../examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li>
+	<a href="../index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+       
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <section id="Pairwise-Distance:-Open-Source-XPU-Programming-with-Data-Parallel-Extensions-for-Python*-language">
+<h1>Pairwise Distance: Open-Source XPU Programming with Data Parallel Extensions for Python* language<a class="headerlink" href="#Pairwise-Distance:-Open-Source-XPU-Programming-with-Data-Parallel-Extensions-for-Python*-language" title="Link to this heading">¶</a></h1>
+<div class="nbinput nblast docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[21]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># SPDX-FileCopyrightText: 2020 - 2023 Intel Corporation</span>
+<span class="c1">#</span>
+<span class="c1"># SPDX-License-Identifier: Apache-2.0</span>
+</pre></div>
+</div>
+</div>
+<p>In this notebook, learn how to compute pairwise distance, a very popular distance metric applicable in many applications such as machine learning, geospatial, biology, HPC, and so on.</p>
+<p>This tutorial will cover how Data Parallel Extension for NumPy* and Data Parallel Extension for Numba* can be used to compute pairwise distance in NumPy* code efficiently and scale performance through open-source heterogenous computing and DPC++/SYCL compilation.</p>
+<section id="Simple-NumPy-Script">
+<h2>Simple NumPy Script<a class="headerlink" href="#Simple-NumPy-Script" title="Link to this heading">¶</a></h2>
+<p>Here is a simple NumPy* script running pairwise distance on CPU - this is a normal NumPy script without any Data Parallel Extensions for Python* language (dpep) products included. We are using Intel® Optimizations for NumPy* for out-of-box acceleration powered by Intel® oneAPI Math Kernel Library optimizations. This can be downloaded via Anaconda using the command <code class="docutils literal notranslate"><span class="pre">conda</span> <span class="pre">install</span> <span class="pre">-c</span> <span class="pre">intel</span> <span class="pre">numpy</span></code> or as part of <a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/distribution-for-python.html">Intel® Distribution for
+Python*</a>.</p>
+<p>We will also record the time it takes to compute pariwise distance with this script for performance purposes.</p>
+<div class="nbinput nblast docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">warnings</span>
+<span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">import</span> <span class="nn">time</span>
+
+<span class="c1">#compute pairwise distance</span>
+<span class="k">def</span> <span class="nf">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">):</span>
+    <span class="n">data_sqr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">square</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="n">dtype</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">T</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+    <span class="n">distance</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">2</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">distance</span><span class="p">,</span> <span class="n">data_sqr</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">data_sqr</span><span class="o">.</span><span class="n">size</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">distance</span><span class="p">)</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">distance</span><span class="p">,</span> <span class="n">data_sqr</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">distance</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+
+<span class="n">data</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">ranf</span><span class="p">((</span><span class="mi">10</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span><span class="mi">3</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+<span class="n">distance</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+
+
+<span class="c1">#time pairwise distance calculations</span>
+<span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
+<span class="n">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Time to Compute Pairwise Distance with Stock NumPy on CPU:&quot;</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span>
+<br/></pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Time to Compute Pairwise Distance with Stock NumPy on CPU: 2.764047861099243
+</pre></div></div>
+</div>
+</section>
+<section id="Data-Parallel-Extension-for-NumPy*-Running-on-CPU-for-Additional-Speed-Up">
+<h2>Data Parallel Extension for NumPy* Running on CPU for Additional Speed-Up<a class="headerlink" href="#Data-Parallel-Extension-for-NumPy*-Running-on-CPU-for-Additional-Speed-Up" title="Link to this heading">¶</a></h2>
+<p>Now let’s convert this script into a Data Parallel Extension for NumPy* (dpnp) Script that can be run on any SYCL-supported device (CPU, GPU, etc) by a simple import statement change.</p>
+<p>Instead of <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">numpy</span> <span class="pre">as</span> <span class="pre">np</span></code>, let’s replace this statement with <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">dpnp</span> <span class="pre">as</span> <span class="pre">np</span></code>. That is the only change required!</p>
+<p>The script will run on a Intel GPU SYCL-device by default, if available, so we will specify <code class="docutils literal notranslate"><span class="pre">&quot;cpu&quot;</span></code> as the device for the arrays in order to run on a Intel® Xeon 4th Generation CPU. Even though it is running on CPU like NumPy, it has SYCL and oneAPI optimizations underneath it to give it more performance.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[11]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1">#using dpnp to allow heterogenous computing of NumPy!</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="c1">#import numpy as np</span>
+
+<span class="kn">import</span> <span class="nn">time</span>
+
+<span class="c1">#compute pairwise distance</span>
+<span class="k">def</span> <span class="nf">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">):</span>
+    <span class="n">data_sqr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">square</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="n">dtype</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="c1">#specify cpu as the device</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">T</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+    <span class="n">distance</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">2</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">distance</span><span class="p">,</span> <span class="n">data_sqr</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">data_sqr</span><span class="o">.</span><span class="n">size</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">distance</span><span class="p">)</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">distance</span><span class="p">,</span> <span class="n">data_sqr</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">distance</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+
+<span class="c1">#specify CPU device type to run on CPU</span>
+<span class="n">data</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">ranf</span><span class="p">((</span><span class="mi">10</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="n">device</span> <span class="o">=</span> <span class="s2">&quot;cpu&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+<span class="n">distance</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">,</span> <span class="n">device</span> <span class="o">=</span> <span class="s2">&quot;cpu&quot;</span><span class="p">)</span>
+
+
+<span class="c1">#do compilation of kernel first run, we will calculate performance on subsequent runs</span>
+<span class="n">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+<span class="c1">#time pairwise distance calculations</span>
+<span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
+<span class="n">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Time to Compute Pairwise Distance with DPNP on CPU:&quot;</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Time to Compute Pairwise Distance with DPNP on CPU: 0.2046055793762207
+</pre></div></div>
+</div>
+<p>We already see some speedup just by using DPNP on CPU!</p>
+</section>
+<section id="Data-Parallel-Extension-for-NumPy*-Running-on-Intel-GPU">
+<h2>Data Parallel Extension for NumPy* Running on Intel GPU<a class="headerlink" href="#Data-Parallel-Extension-for-NumPy*-Running-on-Intel-GPU" title="Link to this heading">¶</a></h2>
+<p>Now instead of running this script on Intel CPU, let’s run it on a Intel® Data Center GPU Max Series GPU. Since dpnp will use a Intel GPUS SYCL-device by device if it’s available, we can remove the device parameter from our calls.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[14]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1">#using dpnp to allow heterogenous computing of NumPy!</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="c1">#import numpy as np</span>
+
+<span class="kn">import</span> <span class="nn">time</span>
+
+<span class="c1">#compute pairwise distance</span>
+<span class="k">def</span> <span class="nf">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">):</span>
+    <span class="n">data_sqr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">square</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="n">dtype</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="c1">#specify cpu as the device</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">T</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+    <span class="n">distance</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">2</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">distance</span><span class="p">,</span> <span class="n">data_sqr</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">data_sqr</span><span class="o">.</span><span class="n">size</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">distance</span><span class="p">)</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">distance</span><span class="p">,</span> <span class="n">data_sqr</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+    <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">distance</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+
+<span class="c1">#no device specification necessary, by default it will run on Intel GPU SYCL-device if available</span>
+<span class="n">data</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">ranf</span><span class="p">((</span><span class="mi">10</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span><span class="mi">3</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+<span class="n">distance</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+
+
+<span class="c1">#do compilation of kernel first run, we will calculate performance on subsequent runs</span>
+<span class="n">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+<span class="c1">#time pairwise distance calculations</span>
+<span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
+<span class="n">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Time to Compute Pairwise Distance with DPNP on GPU:&quot;</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Time to Compute Pairwise Distance with DPNP on GPU: 0.012220144271850586
+</pre></div></div>
+</div>
+<p>Look at that great speedup! All done by a line of code to allow heterogenous computing.</p>
+<p>You can specify the device that you would like to execute on if you have a preferred device. See more in the <a class="reference external" href="https://intelpython.github.io/dpnp/">dpnp documentation</a>.</p>
+</section>
+<section id="Data-Parallel-Extension-for-Numba*-Enhanced-DPNP-Script-for-Further-Performance-and-Compilation-on-Intel-GPU">
+<h2>Data Parallel Extension for Numba* Enhanced DPNP Script for Further Performance and Compilation on Intel GPU<a class="headerlink" href="#Data-Parallel-Extension-for-Numba*-Enhanced-DPNP-Script-for-Further-Performance-and-Compilation-on-Intel-GPU" title="Link to this heading">¶</a></h2>
+</section>
+<section id="Numba-Performance-Gains-Made-Easy-on-any-SYCL-device">
+<h2>Numba Performance Gains Made Easy on any SYCL device<a class="headerlink" href="#Numba-Performance-Gains-Made-Easy-on-any-SYCL-device" title="Link to this heading">¶</a></h2>
+<p>With Data Parallel Extension for Numba* (numba-dpex), you can now run Python code with the Numba-JIT compiler to take advantage of these optimizations on any SYCL device, including Intel GPU!</p>
+<p>Let’s try it out with the <code class="docutils literal notranslate"><span class="pre">&#64;dpjit</span></code> function decorator, similar to the Numba <code class="docutils literal notranslate"><span class="pre">&#64;jit</span></code> decorator in allowing JIT compilation but on any SYCL device rather than just CPU.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[15]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">from</span> <span class="nn">numba</span> <span class="kn">import</span> <span class="n">prange</span>
+<span class="kn">from</span> <span class="nn">numba_dpex</span> <span class="kn">import</span> <span class="n">dpjit</span>
+<span class="kn">import</span> <span class="nn">time</span>
+
+<span class="nd">@dpjit</span> <span class="c1">#using Numba JIT compiler optimizations, now on any SYCL device</span>
+<span class="k">def</span> <span class="nf">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">):</span>
+    <span class="n">float0</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">dtype</span><span class="o">.</span><span class="n">type</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+
+    <span class="c1">#prange used for parallel loops for further opt</span>
+    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">prange</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
+        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
+            <span class="n">d</span> <span class="o">=</span> <span class="n">float0</span>
+            <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]):</span>
+                <span class="n">d</span> <span class="o">+=</span> <span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">k</span><span class="p">]</span> <span class="o">-</span> <span class="n">data</span><span class="p">[</span><span class="n">j</span><span class="p">,</span> <span class="n">k</span><span class="p">])</span><span class="o">**</span><span class="mi">2</span>
+
+            <span class="n">distance</span><span class="p">[</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+
+<span class="n">data</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">ranf</span><span class="p">((</span><span class="mi">10</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span><span class="mi">3</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+<span class="n">distance</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+
+<span class="c1">#do compilation first run, we will calculate performance on subsequent runs</span>
+<span class="c1">#wrapper consistent with previous np and dpnp scripts</span>
+<span class="n">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+
+<span class="c1">#time pairwise distance calculations</span>
+<span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
+<span class="n">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Time to Compute Pairwise Distance with DPNP and Numba-DPEX on GPU:&quot;</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Time to Compute Pairwise Distance with DPNP and Numba-DPEX on GPU: 0.007500171661376953
+</pre></div></div>
+</div>
+<p>Wow, even more speedup than in our previous DPNP script from compilation optimizations and SYCL!</p>
+<section id="For-advanced-programmers:-SYCL-Programming-Made-Simple-by-Data-Parallel-Extension-for-Numba*">
+<h3>For advanced programmers: SYCL Programming Made Simple by Data Parallel Extension for Numba*<a class="headerlink" href="#For-advanced-programmers:-SYCL-Programming-Made-Simple-by-Data-Parallel-Extension-for-Numba*" title="Link to this heading">¶</a></h3>
+<p>For more advanced programmers, Python developers may want to take advantage of Numba-JIT optimizations and write efficient kernel functions for even more speed-up with DPNP scripts.</p>
+<p>Now you can write SYCL kernels directly with the <code class="docutils literal notranslate"><span class="pre">&#64;dpex.kernel</span></code> function decorator to use DPC++ SYCL run-time and compilation for near-native speed. No DPC++ SYCL language coding required!</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[16]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">import</span> <span class="nn">numba_dpex</span> <span class="k">as</span> <span class="nn">dpex</span>
+<span class="kn">import</span> <span class="nn">time</span>
+
+<span class="c1"># kernel programming similar to Numba&#39;s cuda.jit sub-module</span>
+<span class="c1"># API modeled after SYCL lanaguage and uses the DPC++ run-time</span>
+<span class="nd">@dpex</span><span class="o">.</span><span class="n">kernel</span>
+<span class="k">def</span> <span class="nf">_pairwise_distance_kernel</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">):</span>
+    <span class="n">i</span> <span class="o">=</span> <span class="n">dpex</span><span class="o">.</span><span class="n">get_global_id</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+    <span class="n">j</span> <span class="o">=</span> <span class="n">dpex</span><span class="o">.</span><span class="n">get_global_id</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+
+    <span class="n">data_dims</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+
+    <span class="n">d</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">dtype</span><span class="o">.</span><span class="n">type</span><span class="p">(</span><span class="mf">0.0</span><span class="p">)</span>
+    <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">data_dims</span><span class="p">):</span>
+        <span class="n">tmp</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">k</span><span class="p">]</span> <span class="o">-</span> <span class="n">data</span><span class="p">[</span><span class="n">j</span><span class="p">,</span> <span class="n">k</span><span class="p">]</span>
+        <span class="n">d</span> <span class="o">+=</span> <span class="n">tmp</span> <span class="o">*</span> <span class="n">tmp</span>
+
+    <span class="n">distance</span><span class="p">[</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+
+<span class="c1"># for this example, let&#39;s put the kernel we just wrote in a wrapper to call it for consistency with our previous scipts</span>
+<span class="c1"># you can call the kernel directly as well</span>
+<span class="k">def</span> <span class="nf">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">):</span>
+    <span class="n">_pairwise_distance_kernel</span><span class="p">[</span><span class="n">dpex</span><span class="o">.</span><span class="n">Range</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])](</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+
+
+<span class="n">data</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">ranf</span><span class="p">((</span><span class="mi">10</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span><span class="mi">3</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+<span class="n">distance</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">data</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+
+
+<span class="c1">#do compilation first run, we will calculate performance on subsequent runs</span>
+<span class="c1">#wrapper consistent with previous np and dpnp scripts</span>
+<span class="n">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+
+<span class="c1"># alternatively, call kernel directly without wrapper:</span>
+<span class="c1">#_pairwise_distance_kernel[dpex.Range(data.shape[0], data.shape[0])](data, distance)</span>
+
+<span class="c1">#time pairwise distance calculations</span>
+<span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
+<span class="n">pairwise_distance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Time to Compute Pairwise Distance with DPNP and Numba-DPEX written SYCL Kernel on GPU:&quot;</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Time to Compute Pairwise Distance with DPNP and Numba-DPEX written SYCL Kernel on GPU: 0.005505800247192383
+</pre></div></div>
+</div>
+</section>
+</section>
+<section id="For-more-information-on-Data-Parallel-Extensions-for-Python*-language,-please-visit:">
+<h2>For more information on Data Parallel Extensions for Python* language, please visit:<a class="headerlink" href="#For-more-information-on-Data-Parallel-Extensions-for-Python*-language,-please-visit:" title="Link to this heading">¶</a></h2>
+<ul class="simple">
+<li><p><a class="reference external" href="https://intelpython.github.io/DPEP/main/">Data Parallel Extensions for Python* language (dpep) Website</a></p></li>
+<li><p><a class="reference external" href="https://intelpython.github.io/dpnp/">Data Parallel Extension for NumPy* (dpnp) Documentation</a></p></li>
+<li><p><a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba* (numba-dpex) Documentation</a></p></li>
+<li><p><a class="reference external" href="https://intelpython.github.io/dpctl/latest/index.html">Data Parallel Control (dpctl) Documentation</a></p></li>
+</ul>
+<p>For support: <a class="reference external" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python">Intel Machine Learning and Data Analytics Support Forum</a></p>
+<div class="nbinput nblast docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[ ]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span>
+</pre></div>
+</div>
+</div>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/notebooks/dpep_scalability_journey_example-pairwise_distance.ipynb b/main/notebooks/dpep_scalability_journey_example-pairwise_distance.ipynb
new file mode 100644
index 0000000..da48c95
--- /dev/null
+++ b/main/notebooks/dpep_scalability_journey_example-pairwise_distance.ipynb
@@ -0,0 +1,441 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "9a5db442-1e0d-42d6-8d1c-c50808f2fabf",
+   "metadata": {},
+   "source": [
+    "# Pairwise Distance: Open-Source XPU Programming with Data Parallel Extensions for Python* language"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "id": "ecfe8042-d9dc-4d74-adad-a4b6103113d6",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# SPDX-FileCopyrightText: 2020 - 2023 Intel Corporation\n",
+    "#\n",
+    "# SPDX-License-Identifier: Apache-2.0"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "fe38f7a4-ad5f-4b9a-bac4-6aa023f2ba06",
+   "metadata": {},
+   "source": [
+    "In this notebook, learn how to compute pairwise distance, a very popular distance metric applicable in many applications such as machine learning, geospatial, biology, HPC, and so on. \n",
+    "\n",
+    "This tutorial will cover how Data Parallel Extension for NumPy* and Data Parallel Extension for Numba* can be used to compute pairwise distance in NumPy* code efficiently and scale performance through open-source heterogenous computing and DPC++/SYCL compilation."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "88a670af-8d6c-4df0-9c53-26ff63e56760",
+   "metadata": {},
+   "source": [
+    "## Simple NumPy Script"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c3ffc2f5-4d3a-49d9-86db-46697d94e532",
+   "metadata": {},
+   "source": [
+    "Here is a simple NumPy* script running pairwise distance on CPU - this is a normal NumPy script without any Data Parallel Extensions for Python* language (dpep) products included. \n",
+    " We are using Intel® Optimizations for NumPy* for out-of-box acceleration powered by Intel® oneAPI Math Kernel Library optimizations. This can be downloaded via Anaconda using the command `conda install -c intel numpy` or as part of [Intel® Distribution for Python*](https://www.intel.com/content/www/us/en/developer/tools/oneapi/distribution-for-python.html). \n",
+    "\n",
+    "We will also record the time it takes to compute pariwise distance with this script for performance purposes."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "b7a89df0-7e71-4fcb-8e4e-358ef6790ca0",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import warnings\n",
+    "warnings.filterwarnings(\"ignore\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "161d3106-e5e2-459e-9699-2d607e563f9b",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Time to Compute Pairwise Distance with Stock NumPy on CPU: 2.764047861099243\n"
+     ]
+    }
+   ],
+   "source": [
+    "import numpy as np\n",
+    "import time\n",
+    "\n",
+    "#compute pairwise distance\n",
+    "def pairwise_distance(data, distance):\n",
+    "    data_sqr = np.sum(np.square(data), dtype = np.float32, axis=1)\n",
+    "    np.dot(data, data.T, distance)\n",
+    "    distance *= -2\n",
+    "    np.add(distance, data_sqr.reshape(data_sqr.size, 1), distance)\n",
+    "    np.add(distance, data_sqr, distance)\n",
+    "    np.sqrt(distance, distance)\n",
+    "\n",
+    "data = np.random.ranf((10*1024,3)).astype(np.float32)\n",
+    "distance = np.empty(shape=(data.shape[0], data.shape[0]), dtype=np.float32)\n",
+    "\n",
+    "\n",
+    "#time pairwise distance calculations\n",
+    "start = time.time()\n",
+    "pairwise_distance(data, distance)\n",
+    "print(\"Time to Compute Pairwise Distance with Stock NumPy on CPU:\", time.time() - start)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8126c45f-a863-42f5-b589-7b4e006eca96",
+   "metadata": {},
+   "source": [
+    "## Data Parallel Extension for NumPy* Running on CPU for Additional Speed-Up"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3dd0c2fa-590c-4f0a-95b6-7e32561934de",
+   "metadata": {},
+   "source": [
+    "Now let's convert this script into a Data Parallel Extension for NumPy* (dpnp) Script that can be run on any SYCL-supported device (CPU, GPU, etc) by a simple import statement change. \n",
+    "\n",
+    "Instead of `import numpy as np`, let's replace this statement with `import dpnp as np`. That is the only change required!\n",
+    "\n",
+    "The script will run on a Intel GPU SYCL-device by default, if available, so we will specify `\"cpu\"` as the device for the arrays in order to run on a Intel® Xeon 4th Generation CPU. Even though it is running on CPU like NumPy, it has SYCL and oneAPI optimizations underneath it to give it more performance."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "id": "72373f34-d925-4326-b3f3-8d4451cc3586",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Time to Compute Pairwise Distance with DPNP on CPU: 0.2046055793762207\n"
+     ]
+    }
+   ],
+   "source": [
+    "#using dpnp to allow heterogenous computing of NumPy!\n",
+    "import dpnp as np \n",
+    "#import numpy as np\n",
+    "\n",
+    "import time\n",
+    "\n",
+    "#compute pairwise distance\n",
+    "def pairwise_distance(data, distance):\n",
+    "    data_sqr = np.sum(np.square(data), dtype = np.float32, axis=1) #specify cpu as the device\n",
+    "    np.dot(data, data.T, distance)\n",
+    "    distance *= -2\n",
+    "    np.add(distance, data_sqr.reshape(data_sqr.size, 1), distance)\n",
+    "    np.add(distance, data_sqr, distance)\n",
+    "    np.sqrt(distance, distance)\n",
+    "    \n",
+    "#specify CPU device type to run on CPU\n",
+    "data = np.random.ranf((10*1024,3), device = \"cpu\").astype(np.float32)\n",
+    "distance = np.empty(shape=(data.shape[0], data.shape[0]), dtype=np.float32, device = \"cpu\")\n",
+    "\n",
+    "\n",
+    "#do compilation of kernel first run, we will calculate performance on subsequent runs\n",
+    "pairwise_distance(data, distance)\n",
+    "#time pairwise distance calculations\n",
+    "start = time.time()\n",
+    "pairwise_distance(data, distance)\n",
+    "print(\"Time to Compute Pairwise Distance with DPNP on CPU:\", time.time() - start)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6264484d-2cc1-482d-949c-8a12b994fc93",
+   "metadata": {},
+   "source": [
+    "We already see some speedup just by using DPNP on CPU!"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b1c25cfa-0d13-4e04-8053-d98376414b09",
+   "metadata": {},
+   "source": [
+    "## Data Parallel Extension for NumPy* Running on Intel GPU"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7ce6099a-be10-493c-925a-839591c2c4aa",
+   "metadata": {},
+   "source": [
+    "Now instead of running this script on Intel CPU, let's run it on a Intel® Data Center GPU Max Series GPU. Since dpnp will use a Intel GPUS SYCL-device by device if it's available, we can remove the device parameter from our calls."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "id": "e4843868-d044-4a05-9cca-1327486c2a62",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Time to Compute Pairwise Distance with DPNP on GPU: 0.012220144271850586\n"
+     ]
+    }
+   ],
+   "source": [
+    "#using dpnp to allow heterogenous computing of NumPy!\n",
+    "import dpnp as np \n",
+    "#import numpy as np\n",
+    "\n",
+    "import time\n",
+    "\n",
+    "#compute pairwise distance\n",
+    "def pairwise_distance(data, distance):\n",
+    "    data_sqr = np.sum(np.square(data), dtype = np.float32, axis=1) #specify cpu as the device\n",
+    "    np.dot(data, data.T, distance)\n",
+    "    distance *= -2\n",
+    "    np.add(distance, data_sqr.reshape(data_sqr.size, 1), distance)\n",
+    "    np.add(distance, data_sqr, distance)\n",
+    "    np.sqrt(distance, distance)\n",
+    "\n",
+    "#no device specification necessary, by default it will run on Intel GPU SYCL-device if available\n",
+    "data = np.random.ranf((10*1024,3)).astype(np.float32)\n",
+    "distance = np.empty(shape=(data.shape[0], data.shape[0]), dtype=np.float32)\n",
+    "\n",
+    "\n",
+    "#do compilation of kernel first run, we will calculate performance on subsequent runs\n",
+    "pairwise_distance(data, distance)\n",
+    "#time pairwise distance calculations\n",
+    "start = time.time()\n",
+    "pairwise_distance(data, distance)\n",
+    "print(\"Time to Compute Pairwise Distance with DPNP on GPU:\", time.time() - start)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "fdaa94a8-330d-42a8-9e05-45c7fc02250d",
+   "metadata": {},
+   "source": [
+    "Look at that great speedup! All done by a line of code to allow heterogenous computing. \n",
+    "\n",
+    "You can specify the device that you would like to execute on if you have a preferred device. See more in the [dpnp documentation](https://intelpython.github.io/dpnp/)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e0eb30c5-a79b-4e30-aa02-4337dc92d5df",
+   "metadata": {},
+   "source": [
+    "## Data Parallel Extension for Numba* Enhanced DPNP Script for Further Performance and Compilation on Intel GPU"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "19540dfe-149b-4199-a803-0418aee2b24d",
+   "metadata": {},
+   "source": [
+    "## Numba Performance Gains Made Easy on any SYCL device"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "40b86fda-a9b3-4683-94d9-84df3a556889",
+   "metadata": {},
+   "source": [
+    "With Data Parallel Extension for Numba* (numba-dpex), you can now run Python code with the Numba-JIT compiler to take advantage of these optimizations on any SYCL device, including Intel GPU! \n",
+    "\n",
+    "Let's try it out with the `@dpjit` function decorator, similar to the Numba `@jit` decorator in allowing JIT compilation but on any SYCL device rather than just CPU."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "id": "fc1ac4a2-3250-44cb-92cf-a484aae39da0",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Time to Compute Pairwise Distance with DPNP and Numba-DPEX on GPU: 0.007500171661376953\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpnp as np\n",
+    "from numba import prange\n",
+    "from numba_dpex import dpjit\n",
+    "import time\n",
+    "\n",
+    "@dpjit #using Numba JIT compiler optimizations, now on any SYCL device\n",
+    "def pairwise_distance(data, distance):\n",
+    "    float0 = data.dtype.type(0)\n",
+    "\n",
+    "    #prange used for parallel loops for further opt\n",
+    "    for i in prange(data.shape[0]):\n",
+    "        for j in range(data.shape[0]):\n",
+    "            d = float0\n",
+    "            for k in range(data.shape[1]):\n",
+    "                d += (data[i, k] - data[j, k])**2\n",
+    "\n",
+    "            distance[j, i] = np.sqrt(d)\n",
+    "\n",
+    "data = np.random.ranf((10*1024,3)).astype(np.float32)\n",
+    "distance = np.empty(shape=(data.shape[0], data.shape[0]), dtype=np.float32)\n",
+    "\n",
+    "#do compilation first run, we will calculate performance on subsequent runs\n",
+    "#wrapper consistent with previous np and dpnp scripts\n",
+    "pairwise_distance(data, distance)\n",
+    "\n",
+    "#time pairwise distance calculations\n",
+    "start = time.time()\n",
+    "pairwise_distance(data, distance)\n",
+    "print(\"Time to Compute Pairwise Distance with DPNP and Numba-DPEX on GPU:\", time.time() - start)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4ae08f4f-c272-4ecc-95f6-c1a6a068237d",
+   "metadata": {},
+   "source": [
+    "Wow, even more speedup than in our previous DPNP script from compilation optimizations and SYCL!"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "484b0db2-bf77-4c13-bb24-fef643159b67",
+   "metadata": {},
+   "source": [
+    "### For advanced programmers: SYCL Programming Made Simple by Data Parallel Extension for Numba*"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5956296a-36a0-4e61-9400-9559b0a5138b",
+   "metadata": {},
+   "source": [
+    "For more advanced programmers, Python developers may want to take advantage of Numba-JIT optimizations and write efficient kernel functions for even more speed-up with  DPNP scripts. \n",
+    "\n",
+    "Now you can write SYCL kernels directly with the `@dpex.kernel` function decorator to use DPC++ SYCL run-time and compilation for near-native speed. No DPC++ SYCL language coding required!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "id": "6c124ae6-135d-4543-98c0-e6e68ff6bdec",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Time to Compute Pairwise Distance with DPNP and Numba-DPEX written SYCL Kernel on GPU: 0.005505800247192383\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpnp as np\n",
+    "import numba_dpex as dpex\n",
+    "import time\n",
+    "\n",
+    "# kernel programming similar to Numba's cuda.jit sub-module\n",
+    "# API modeled after SYCL lanaguage and uses the DPC++ run-time\n",
+    "@dpex.kernel\n",
+    "def _pairwise_distance_kernel(data, distance):\n",
+    "    i = dpex.get_global_id(0)\n",
+    "    j = dpex.get_global_id(1)\n",
+    "\n",
+    "    data_dims = data.shape[1]\n",
+    "\n",
+    "    d = data.dtype.type(0.0)\n",
+    "    for k in range(data_dims):\n",
+    "        tmp = data[i, k] - data[j, k]\n",
+    "        d += tmp * tmp\n",
+    "        \n",
+    "    distance[j, i] = np.sqrt(d)\n",
+    "\n",
+    "# for this example, let's put the kernel we just wrote in a wrapper to call it for consistency with our previous scipts\n",
+    "# you can call the kernel directly as well\n",
+    "def pairwise_distance(data, distance):\n",
+    "    _pairwise_distance_kernel[dpex.Range(data.shape[0], data.shape[0])](data, distance)\n",
+    "\n",
+    "\n",
+    "data = np.random.ranf((10*1024,3)).astype(np.float32)\n",
+    "distance = np.empty(shape=(data.shape[0], data.shape[0]), dtype=np.float32)\n",
+    "\n",
+    "\n",
+    "#do compilation first run, we will calculate performance on subsequent runs\n",
+    "#wrapper consistent with previous np and dpnp scripts\n",
+    "pairwise_distance(data, distance)\n",
+    "\n",
+    "# alternatively, call kernel directly without wrapper:\n",
+    "#_pairwise_distance_kernel[dpex.Range(data.shape[0], data.shape[0])](data, distance)\n",
+    "\n",
+    "#time pairwise distance calculations\n",
+    "start = time.time()\n",
+    "pairwise_distance(data, distance)\n",
+    "print(\"Time to Compute Pairwise Distance with DPNP and Numba-DPEX written SYCL Kernel on GPU:\", time.time() - start)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "762c8862-6d34-4aa4-bbe3-947902e00f4e",
+   "metadata": {},
+   "source": [
+    "## For more information on Data Parallel Extensions for Python* language, please visit:\n",
+    "\n",
+    "- [Data Parallel Extensions for Python* language (dpep) Website](https://intelpython.github.io/DPEP/main/)\n",
+    "- [Data Parallel Extension for NumPy* (dpnp) Documentation](https://intelpython.github.io/dpnp/)\n",
+    "- [Data Parallel Extension for Numba* (numba-dpex) Documentation](https://intelpython.github.io/numba-dpex/latest/index.html)\n",
+    "- [Data Parallel Control (dpctl) Documentation](https://intelpython.github.io/dpctl/latest/index.html)\n",
+    "\n",
+    "For support: [Intel Machine Learning and Data Analytics Support Forum](https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "318dac21-5744-48e9-8238-cef5b78185da",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "base",
+   "language": "python",
+   "name": "base"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.16"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/main/objects.inv b/main/objects.inv
new file mode 100644
index 0000000..a3de1f8
Binary files /dev/null and b/main/objects.inv differ
diff --git a/main/parallelism.html b/main/parallelism.html
new file mode 100644
index 0000000..f83c436
--- /dev/null
+++ b/main/parallelism.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Parallelism in Modern Data-Parallel Architectures &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Heterogeneous Computing" href="heterogeneous_computing.html" />
+    <link rel="prev" title="Prerequisites and Installation" href="prerequisites_and_installation.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="heterogeneous_computing.html" title="Heterogeneous Computing">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="prerequisites_and_installation.html" title="Prerequisites and Installation">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Parallelism in Modern Data-Parallel Architectures</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="parallelism"></span><section id="parallelism-in-modern-data-parallel-architectures">
+<h1>Parallelism in Modern Data-Parallel Architectures<a class="headerlink" href="#parallelism-in-modern-data-parallel-architectures" title="Link to this heading">¶</a></h1>
+<p>Python is loved for its productivity and interactivity. But when it comes to dealing with
+computationally heavy codes, Python performance cannot be compromised. Intel and Python numerical
+computing communities, such as <a class="reference external" href="https://numfocus.org/">NumFOCUS</a>, dedicate attention to
+optimizing core numerical and data science packages for leveraging parallelism available in modern CPUs:</p>
+<ul class="simple">
+<li><p><strong>Multiple computational cores:</strong> Several computational cores allow to process the data concurrently.
+Compared to a single-core CPU, <em>N</em> cores can process either <em>N</em> times bigger data in a fixed time, or
+reduce a computation time <em>N</em> times for a set amount of data.</p></li>
+</ul>
+<a class="reference internal image-reference" href="_images/dpep-cores.png"><img alt="Multiple CPU Cores" class="align-center" src="_images/dpep-cores.png" style="width: 600px;" /></a>
+<ul>
+<li><p><strong>SIMD parallelism:</strong> SIMD (Single Instruction Multiple Data) is a special type of instructions
+that perform operations on vectors of data elements at the same time. The size of vectors is called the SIMD width.
+If a SIMD width is <em>K</em> then a SIMD instruction can process <em>K</em> data elements in parallel.</p>
+<p>In the following diagram, the SIMD width is 2, which means that a single instruction processes two elements simultaneously.
+Compared to regular instructions that process one element at a time, 2-wide SIMD instruction performs
+two times more data in fixed time, or, respectively, process a fixed amount of data two times faster.</p>
+</li>
+</ul>
+<a class="reference internal image-reference" href="_images/dpep-simd.png"><img alt="SIMD" class="align-center" src="_images/dpep-simd.png" style="width: 150px;" /></a>
+<ul class="simple">
+<li><p><strong>Instruction-Level Parallelism:</strong> Modern CISC architectures, such as x86, allow performing data independent
+instructions in parallel. In the following example, see how to compute <span class="math notranslate nohighlight">\(a * b + (c - d)\)</span>.
+Operations <span class="math notranslate nohighlight">\(*\)</span> and <span class="math notranslate nohighlight">\(-\)</span> can be executed in parallel, the last instruction
+<span class="math notranslate nohighlight">\(+\)</span> depends on availability of <span class="math notranslate nohighlight">\(a * b\)</span> and <span class="math notranslate nohighlight">\(c - d\)</span> and cannot be executed in parallel
+with <span class="math notranslate nohighlight">\(*\)</span> and <span class="math notranslate nohighlight">\(-\)</span>.</p></li>
+</ul>
+<a class="reference internal image-reference" href="_images/dpep-ilp.png"><img alt="SIMD" class="align-center" src="_images/dpep-ilp.png" style="width: 150px;" /></a>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="prerequisites_and_installation.html"
+                          title="previous chapter">Prerequisites and Installation</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="heterogeneous_computing.html"
+                          title="next chapter">Heterogeneous Computing</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/prerequisites_and_installation.html b/main/prerequisites_and_installation.html
new file mode 100644
index 0000000..6ba55df
--- /dev/null
+++ b/main/prerequisites_and_installation.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Prerequisites and Installation &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Parallelism in Modern Data-Parallel Architectures" href="parallelism.html" />
+    <link rel="prev" title="Data Parallel Extensions for Python" href="index.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="parallelism.html" title="Parallelism in Modern Data-Parallel Architectures">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="index.html" title="Data Parallel Extensions for Python">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Prerequisites and Installation</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="prerequisites-and-installation"></span><section id="id1">
+<h1>Prerequisites and Installation<a class="headerlink" href="#id1" title="Link to this heading">¶</a></h1>
+<section id="device-drivers">
+<h2>1. Device Drivers<a class="headerlink" href="#device-drivers" title="Link to this heading">¶</a></h2>
+<p>To start programming data parallel devices beyond CPU, you will need an appropriate hardware.
+For example, Data Parallel Extensions for Python work fine on Intel © laptops with integrated graphics.
+In majority of cases, your Windows*-based laptop already has all necessary device drivers installed. But if you want the most
+up-to-date driver, you can always
+<a class="reference external" href="https://www.intel.com/content/www/us/en/download-center/home.html">update it to the latest one</a>.
+Follow device driver installation instructions
+to complete this step.</p>
+<p>All other necessary components for programming data parallel devices will be installed with
+Data Parallel Extensions for Python.</p>
+</section>
+<section id="python-interpreter">
+<h2>2. Python Interpreter<a class="headerlink" href="#python-interpreter" title="Link to this heading">¶</a></h2>
+<p>You will need Python 3.8, 3.9, or 3.10 installed on your system. If you do not have one yet the easiest way to do
+that is to install <a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/distribution-for-python.html">Intel Distribution for Python*</a>.
+It installs all essential Python numerical and machine
+learning packages optimized for the Intel hardware, including Data Parallel Extensions for Python*.
+If you have Python installation from another vendor, it is fine too. All you need is to install Data Parallel
+Extensions for Python manually as shown in the next section.</p>
+</section>
+<section id="data-parallel-extensions-for-python">
+<h2>3. Data Parallel Extensions for Python<a class="headerlink" href="#data-parallel-extensions-for-python" title="Link to this heading">¶</a></h2>
+<p>Skip this step if you already installed Intel © Distribution for Python.</p>
+<p>The easiest way to install Data Parallel Extensions for Python is to install numba-dpex:</p>
+<ul class="simple">
+<li><p>Conda: <code class="docutils literal notranslate"><span class="pre">conda</span> <span class="pre">install</span> <span class="pre">numba-dpex</span></code></p></li>
+<li><p>Pip: <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">numba-dpex</span></code></p></li>
+</ul>
+<p>These commands install <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> along with its dependencies, including <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>, <code class="docutils literal notranslate"><span class="pre">dpctl</span></code>,
+and required compiler runtimes.</p>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>Before installing with conda or pip it is strongly advised to update <code class="docutils literal notranslate"><span class="pre">conda</span></code> and <code class="docutils literal notranslate"><span class="pre">pip</span></code> to latest versions</p>
+</div>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="index.html"
+                          title="previous chapter">Data Parallel Extensions for Python</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="parallelism.html"
+                          title="next chapter">Parallelism in Modern Data-Parallel Architectures</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/programming_dpep.html b/main/programming_dpep.html
new file mode 100644
index 0000000..6f7deff
--- /dev/null
+++ b/main/programming_dpep.html
@@ -0,0 +1,441 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Programming with Data Parallel Extensions for Python &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Examples" href="examples.html" />
+    <link rel="prev" title="Heterogeneous Computing" href="heterogeneous_computing.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="examples.html" title="Examples">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="heterogeneous_computing.html" title="Heterogeneous Computing">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Programming with Data Parallel Extensions for Python</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="programming-dpep"></span><section id="programming-with-data-parallel-extensions-for-python">
+<h1>Programming with Data Parallel Extensions for Python<a class="headerlink" href="#programming-with-data-parallel-extensions-for-python" title="Link to this heading">¶</a></h1>
+<a class="reference internal image-reference" href="_images/dpep-all.png"><img alt="Data Parallel Extensions for Python" class="align-center" src="_images/dpep-all.png" style="width: 600px;" /></a>
+<p><strong>Data Parallel Extensions for Python</strong> consist of three foundational packages:</p>
+<ul class="simple">
+<li><p>The <a class="reference external" href="https://numpy.org/">Numpy*</a>-like library, <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>;</p></li>
+<li><p>The compiler extension for <a class="reference external" href="https://numba.pydata.org/">Numba*</a>, <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code></p></li>
+<li><p>The library for managing devices, queues, and heterogeneous data, <code class="docutils literal notranslate"><span class="pre">dpctl</span></code>.</p></li>
+</ul>
+<p>Their underlying implementation is based on <a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> standard, which is a cross-platform abstraction layer
+for heterogeneous computing on data parallel devices, such as CPU, GPU, or domain-specific accelerators.</p>
+<section id="scalars-vs-0-dimensional-arrays">
+<h2>Scalars vs. 0-Dimensional Arrays<a class="headerlink" href="#scalars-vs-0-dimensional-arrays" title="Link to this heading">¶</a></h2>
+<p>Primitive types, such as Python’s and Numpy’s <code class="docutils literal notranslate"><span class="pre">float</span></code>, <code class="docutils literal notranslate"><span class="pre">int</span></code>, or <code class="docutils literal notranslate"><span class="pre">complex</span></code>, used to represent scalars,
+have the host storage. In contrast, <code class="docutils literal notranslate"><span class="pre">dpctl.tensor.usm_ndarray</span></code> and <code class="docutils literal notranslate"><span class="pre">dpnp.ndarray</span></code> have the USM storage
+and carry associated allocation queue. For the <a class="reference internal" href="heterogeneous_computing.html#compute-follows-data"><span class="std std-ref">Compute-Follows-Data</span></a> consistent behavior
+all <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> operations that produce scalars will instead produce respective 0-dimensional arrays.</p>
+<p>That implies, that some code changes may be needed to replace scalar math operations with respective
+<code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array operations. See <a class="reference external" href="https://intelpython.github.io/dpnp/">Data Parallel Extension for Numpy*</a> - <strong>API Reference</strong> section for details.</p>
+</section>
+<section id="data-parallel-extension-for-numpy-dpnp">
+<h2>Data Parallel Extension for Numpy - dpnp<a class="headerlink" href="#data-parallel-extension-for-numpy-dpnp" title="Link to this heading">¶</a></h2>
+<p>The <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> library is a bare minimum to start programming numerical codes for data-parallel devices.
+If you already have a Python script written in <a class="reference external" href="https://numpy.org/">Numpy*</a>, then running it on a GPU will typically require
+changing just a few lines of the code:</p>
+<div class="literal-block-wrapper docutils container" id="ex-01-hello-dpnp">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 01:</strong> Your first NumPy code running on GPU</span><a class="headerlink" href="#ex-01-hello-dpnp" title="Link to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<p>In this example, <code class="docutils literal notranslate"><span class="pre">np.asarray()</span></code> creates an array on the default <a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> device, which is a <code class="docutils literal notranslate"><span class="pre">&quot;gpu&quot;</span></code> on systems
+with integrated or discrete GPU (it is the <code class="docutils literal notranslate"><span class="pre">&quot;host&quot;</span></code> on systems that do not have GPU).
+The queue associated with this array is now carried with <code class="docutils literal notranslate"><span class="pre">x</span></code>, and <code class="docutils literal notranslate"><span class="pre">np.sum(x)</span></code> derives it from <code class="docutils literal notranslate"><span class="pre">x</span></code>,
+and respective pre-compiled kernel implementing <code class="docutils literal notranslate"><span class="pre">np.sum()</span></code> is submitted to that queue.
+The result <code class="docutils literal notranslate"><span class="pre">y</span></code> is allocated on the device 0-dimensional array associated with that queue too.</p>
+<p>All <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array creation routines and random number generators have additional optional keyword arguments:
+<code class="docutils literal notranslate"><span class="pre">device</span></code>, <code class="docutils literal notranslate"><span class="pre">queue</span></code>, and <code class="docutils literal notranslate"><span class="pre">usm_type</span></code>, using which you can explicitly specify on which device or queue you want
+the tensor data to be created along with the USM memory type to be used (<code class="docutils literal notranslate"><span class="pre">&quot;host&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;device&quot;</span></code>, or <code class="docutils literal notranslate"><span class="pre">&quot;shared&quot;</span></code>).
+In the following example, the array <code class="docutils literal notranslate"><span class="pre">x</span></code> is created on the GPU device, and reduction sum is done on it:</p>
+<div class="literal-block-wrapper docutils container" id="ex-02-dpnp-device">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 02:</strong> Select device type while creating array</span><a class="headerlink" href="#ex-02-dpnp-device" title="Link to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+</section>
+<section id="data-parallel-extension-for-numba-numba-dpex">
+<h2>Data Parallel Extension for Numba - numba-dpex<a class="headerlink" href="#data-parallel-extension-for-numba-numba-dpex" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://numba.pydata.org/">Numba*</a> is a powerful Just-In-Time (JIT) compiler that works best on <a class="reference external" href="https://numpy.org/">Numpy*</a> arrays, <a class="reference external" href="https://numpy.org/">Numpy*</a> functions, and loops.
+Data-parallel loops is where the data parallelism resides. It allows leveraging all available CPU cores,
+SIMD instructions, and schedules those in a way that exploits maximum instruction-level parallelism.
+The <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> extension allows to compile and offload data-parallel regions to any data parallel device.
+It takes just a few lines to modify your CPU <a class="reference external" href="https://numba.pydata.org/">Numba*</a> script to run on GPU:</p>
+<div class="literal-block-wrapper docutils container" id="ex-03-dpnp2numba-dpex">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 03:</strong> Compile dpnp code with numba-dpex</span><a class="headerlink" href="#ex-03-dpnp2numba-dpex" title="Link to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">from</span> <span class="nn">numba_dpex</span> <span class="kn">import</span> <span class="n">dpjit</span> <span class="k">as</span> <span class="n">njit</span>
+
+
+<span class="nd">@njit</span><span class="p">()</span>
+<span class="k">def</span> <span class="nf">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>  <span class="c1"># Device queue is inferred from x. The kernel is submitted to that queue</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<p>In this example, you can see a custom function <code class="docutils literal notranslate"><span class="pre">sum_it()</span></code> that takes an array input. By compiling it with
+<a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a>, the queue information is derived from input argument <code class="docutils literal notranslate"><span class="pre">x</span></code>,
+which is associated with the default device (<code class="docutils literal notranslate"><span class="pre">&quot;gpu&quot;</span></code> on systems with integrated or discrete GPU) and
+dynamically compiles the kernel submitted to that queue. The result resides as a 0-dimensional array on the device
+associated with the queue, and on exit from the offload kernel it will be assigned to the tensor <code class="docutils literal notranslate"><span class="pre">y</span></code>.</p>
+</section>
+<section id="data-parallel-control-dpctl">
+<h2>Data Parallel Control - dpctl<a class="headerlink" href="#data-parallel-control-dpctl" title="Link to this heading">¶</a></h2>
+<p>Both <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> and <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> provide enough API versatility for programming data parallel devices but
+there are some situations when you need to use <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> advanced capabilities:</p>
+<ol class="arabic">
+<li><p><strong>Advanced device management.</strong> Both <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> and <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> support Numpy array creation routines
+with additional parameters that specify the device on which the data is allocated and the type of memory to be used
+(<code class="docutils literal notranslate"><span class="pre">&quot;device&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;host&quot;</span></code>, or <code class="docutils literal notranslate"><span class="pre">&quot;shared&quot;</span></code>). However, if you need some more advanced device and data management
+capabilities, you need to import <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> in addition to <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> and/or <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code>.</p>
+<p>One of frequent usages of <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> is to query the list devices present on the system, available driver backend
+(such as <code class="docutils literal notranslate"><span class="pre">&quot;opencl&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;level_zero&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;cuda&quot;</span></code>, etc.)</p>
+<p>Another frequent usage is the creation of additional queues for the purpose of profiling or choosing an out-of-order
+execution of offload kernels.</p>
+</li>
+</ol>
+<div class="literal-block-wrapper docutils container" id="ex-04-dpctl-device-query">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 04:</strong> Get information about devices</span><a class="headerlink" href="#ex-04-dpctl-device-query" title="Link to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">()</span>  <span class="c1"># Print platform information</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;GPU devices:&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the list of all GPU devices</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;Number of GPU devices&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_num_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the number of GPU devices</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has CPU devices?&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">has_cpu_devices</span><span class="p">())</span>  <span class="c1"># Check if there are CPU devices</span>
+</pre></div>
+</div>
+</div>
+<ol class="arabic" start="2">
+<li><p><strong>Cross-platform development using Python Array API standard.</strong> If you
+program Numpy-like codes and target different hardware vendors and different tensor implementations,
+then going with <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> is a good choice for writing a portable Numpy-like code.
+The <code class="docutils literal notranslate"><span class="pre">dpctl.tensor</span></code> implements <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> for <a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> devices. Accompanied with
+respective SYCL device, driver from different vendors, <code class="docutils literal notranslate"><span class="pre">dpctl.tensor</span></code> becomes a portable solution
+for writing numerical codes for any SYCL device.</p>
+<p>For example, some Python communities, such as
+<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/22352">Scikit-Learn* community</a>, are already establishing
+a path for having algorithms (re-)implemented using <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> .
+This is a reliable path for extending their capabilities beyond CPU only, or beyond certain GPU vendor only.</p>
+</li>
+<li><p><strong>Zero-copy data exchange between tensor implementations.</strong> Certain Python projects may have their tensor
+implementations not relying on <code class="docutils literal notranslate"><span class="pre">dpctl.tensor</span></code> or <code class="docutils literal notranslate"><span class="pre">dpnp.ndarray</span></code> tensors. However, you can still exchange data
+between these tensors not copying it back and forth through the host.
+<a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> specifies the data exchange protocol for zero-copy exchange
+between tensors through <code class="docutils literal notranslate"><span class="pre">dlpack</span></code>. Being the <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> implementation
+<code class="docutils literal notranslate"><span class="pre">dpctl</span></code> provides <code class="docutils literal notranslate"><span class="pre">dpctl.tensor.from_dlpack()</span></code> function used for zero-copy view of another tensor input.</p></li>
+</ol>
+</section>
+<section id="debugging-and-profiling-data-parallel-extensions-for-python">
+<h2>Debugging and Profiling Data Parallel Extensions for Python<a class="headerlink" href="#debugging-and-profiling-data-parallel-extensions-for-python" title="Link to this heading">¶</a></h2>
+<p><a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit.html">Intel oneAPI Base Toolkit</a> provides two tools to assist programmers to analyze performance issues in programs
+that use <strong>Data Parallel Extensions for Python</strong>. They are <a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html">Intel VTune Profiler</a> and
+<a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/advisor.html">Intel Advisor</a>.</p>
+<p>Intel © VTune ™ Profiler examines various performance aspects of a program like, the most time-consuming parts,
+efficiency of offloaded code, impact of memory sub-systems, etc.</p>
+<p>Intel © Advisor ™ provides insights on the performance of offloaded code with respect to the peak performance and
+memory bandwidth.</p>
+<p>Below you can find how to use Intel VTune Profiler and Intel Advisor with
+heterogenous programs that use <strong>Data Parallel Extensions for Python</strong>.</p>
+<section id="profiling-with-intel-vtune-profiler">
+<h3>Profiling with Intel VTune Profiler<a class="headerlink" href="#profiling-with-intel-vtune-profiler" title="Link to this heading">¶</a></h3>
+<p>Intel © VTune ™ Profiler provides two mechanisms to profile heterogeneous programs
+targeted to GPUs.</p>
+<ul class="simple">
+<li><p>GPU offload</p></li>
+<li><p>GPU hotspots</p></li>
+</ul>
+<p>The <em>GPU offload</em> analysis profiles the entire application (both GPU and host code) and helps to identify
+if the application is CPU- or GPU-bound. It provides information on the proportion of the execution time spent
+in GPU execution. It also provides information about various hotspots in the program. The key goal of the <em>GPU offload</em>
+analysis is to identify the parts of the program that can benefit from offloading to GPUs.</p>
+<p>The <em>GPU hotspots</em> analysis focuses on providing insights into the performance of GPU-offloaded code.
+It provides insights about the parallelism in the GPU kernel, the efficiency of the kernel, SIMD utilization,
+and memory latency. It also provides performance data regarding synchronization operations like GPU barriers and
+atomic operations.</p>
+<p>The following instructions are used to execute the two Intel VTune Profiler analyses on programs written
+using <strong>Data Parallel Extensions for Python</strong>:</p>
+<div class="literal-block-wrapper docutils container" id="id2">
+<div class="code-block-caption"><span class="caption-text"><strong>GPU Offload</strong></span><a class="headerlink" href="#id2" title="Link to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; vtune -collect gpu-offload -r &lt;output_dir&gt; -- python &lt;script&gt;.py &lt;args&gt;</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="id3">
+<div class="code-block-caption"><span class="caption-text"><strong>GPU Hotspots</strong></span><a class="headerlink" href="#id3" title="Link to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; vtune -collect gpu-hotspots -r &lt;output_dir&gt; -- python &lt;script&gt;.py &lt;args&gt;</span>
+</pre></div>
+</div>
+</div>
+<p>Intel VTune Profiler performs dynamic binary analysis on a given program to obtain insights on various
+performance characteristics. It can run on unmodified binaries with no extra requirements for program compilation.
+After collecting the data using the above commands, the Intel VTune Profiler GUI can be used to view various
+performance characteristics. In addition to the GUI, it provides mechanisms to generate reports through
+the command line and setup a web server for post processing the data.</p>
+<p>See <a class="reference external" href="https://www.intel.com/content/www/us/en/develop/documentation/vtune-help/top.html">Intel VTune Profiler User Guide</a>
+for more details.</p>
+</section>
+<section id="profiling-with-intel-advisor">
+<h3>Profiling with Intel Advisor<a class="headerlink" href="#profiling-with-intel-advisor" title="Link to this heading">¶</a></h3>
+<p>The primary goal of Intel © Advisor is to help you make targeted optimizations by identifying
+appropriate kernels and characterizing the performance limiting factors. It provides mechanisms
+to analyze the performance of GPU kernels against the hardware roof-line performance. Intel Advisor gives you information
+about the maximum achievable performance with the given hardware conditions and helps identify the best
+kernels for optimization. Further, it helps you to characterize if a GPU kernel is bound by
+compute capacity or by memory bandwidth.</p>
+<p>The following instructions are used to generate GPU roof-line performance graphs using Intel Advisor.</p>
+<div class="literal-block-wrapper docutils container" id="id4">
+<div class="code-block-caption"><span class="caption-text"><strong>Collect Roofline</strong></span><a class="headerlink" href="#id4" title="Link to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; advisor --collect=roofline --profile-gpu --project-dir=&lt;output_dir&gt; --search-dir src:r=&lt;search_dir&gt; -- &lt;executable&gt; &lt;args&gt;</span>
+</pre></div>
+</div>
+</div>
+<p>This command collects the GPU roof-line data from executing the application written using
+<strong>Data Parallel Extensions for Python</strong>.</p>
+<p>The next command generates the roof-line graph as a HTML file in the output directory:</p>
+<div class="literal-block-wrapper docutils container" id="id5">
+<div class="code-block-caption"><span class="caption-text"><strong>Generate Roofline HTML-File</strong></span><a class="headerlink" href="#id5" title="Link to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; advisor --report=roofline --gpu --project-dir=&lt;output_dir&gt; --report-output=&lt;output_dir&gt;/roofline_gpu.html</span>
+</pre></div>
+</div>
+</div>
+<a class="reference internal image-reference" href="_images/advisor_roofline_gen9.png"><img alt="Advisor roofline analysis example on Gen9 integrated GPU" class="align-center" src="_images/advisor_roofline_gen9.png" style="width: 800px;" /></a>
+<p>The figure above shows the example of roof-line graph generated using Intel Advisor.
+The X-axis in the graph represents arithmetic intensity and the Y-axis represents performance in GFLOPS.
+The horizontal lines parallel to the X-axis represent the roof-line compute capacity for the given hardware.
+The cross-diagonal lines represent the peak memory bandwidth of different layers of the memory hierarchy.
+The red colored dot corresponds to the executed GPU kernel. The graph shows the performance of the kernel relative
+to the peak compute capacity and memory bandwidth. It also shows whether the GPU kernel is memory or compute
+bound depending on the roof-line that is limiting the GPU kernel.</p>
+<p>For further details on Intel Advisor and its extended capabilities, refer to the
+<a class="reference external" href="https://www.intel.com/content/www/us/en/develop/documentation/advisor-user-guide/top.html">Intel |copy| Advisor User Guide</a>.</p>
+<div class="admonition-todo admonition" id="id1">
+<p class="admonition-title">Todo</p>
+<p>Document debugging section</p>
+</div>
+</section>
+</section>
+<section id="writing-robust-numerical-codes-for-heterogeneous-computing">
+<h2>Writing Robust Numerical Codes for Heterogeneous Computing<a class="headerlink" href="#writing-robust-numerical-codes-for-heterogeneous-computing" title="Link to this heading">¶</a></h2>
+<p>Default primitive type (<code class="docutils literal notranslate"><span class="pre">dtype</span></code>) in <a class="reference external" href="https://numpy.org/">Numpy*</a> is the double precision (<code class="docutils literal notranslate"><span class="pre">float64</span></code>), which is supported by
+majority of modern CPUs. When it comes to program GPUs and especially specialized accelerators,
+the set of supported primitive data types may be limited. For example, certain GPUs may not support
+double precision or half-precision. <strong>Data Parallel Extensions for Python</strong> select default <code class="docutils literal notranslate"><span class="pre">dtype</span></code> depending on
+device’s default type in accordance with Python Array API Standard. It can be either <code class="docutils literal notranslate"><span class="pre">float64</span></code> or <code class="docutils literal notranslate"><span class="pre">float32</span></code>.
+It means that unlike traditional <a class="reference external" href="https://numpy.org/">Numpy*</a> programming on a CPU, the heterogeneous computing requires
+careful management of hardware peculiarities to keep the Python script portable and robust on any device.</p>
+<p>There are several hints how to make the numerical code portable and robust.</p>
+<section id="sensitivity-to-floating-point-errors">
+<h3>Sensitivity to Floating-Point Errors<a class="headerlink" href="#sensitivity-to-floating-point-errors" title="Link to this heading">¶</a></h3>
+<p>Floating-point arithmetic has a finite precision, which implies that only a tiny fraction of real numbers can be
+represented in floating-point arithmetic. It is almost certain that every floating-point operation
+induces a rounding error because the result cannot be accurately represented as a floating-point number.
+The <a class="reference external" href="https://standards.ieee.org/ieee/754/6210/">IEEE 754-2019 Standard for Floating-Point Arithmetic</a> sets the upper bound for rounding errors in each
+arithmetic operation to 0.5 <em>ulp</em>, meaning that each arithmetic operation must be accurate to the last bit of
+floating-point mantissa, which is an order of <span class="math notranslate nohighlight">\(10^-16\)</span> in double precision and <span class="math notranslate nohighlight">\(10^-7\)</span>
+in single precision.</p>
+<p>In robust numerical codes, these errors tend to accumulate slowly so that single precision is enough to
+calculate the result accurate to three-five decimal digits.</p>
+<p>However, there is a situation known as a <em>catastrophic cancellation</em>, when small accumulated errors
+result in a significant, or even complete, loss of accuracy. The catastrophic cancellation happens
+when two close floating-point numbers with small rounding errors are subtracted. As a result the original
+rounding errors amplify by the number of identical leading digits:</p>
+<a class="reference internal image-reference" href="_images/fp-cancellation.png"><img alt="Floating-Point Cancellation" class="align-center" src="_images/fp-cancellation.png" style="width: 327.0px; height: 141.0px;" /></a>
+<p>In the example above, green digits are accurate digits, a few trailing digits in red are inaccurate due to
+induced errors. As a result of subtraction, only one accurate digit remains.</p>
+<p>Situations with catastrophic cancellations must be carefully handled. An example where catastrophic
+cancellation happens naturally is the numeric differentiation, where two close numbers are subtracted
+to approximate the derivative:</p>
+<div class="math notranslate nohighlight">
+\[df/dx \approx \frac{f(x+\delta) - f(x-\delta)}{2\delta}\]</div>
+<p>Smaller you take <span class="math notranslate nohighlight">\(\delta\)</span> is greater the catastrophic cancellation. At the same time, bigger <span class="math notranslate nohighlight">\(\delta\)</span>
+results in bigger approximation error. Books on numerical computing and floating-point arithmetic discuss
+variety of technics to make catastrophic cancellations controllable. For more details about floating-point
+arithmetic, refer to <a class="reference external" href="https://standards.ieee.org/ieee/754/6210/">IEEE 754-2019 Standard for Floating-Point Arithmetic</a> and the article by
+<a class="reference external" href="https://www.itu.dk/~sestoft/bachelor/IEEE754_article.pdf&gt;">David Goldberg, What every computer scientist should know about floating-point arithmetic</a>.</p>
+</section>
+<section id="switching-between-single-and-double-precision">
+<h3>Switching Between Single and Double Precision<a class="headerlink" href="#switching-between-single-and-double-precision" title="Link to this heading">¶</a></h3>
+<ol class="arabic simple">
+<li><p>Implement your code to switch easily between single and double precision in a controlled fashion.
+For example, implement a utility function or introduce a constant that selects <code class="docutils literal notranslate"><span class="pre">dtype</span></code> for
+the rest of the <a class="reference external" href="https://numpy.org/">Numpy*</a> code.</p></li>
+<li><p>Run your code on a representative set of inputs in single and double precisions.
+Observe sensitivity of computed results to the switching between single and double precisions.
+If results remain identical to three-five digits for different inputs, it is a good sign that your code
+is not sensitive to floating-point errors.</p></li>
+<li><p>Write your code with catastrophic cancellations in mind. These blocks of code will require special
+care such as the use of extended precision or other techniques to control cancellations.
+It is likely that this part of the code requires a hardware specific implementation.</p></li>
+</ol>
+</section>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="heterogeneous_computing.html"
+                          title="previous chapter">Heterogeneous Computing</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="examples.html"
+                          title="next chapter">Examples</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/search.html b/main/search.html
new file mode 100644
index 0000000..268c0b6
--- /dev/null
+++ b/main/search.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Search &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <script src="_static/searchtools.js"></script>
+    <script src="_static/language_data.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="#" />
+  <script src="searchindex.js" defer></script>
+  
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+       
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <h1 id="search-documentation">Search</h1>
+  
+  <noscript>
+  <div class="admonition warning">
+  <p>
+    Please activate JavaScript to enable the search
+    functionality.
+  </p>
+  </div>
+  </noscript>
+  
+  
+  <p>
+    Searching for multiple words only shows matches that contain
+    all words.
+  </p>
+  
+  
+  <form action="" method="get">
+    <input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+    <input type="submit" value="search" />
+    <span id="search-progress" style="padding-left: 10px"></span>
+  </form>
+  
+  
+  
+  <div id="search-results">
+  
+  </div>
+  
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/main/searchindex.js b/main/searchindex.js
new file mode 100644
index 0000000..73838b3
--- /dev/null
+++ b/main/searchindex.js
@@ -0,0 +1 @@
+Search.setIndex({"docnames": ["benchmarks", "demos", "examples", "heterogeneous_computing", "index", "jupyter_notebook", "notebooks/01-get_started", "notebooks/02-dpnp_numpy_fallback", "notebooks/dpep_scalability_journey_example-pairwise_distance", "parallelism", "prerequisites_and_installation", "programming_dpep", "useful_links"], "filenames": ["benchmarks.rst", "demos.rst", "examples.rst", "heterogeneous_computing.rst", "index.rst", "jupyter_notebook.rst", "notebooks/01-get_started.ipynb", "notebooks/02-dpnp_numpy_fallback.ipynb", "notebooks/dpep_scalability_journey_example-pairwise_distance.ipynb", "parallelism.rst", "prerequisites_and_installation.rst", "programming_dpep.rst", "useful_links.rst"], "titles": ["Benchmarks", "Demos", "Examples", "Heterogeneous Computing", "Data Parallel Extensions for Python", "Tutorials", "Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python", "Jupyter Notebook 2: Falling back to NumPy", "Pairwise Distance: Open-Source XPU Programming with Data Parallel Extensions for Python* language", "Parallelism in Modern Data-Parallel Architectures", "Prerequisites and Installation", "Programming with Data Parallel Extensions for Python", "Useful links"], "terms": {"data": [0, 1, 2, 5, 7, 12], "parallel": [0, 1, 2, 3, 5, 7, 12], "extens": [0, 1, 2, 3, 5, 7, 12], "python": [0, 1, 2, 3, 5, 7, 9, 12], "provid": [0, 4, 6, 11, 12], "set": [0, 1, 6, 7, 9, 11], "illustr": [0, 1, 3, 5, 6], "differ": [0, 3, 6, 11, 12], "aspect": [0, 3, 6, 11], "implement": [0, 3, 4, 7, 11, 12], "perform": [0, 3, 4, 6, 7, 9, 11, 12], "code": [0, 2, 3, 4, 6, 7, 8, 9, 12], "repres": [0, 11], "some": [0, 5, 6, 7, 8, 11], "real": [0, 11], "life": [0, 1], "numer": [0, 4, 9, 10, 12], "problem": 0, "import": [0, 2, 6, 7, 8, 11, 12], "part": [0, 8, 11], "kernel": [0, 2, 3, 5, 7, 8, 11], "applic": [0, 1, 5, 6, 8, 11], "each": [0, 3, 11], "i": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "sever": [0, 1, 9, 11], "variant": 0, "necessarili": [0, 3], "all": [0, 1, 2, 3, 5, 6, 8, 10, 11], "pure": 0, "typic": [0, 3, 7, 11], "slowest": 0, "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11], "just": [0, 8, 11, 12], "refer": [0, 1, 5, 6, 7, 11], "numpi": [0, 2, 4, 5, 6, 12], "same": [0, 2, 3, 6, 9, 11], "librari": [0, 3, 4, 8, 11, 12], "dpnp": [0, 2, 3, 4, 5, 6, 7, 10], "modifi": [0, 11], "run": [0, 2, 3, 5, 7, 11], "specif": [0, 6, 8, 11], "devic": [0, 2, 4, 7, 11, 12], "you": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12], "can": [0, 2, 3, 4, 6, 8, 9, 10, 11], "baselin": 0, "while": [0, 2, 11], "evalu": 0, "its": [0, 3, 6, 9, 10, 11], "numba": [0, 2, 3, 4, 6, 10, 12], "njit": [0, 2, 11], "arrai": [0, 2, 3, 4, 6, 7, 8, 12], "style": 0, "compil": [0, 2, 3, 4, 6, 10, 11, 12], "when": [0, 3, 5, 6, 9, 11], "implementat": 0, "direct": [0, 3], "loop": [0, 8, 11], "prang": [0, 8], "sometim": [0, 6], "program": [0, 3, 4, 6, 10, 12], "cumbersom": 0, "ineffici": 0, "mai": [0, 3, 6, 7, 8, 11], "lead": [0, 11], "more": [0, 1, 3, 5, 9, 11], "readabl": 0, "thu": 0, "compar": [0, 9], "dpex": [0, 2, 3, 4, 8, 10], "dpjit": [0, 2, 8, 11], "vanilla": 0, "detail": [0, 1, 3, 7, 11], "also": [0, 6, 8, 11], "against": [0, 11], "see": [0, 5, 6, 7, 8, 9, 11], "how": [0, 6, 8, 9, 11, 12], "much": [0, 3], "extra": [0, 6, 11], "bring": 0, "given": [0, 6, 11], "which": [0, 3, 5, 6, 7, 9, 11], "close": [0, 3, 11], "cuda": [0, 8, 11], "jit": [0, 8, 11], "model": [0, 1, 3, 6, 8], "mlir": 0, "experiment": 0, "base": [0, 3, 6, 10, 11], "backend": [0, 6, 11], "cupi": 0, "like": [0, 6, 7, 8, 11, 12], "compat": 0, "nativ": [0, 8, 12], "sycl": [0, 3, 11, 12], "most": [0, 3, 7, 10, 11], "have": [0, 3, 6, 7, 8, 10, 11], "dpc": [0, 3, 8, 12], "abov": [0, 3, 11], "These": [0, 2, 3, 10, 11], "ar": [0, 1, 2, 3, 5, 6, 7, 8, 11], "dpbench": 0, "framework": [0, 12], "allow": [0, 3, 4, 6, 8, 9, 11], "select": [0, 2, 4, 6, 11], "hardwar": [0, 3, 10, 11, 12], "For": [0, 1, 3, 5, 6, 7, 10, 11], "pleas": [0, 1, 5, 6, 7], "document": [0, 1, 3, 5, 7, 8, 11], "There": [1, 3, 11], "power": [1, 8, 11], "thei": [1, 3, 11], "mont": 1, "carlo": 1, "pi": 1, "The": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "method": [1, 3, 6], "estim": 1, "valu": 1, "mandelbrot": 1, "visual": 1, "breathtak": 1, "process": [1, 3, 6, 9, 11], "dive": 1, "famou": 1, "fractal": 1, "game": 1, "evolut": 1, "conwai": 1, "": [1, 6, 7, 8, 11], "locat": [1, 2, 3, 5, 6, 7, 11], "github": [1, 2, 5], "repositori": [1, 2, 5], "individu": [1, 3], "directori": [1, 5, 11], "Their": [2, 11], "name": [2, 6], "start": [2, 4, 5, 8, 10, 11], "2": [2, 3, 4, 6, 8, 9, 11], "digit": [2, 11], "number": [2, 6, 11], "follow": [2, 4, 7, 9, 10, 11], "descript": [2, 12], "ani": [2, 4, 11], "order": [2, 7, 8, 11], "howev": [2, 3, 7, 11], "new": [2, 3], "recommend": 2, "go": [2, 6, 11], "enumer": 2, "command": [2, 5, 8, 10, 11], "veri": [2, 3, 8], "first": [2, 8, 11], "01": [2, 11], "hello_dpnp": 2, "py": [2, 7, 11], "list": [2, 5, 6, 11], "your": [2, 5, 6, 10, 11], "gpu": [2, 3, 4, 7, 11], "np": [2, 6, 7, 8, 11], "x": [2, 6, 11], "asarrai": [2, 3, 11], "1": [2, 3, 4, 7, 8, 11], "3": [2, 4, 6, 7, 8, 11], "print": [2, 5, 6, 7, 8, 11], "alloc": [2, 3, 4, 11], "y": [2, 6, 11], "sum": [2, 6, 8, 11], "result": [2, 3, 6, 7, 11], "shape": [2, 6, 7, 8, 11], "0": [2, 4, 5, 6, 7, 8], "dimension": [2, 4], "expect": [2, 6, 7, 11], "6": [2, 6, 11], "02": [2, 11], "type": [2, 3, 4, 5, 6, 7, 8, 9, 11], "creat": [2, 4, 6, 7, 11], "empti": [2, 8, 11], "try": [2, 6, 8, 11], "except": [2, 3, 6, 7, 11], "avail": [2, 6, 8, 9, 11], "03": [2, 11], "from": [2, 3, 5, 6, 7, 8, 10, 11, 12], "numba_dpex": [2, 4, 8, 11], "def": [2, 8, 11], "sum_it": [2, 11], "queue": [2, 4, 11], "infer": [2, 11], "submit": [2, 3, 11], "return": [2, 7, 11], "04": [2, 11], "get": [2, 4, 5, 11], "inform": [2, 3, 5, 6, 11], "about": [2, 3, 5, 6, 11, 12], "dpctl": [2, 3, 4, 8, 10], "lsplatform": [2, 6, 11], "platform": [2, 6, 11], "get_devic": [2, 6, 11], "device_typ": [2, 6, 11], "get_num_devic": [2, 11], "ha": [2, 3, 6, 8, 10, 11], "cpu": [2, 3, 4, 9, 10, 11, 12], "has_cpu_devic": [2, 11], "check": [2, 6, 11], "an": [3, 4, 6, 7, 10, 11], "interpret": [3, 4], "languag": 3, "impli": [3, 11], "script": [3, 7, 11], "onli": [3, 7, 8, 11], "few": [3, 6, 11], "region": [3, 11], "execut": [3, 4, 6, 7, 8, 9, 11], "That": [3, 8, 11], "why": 3, "concept": [3, 6], "host": [3, 6, 7, 11], "help": [3, 11], "come": [3, 9, 11], "conceptu": 3, "diagram": [3, 9], "three": [3, 4, 11], "two": [3, 6, 7, 9, 11], "one": [3, 9, 10, 11], "attach": 3, "acceler": [3, 8, 11], "offer": 3, "where": [3, 5, 6, 11], "user": [3, 4, 5, 11], "specifi": [3, 6, 8, 11], "A": [3, 7], "multipl": [3, 6, 9], "henc": 3, "pre": [3, 11], "directli": [3, 8], "opencl": [3, 6, 11, 12], "wai": [3, 6, 10, 11], "write": [3, 4, 8, 12], "along": [3, 4, 10, 11], "One": [3, 11], "target": [3, 11, 12], "In": [3, 6, 7, 8, 9, 10, 11, 12], "case": [3, 6, 7, 10], "do": [3, 4, 6, 7, 8, 10, 11], "need": [3, 6, 10, 11], "work": [3, 10, 11], "necessari": [3, 8, 10], "underli": [3, 11], "through": [3, 6, 8, 11], "access": 3, "anoth": [3, 6, 7, 10, 11], "exampl": [3, 4, 6, 7, 8, 9, 10, 11], "via": [3, 7, 8], "expens": 3, "driver": [3, 4, 6, 11], "softwar": 3, "similarli": 3, "depend": [3, 9, 10, 11], "architectur": [3, 4], "exchang": [3, 11], "imposs": 3, "possibl": [3, 7], "must": [3, 7, 11], "taken": 3, "consider": 3, "On": 3, "logic": 3, "consist": [3, 4, 8, 11], "sub": [3, 8, 11], "singl": [3, 9], "former": 3, "programm": [3, 11], "latter": 3, "standard": [3, 4, 11, 12], "introduc": [3, 11], "usm": [3, 11], "requir": [3, 7, 8, 10, 11], "support": [3, 4, 6, 7, 8, 11, 12], "virtual": 3, "address": 3, "space": 3, "coher": 3, "pointer": 3, "distinct": 3, "thi": [3, 5, 6, 7, 8, 10, 11], "situat": [3, 6, 11], "stream": 3, "read": 3, "onc": 3, "fastest": 3, "crunch": 3, "happen": [3, 6, 11], "both": [3, 11], "sinc": [3, 6, 7, 8], "doe": [3, 6], "manag": [3, 11, 12], "migrat": 3, "explicitli": [3, 6, 11], "slower": 3, "than": [3, 6, 8], "reason": 3, "essenti": [3, 10, 12], "premis": 3, "state": [3, 6], "resid": [3, 6, 11], "tensor": [3, 4, 11, 12], "carri": [3, 11], "input": [3, 6, 11], "argument": [3, 6, 7, 11], "deduc": 3, "pictur": 3, "b": [3, 9], "were": 3, "accord": [3, 11], "paradigm": 3, "c": [3, 5, 7, 8, 9, 12], "associ": [3, 7, 11], "otherwis": 3, "thrown": 3, "usag": [3, 5, 11], "belong": 3, "canon": 3, "per": 3, "normal": [3, 8], "to_devic": 3, "a_new": 3, "altern": [3, 7, 8], "As": [3, 6, 11], "said": 3, "befor": [3, 6, 7, 10], "automat": 3, "implicitli": 3, "alwai": [3, 10], "mani": [3, 6, 8], "them": 3, "profil": [3, 4, 12], "purpos": [3, 7, 8, 11], "control": [3, 4, 5, 8, 12], "extend": [4, 6, 11], "capabl": [4, 6, 11], "beyond": [4, 6, 10, 11], "even": [4, 8, 11], "higher": 4, "gain": 4, "It": [4, 5, 6, 10, 11], "foundat": [4, 11, 12], "packag": [4, 7, 9, 10, 11], "subset": [4, 6], "drop": [4, 6], "replac": [4, 6, 8, 11], "core": [4, 9, 11], "function": [4, 6, 7, 8, 11, 12], "let": [4, 6, 7, 8], "util": [4, 11], "structur": 4, "api": [4, 7, 8, 11, 12], "creation": [4, 6, 11], "defin": [4, 7], "prerequisit": 4, "instal": [4, 6, 8], "modern": [4, 11], "heterogen": [4, 8, 12], "comput": [4, 8, 9, 12], "offload": [4, 11], "unifi": 4, "share": [4, 11], "memori": [4, 6, 11], "copi": [4, 6, 7, 11], "between": [4, 6, 12], "addit": [4, 11], "scalar": [4, 6], "v": 4, "debug": [4, 7, 12], "robust": [4, 12], "tutori": [4, 8], "fallback": [4, 5, 6], "benchmark": 4, "demo": 4, "link": 4, "To": [4, 5, 6, 7, 10], "jupyt": 5, "notebook": [5, 8], "line": [5, 6, 7, 8, 11], "prompt": 5, "server": [5, 11], "termin": 5, "includ": [5, 7, 8, 10], "url": 5, "web": [5, 11], "default": [5, 6, 7, 8, 11], "http": 5, "localhost": 5, "8888": 5, "08": 5, "58": 5, "24": [5, 6], "417": 5, "notebookapp": 5, "serv": 5, "local": [5, 7], "catherin": 5, "activ": [5, 7], "stop": 5, "shut": 5, "down": [5, 12], "twice": 5, "skip": [5, 10], "confirm": 5, "open": 5, "browser": 5, "dashboard": 5, "show": [5, 11], "file": [5, 7, 11], "subdirectori": 5, "wa": 5, "navig": 5, "interest": 5, "make": [6, 11], "minor": 6, "chang": [6, 8, 11], "statement": [6, 8], "we": [6, 7, 8], "seri": [6, 8], "short": 6, "assum": 6, "origin": [6, 11, 12], "written": [6, 8, 11], "noth": 6, "matric": 6, "matrix": 6, "matmul": 6, "prine": 6, "re": [6, 11], "4": [6, 7], "trivial": 6, "modif": 6, "note": [6, 7], "rest": [6, 11], "lik": 6, "regular": [6, 9], "what": [6, 11, 12], "under": 6, "hood": 6, "level_zero": [6, 7, 11], "actual": 6, "obvious": 6, "now": [6, 7, 8, 11], "No": [6, 8], "know": [6, 11, 12], "becaus": [6, 7, 11], "system": [6, 10, 11], "mean": [6, 7, 9, 11], "determin": 6, "oper": [6, 9, 11, 12], "our": [6, 8], "too": [6, 10, 11], "attribut": 6, "sure": 6, "inde": 6, "deivic": 6, "precis": 6, "level": [6, 9, 11, 12], "zero": [6, 7, 11], "want": [6, 7, 8, 10, 11], "reli": [6, 11], "behavior": [6, 7, 11], "so": [6, 7, 8, 11], "keyword": [6, 7, 11], "random": [6, 8, 11], "gener": [6, 8, 11], "arang": 6, "30": 6, "step": [6, 10], "option": [6, 7, 11], "filter": 6, "selector": 6, "string": 6, "proper": 6, "handl": [6, 11], "would": [6, 7, 8], "reduct": [6, 11], "75": 6, "itself": 6, "among": 6, "other": [6, 10, 11], "thing": 6, "verbos": 6, "5": [6, 11], "intel": [6, 9, 10, 12], "r": [6, 11], "hd": 6, "graphic": [6, 10], "meta": 6, "verbocitz": 6, "highest": 6, "version": [6, 10], "vendor": [6, 10, 11, 12], "corpor": [6, 8], "num": 6, "uhd": 6, "620": 6, "31": 6, "101": 6, "2111": 6, "ext_oneapi_level_zero": 6, "queri": [6, 11], "whether": [6, 11], "retriev": 6, "respect": [6, 9, 11], "object": 6, "7": [6, 7, 11], "has_gpu_devic": 6, "f": [6, 7, 11], "len": 6, "print_device_info": 6, "els": [6, 7], "snapshot": 6, "8": [6, 7, 10], "select_gpu_devic": 6, "87253657": 6, "87415047": 6, "61092713": 6, "1395424": 6, "95248436": 6, "Or": 6, "9": [6, 7, 10], "l0_gpu_0": 6, "sycldevic": 6, "cannot": [6, 9, 11], "certain": [6, 7, 11], "float64": [6, 7, 11], "doubl": 6, "amount": [6, 9], "global": 6, "etc": [6, 8, 11], "10": [6, 7, 8, 10, 11], "has_aspect_fp64": 6, "atom": [6, 11], "has_aspect_atomic64": 6, "size": [6, 8, 9], "global_mem_s": 6, "1024": [6, 8], "mb": 6, "cach": 6, "global_mem_cache_s": 6, "kb": 6, "maximum": [6, 11], "unit": 6, "max_compute_unit": 6, "true": 6, "6284": 6, "109375": 6, "512": 6, "class": 6, "still": [7, 11], "develop": [7, 8, 11], "yet": [7, 10], "reach": 7, "product": [7, 8, 9], "qualiti": 7, "particular": 7, "gap": 7, "exist": 7, "workaround": 7, "complet": [7, 10, 11], "comparison": 7, "tabl": 7, "limit": [7, 11], "dtype": [7, 8, 11], "At": [7, 11], "present": [7, 11], "float32": [7, 8, 11], "int32": 7, "int64": 7, "versatili": 7, "hint": [7, 11], "discourag": 7, "signific": [7, 11], "penalti": 7, "enabl": 7, "dpnp_raise_excepion_on_numpy_fallback": 7, "environ": 7, "variabl": 7, "take": [7, 8, 11], "n": [7, 9], "200": 7, "100": 7, "dimenci": 7, "singular": 7, "element": [7, 9], "a_np": 7, "full": 7, "a_dp": 7, "notimplementederror": 7, "traceback": 7, "recent": 7, "call": [7, 8, 9], "last": [7, 9, 11], "cell": 7, "gt": 7, "appdata": 7, "continuum": 7, "miniconda3": 7, "env": 7, "ndpex": 7, "lib": 7, "site": 7, "dpnp_iface_arraycr": 7, "747": 7, "fill_valu": 7, "usm_typ": [7, 11], "sycl_queu": 7, "738": 7, "739": 7, "dpnp_contain": 7, "740": 7, "741": 7, "744": 7, "745": 7, "call_origin": 7, "dpnp_util": 7, "dpnp_algo_util": 7, "pyx": 7, "132": 7, "request": 7, "funtion": 7, "arg": [7, 11], "20000": 7, "none": 7, "39": 7, "kwarg": 7, "isn": 7, "t": [7, 8], "current": 7, "enviro": 7, "without": [7, 8], "rase": 7, "attempt": 7, "unsupport": 7, "full_lik": 7, "time": [7, 8, 9, 11, 12], "elaps": 7, "1000": 7, "2f": 7, "m": 7, "1494": 7, "33": 7, "restart": 7, "o": 7, "config": 7, "__dpnp_raise_excepion_on_numpy_fallback__": 7, "2231": 7, "62": 7, "21": 8, "spdx": 8, "filecopyrighttext": 8, "2020": 8, "2023": 8, "licens": 8, "identifi": [8, 11], "apach": 8, "learn": [8, 10, 11], "popular": 8, "metric": 8, "machin": [8, 10], "geospati": 8, "biologi": 8, "hpc": 8, "cover": 8, "effici": [8, 11], "scale": 8, "here": 8, "dpep": 8, "optim": [8, 9, 10, 11], "out": [8, 11], "box": 8, "oneapi": [8, 11], "math": [8, 11], "download": 8, "anaconda": 8, "conda": [8, 10], "distribut": [8, 10], "record": 8, "pariwis": 8, "warn": 8, "filterwarn": 8, "ignor": 8, "pairwise_dist": 8, "data_sqr": 8, "squar": 8, "axi": [8, 11], "dot": [8, 11], "add": 8, "reshap": 8, "sqrt": 8, "ranf": 8, "astyp": 8, "calcul": [8, 11], "stock": 8, "764047861099243": 8, "convert": 8, "instead": [8, 11], "xeon": 8, "4th": 8, "though": 8, "underneath": 8, "give": [8, 11], "11": 8, "subsequ": 8, "2046055793762207": 8, "alreadi": [8, 10, 11], "speedup": 8, "center": 8, "max": 8, "remov": 8, "paramet": [8, 11], "14": 8, "012220144271850586": 8, "look": 8, "great": 8, "done": [8, 11], "prefer": 8, "With": 8, "advantag": 8, "decor": 8, "similar": 8, "rather": 8, "15": 8, "float0": 8, "opt": 8, "j": 8, "rang": 8, "d": [8, 9], "k": [8, 9], "wrapper": 8, "previou": 8, "007500171661376953": 8, "wow": 8, "16": [8, 11], "modul": 8, "after": [8, 11], "lanaguag": 8, "_pairwise_distance_kernel": 8, "get_global_id": 8, "data_dim": 8, "tmp": 8, "put": 8, "wrote": 8, "scipt": 8, "well": 8, "005505800247192383": 8, "websit": 8, "analyt": 8, "forum": 8, "love": 9, "interact": 9, "But": [9, 10], "deal": 9, "computation": 9, "heavi": 9, "compromis": 9, "commun": [9, 11], "numfocu": 9, "dedic": 9, "attent": 9, "scienc": 9, "leverag": [9, 11], "concurr": 9, "either": [9, 11], "bigger": [9, 11], "fix": 9, "reduc": 9, "simd": [9, 11], "instruct": [9, 10, 11, 12], "special": [9, 11], "vector": 9, "width": 9, "If": [9, 10, 11], "simultan": 9, "wide": 9, "faster": 9, "cisc": 9, "x86": 9, "independ": 9, "appropri": [10, 11], "fine": 10, "laptop": 10, "integr": [10, 11], "major": [10, 11], "window": 10, "up": 10, "date": 10, "updat": 10, "latest": 10, "compon": 10, "easiest": 10, "manual": 10, "shown": 10, "next": [10, 11], "section": [10, 11, 12], "pip": 10, "runtim": 10, "strongli": 10, "advis": 10, "cross": 11, "abstract": 11, "layer": 11, "domain": 11, "primit": 11, "int": 11, "complex": 11, "storag": 11, "contrast": 11, "usm_ndarrai": 11, "ndarrai": 11, "produc": 11, "bare": 11, "minimum": 11, "discret": 11, "deriv": 11, "routin": 11, "best": 11, "schedul": 11, "those": 11, "exploit": 11, "custom": 11, "By": 11, "dynam": 11, "exit": 11, "assign": 11, "enough": 11, "versatil": 11, "advanc": 11, "frequent": 11, "choos": 11, "good": 11, "choic": 11, "portabl": [11, 12], "accompani": 11, "becom": 11, "solut": 11, "scikit": 11, "establish": 11, "path": 11, "algorithm": [11, 12], "reliabl": 11, "project": 11, "back": 11, "forth": 11, "protocol": 11, "dlpack": 11, "Being": 11, "from_dlpack": 11, "view": 11, "toolkit": 11, "tool": 11, "assist": 11, "analyz": [11, 12], "issu": 11, "examin": 11, "variou": 11, "consum": 11, "impact": 11, "insight": 11, "peak": 11, "bandwidth": 11, "below": 11, "find": 11, "mechan": 11, "hotspot": 11, "analysi": [11, 12], "entir": 11, "bound": 11, "proport": 11, "spent": 11, "kei": 11, "goal": 11, "benefit": 11, "focus": 11, "latenc": 11, "regard": 11, "synchron": 11, "barrier": 11, "analys": 11, "collect": 11, "output_dir": 11, "binari": 11, "obtain": 11, "characterist": 11, "unmodifi": 11, "gui": 11, "report": 11, "setup": 11, "post": 11, "guid": 11, "primari": 11, "character": 11, "factor": 11, "roof": 11, "achiev": 11, "condit": 11, "further": 11, "capac": 11, "graph": 11, "rooflin": 11, "dir": 11, "search": 11, "src": 11, "search_dir": 11, "html": 11, "output": 11, "roofline_gpu": 11, "figur": 11, "arithmet": [11, 12], "intens": 11, "gflop": 11, "horizont": 11, "diagon": 11, "hierarchi": 11, "red": 11, "color": 11, "correspond": 11, "rel": 11, "especi": 11, "half": 11, "unlik": 11, "tradit": 11, "care": 11, "peculiar": 11, "keep": 11, "finit": 11, "tini": 11, "fraction": 11, "almost": 11, "everi": [11, 12], "induc": 11, "round": 11, "accur": 11, "ieee": [11, 12], "754": [11, 12], "2019": [11, 12], "upper": 11, "ulp": 11, "bit": 11, "mantissa": 11, "tend": 11, "accumul": 11, "slowli": 11, "five": 11, "decim": 11, "known": 11, "catastroph": 11, "cancel": 11, "small": 11, "loss": 11, "accuraci": 11, "subtract": 11, "amplifi": 11, "ident": 11, "green": 11, "trail": 11, "inaccur": 11, "due": 11, "remain": 11, "carefulli": 11, "natur": 11, "differenti": 11, "approxim": 11, "df": 11, "dx": 11, "approx": 11, "frac": 11, "delta": 11, "smaller": 11, "greater": 11, "book": [11, 12], "discuss": 11, "varieti": 11, "technic": 11, "articl": 11, "david": [11, 12], "goldberg": [11, 12], "scientist": [11, 12], "should": [11, 12], "easili": 11, "fashion": 11, "constant": 11, "observ": 11, "sign": 11, "mind": 11, "block": 11, "techniqu": 11, "interchang": 12, "vtune": 12, "bottleneck": 12, "leve": 12, "low": 12, "advisor": 12, "advic": 12, "better": 12, "composit": 12, "free": 12, "e": 12, "float": 12, "point": 12, "scientif": 12, "paper": 12, "understand": 12, "conjunct": 12, "entri": 12}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"benchmark": 0, "demo": 1, "exampl": 2, "heterogen": [3, 11], "comput": [3, 6, 11], "devic": [3, 6, 8, 10], "offload": 3, "unifi": 3, "share": 3, "memori": 3, "follow": [3, 6], "data": [3, 4, 6, 8, 9, 10, 11], "copi": 3, "between": [3, 11], "queue": 3, "creat": 3, "addit": [3, 8], "parallel": [4, 6, 8, 9, 10, 11], "extens": [4, 6, 8, 10, 11], "python": [4, 6, 8, 10, 11], "tabl": 4, "content": 4, "tutori": 5, "jupyt": [6, 7], "notebook": [6, 7], "1": [6, 10], "get": 6, "start": 6, "modifi": 6, "cpu": [6, 8], "script": [6, 8], "run": [6, 8], "gpu": [6, 8], "more": [6, 8], "alloc": 6, "advanc": [6, 8], "control": [6, 11], "librari": 6, "dpctl": [6, 11], "2": [7, 10], "fall": 7, "back": 7, "numpi": [7, 8, 11], "pairwis": 8, "distanc": 8, "open": 8, "sourc": 8, "xpu": 8, "program": [8, 11], "languag": 8, "simpl": 8, "speed": 8, "up": 8, "intel": [8, 11], "numba": [8, 11], "enhanc": 8, "dpnp": [8, 11], "further": 8, "perform": 8, "compil": 8, "gain": 8, "made": 8, "easi": 8, "ani": 8, "sycl": 8, "For": 8, "programm": 8, "inform": 8, "pleas": 8, "visit": 8, "modern": 9, "architectur": 9, "prerequisit": 10, "instal": 10, "driver": 10, "interpret": 10, "3": 10, "scalar": 11, "v": 11, "0": 11, "dimension": 11, "arrai": 11, "dpex": 11, "debug": 11, "profil": 11, "vtune": 11, "advisor": 11, "todo": [11, 12], "write": 11, "robust": 11, "numer": 11, "code": 11, "sensit": 11, "float": 11, "point": 11, "error": 11, "switch": 11, "singl": 11, "doubl": 11, "precis": 11, "us": 12, "link": 12, "companion": 12, "document": 12, "To": 12, "do": 12}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.intersphinx": 1, "nbsphinx": 4, "sphinx": 60}, "alltitles": {"Benchmarks": [[0, "id1"]], "Demos": [[1, "id1"]], "Examples": [[2, "id1"]], "Heterogeneous Computing": [[3, "id1"]], "Device Offload": [[3, "device-offload"]], "Unified Shared Memory": [[3, "unified-shared-memory"]], "Compute-Follows-Data": [[3, "compute-follows-data"]], "Copying Data Between Devices and Queues": [[3, "copying-data-between-devices-and-queues"]], "Creating Additional Queues": [[3, "creating-additional-queues"]], "Data Parallel Extensions for Python": [[4, "data-parallel-extensions-for-python"]], "Table of Contents": [[4, "table-of-contents"]], "Tutorials": [[5, "tutorials"]], "Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python": [[6, "Jupyter-Notebook-1:-Getting-started-with-Data-Parallel-Extensions-for-Python"]], "Modifying CPU script to run on GPU": [[6, "Modifying-CPU-script-to-run-on-GPU"]], "More on data allocation and the Compute-Follows-Data": [[6, "More-on-data-allocation-and-the-Compute-Follows-Data"]], "Advanced data and device control with Data Parallel Control library dpctl": [[6, "Advanced-data-and-device-control-with-Data-Parallel-Control-library-dpctl"]], "Jupyter Notebook 2: Falling back to NumPy": [[7, "Jupyter-Notebook-2:-Falling-back-to-NumPy"]], "Pairwise Distance: Open-Source XPU Programming with Data Parallel Extensions for Python* language": [[8, "Pairwise-Distance:-Open-Source-XPU-Programming-with-Data-Parallel-Extensions-for-Python*-language"]], "Simple NumPy Script": [[8, "Simple-NumPy-Script"]], "Data Parallel Extension for NumPy* Running on CPU for Additional Speed-Up": [[8, "Data-Parallel-Extension-for-NumPy*-Running-on-CPU-for-Additional-Speed-Up"]], "Data Parallel Extension for NumPy* Running on Intel GPU": [[8, "Data-Parallel-Extension-for-NumPy*-Running-on-Intel-GPU"]], "Data Parallel Extension for Numba* Enhanced DPNP Script for Further Performance and Compilation on Intel GPU": [[8, "Data-Parallel-Extension-for-Numba*-Enhanced-DPNP-Script-for-Further-Performance-and-Compilation-on-Intel-GPU"]], "Numba Performance Gains Made Easy on any SYCL device": [[8, "Numba-Performance-Gains-Made-Easy-on-any-SYCL-device"]], "For advanced programmers: SYCL Programming Made Simple by Data Parallel Extension for Numba*": [[8, "For-advanced-programmers:-SYCL-Programming-Made-Simple-by-Data-Parallel-Extension-for-Numba*"]], "For more information on Data Parallel Extensions for Python* language, please visit:": [[8, "For-more-information-on-Data-Parallel-Extensions-for-Python*-language,-please-visit:"]], "Parallelism in Modern Data-Parallel Architectures": [[9, "parallelism-in-modern-data-parallel-architectures"]], "Prerequisites and Installation": [[10, "id1"]], "1. Device Drivers": [[10, "device-drivers"]], "2. Python Interpreter": [[10, "python-interpreter"]], "3. Data Parallel Extensions for Python": [[10, "data-parallel-extensions-for-python"]], "Programming with Data Parallel Extensions for Python": [[11, "programming-with-data-parallel-extensions-for-python"]], "Scalars vs. 0-Dimensional Arrays": [[11, "scalars-vs-0-dimensional-arrays"]], "Data Parallel Extension for Numpy - dpnp": [[11, "data-parallel-extension-for-numpy-dpnp"]], "Data Parallel Extension for Numba - numba-dpex": [[11, "data-parallel-extension-for-numba-numba-dpex"]], "Data Parallel Control - dpctl": [[11, "data-parallel-control-dpctl"]], "Debugging and Profiling Data Parallel Extensions for Python": [[11, "debugging-and-profiling-data-parallel-extensions-for-python"]], "Profiling with Intel VTune Profiler": [[11, "profiling-with-intel-vtune-profiler"]], "Profiling with Intel Advisor": [[11, "profiling-with-intel-advisor"]], "Todo": [[11, "id1"], [12, null]], "Writing Robust Numerical Codes for Heterogeneous Computing": [[11, "writing-robust-numerical-codes-for-heterogeneous-computing"]], "Sensitivity to Floating-Point Errors": [[11, "sensitivity-to-floating-point-errors"]], "Switching Between Single and Double Precision": [[11, "switching-between-single-and-double-precision"]], "Useful links": [[12, "id1"]], "Companion documentation": [[12, "id2"]], "To-Do": [[12, "to-do"]]}, "indexentries": {}})
\ No newline at end of file
diff --git a/main/useful_links.html b/main/useful_links.html
new file mode 100644
index 0000000..0acfdcd
--- /dev/null
+++ b/main/useful_links.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html>
+
+<html lang="en" data-content_root="./">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Useful links &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css?v=8cc1021e" />
+    
+    <script src="_static/documentation_options.js?v=2709fde1"></script>
+    <script src="_static/doctools.js?v=888ff710"></script>
+    <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="prev" title="Demos" href="demos.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="demos.html" title="Demos">
+	  &laquo; previous
+	</a>
+	
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Useful links</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="useful-links"></span><section id="id1">
+<h1>Useful links<a class="headerlink" href="#id1" title="Link to this heading">¶</a></h1>
+<table class="docutils align-default" id="id2">
+<caption><span class="caption-text"><strong>Companion documentation</strong></span><a class="headerlink" href="#id2" title="Link to this table">¶</a></caption>
+<colgroup>
+<col style="width: 25.9%" />
+<col style="width: 74.1%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head"><p>Document</p></th>
+<th class="head"><p>Description</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p><a class="reference external" href="https://intelpython.github.io/dpnp/">Data Parallel Extension for Numpy*</a></p></td>
+<td><p>Documentation for programming NumPy-like codes on data-parallel devices</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a></p></td>
+<td><p>Documentation for programming Numba codes on data-parallel devices as you program Numba on CPU</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://intelpython.github.io/dpctl/latest/index.html">Data Parallel Control</a></p></td>
+<td><p>Documentation how to manage data and devices, how to interchange data between different tensor implementations,
+and how to write data parallel extensions</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html">Intel VTune Profiler</a></p></td>
+<td><p>Performance profiler supporting analysis of bottlenecks from function leve down to low level instructions.
+Supports Python and Numba</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/advisor.html">Intel Advisor</a></p></td>
+<td><p>Analyzes native and Python codes and provides the advice for better composition of heterogeneous algorithms</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a></p></td>
+<td><p>Standard for writing portable Numpy-like codes targeting different hardware vendors and frameworks
+operating with tensor data</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a></p></td>
+<td><p>Standard for writing C++-like codes for heterogeneous computing</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://www.apress.com/gp/book/9781484255735">DPC++</a></p></td>
+<td><p>Free e-book on how to program data-parallel devices using Data Parallel C++</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.khronos.org/opencl/">OpenCl*</a></p></td>
+<td><p>OpenCl* Standard for heterogeneous programming</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://standards.ieee.org/ieee/754/6210/">IEEE 754-2019 Standard for Floating-Point Arithmetic</a></p></td>
+<td><p>Standard for floating-point arithmetic, essential for writing robust numerical codes</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.itu.dk/~sestoft/bachelor/IEEE754_article.pdf&gt;">David Goldberg, What every computer scientist should know about floating-point arithmetic</a></p></td>
+<td><p>Scientific paper. Important for understanding how to write robust numerical code</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://numpy.org/">Numpy*</a></p></td>
+<td><p>Documentation for Numpy - foundational CPU library for array programming. Used in conjunction with
+<a class="reference external" href="https://intelpython.github.io/dpnp/">Data Parallel Extension for Numpy*</a>.</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://numba.pydata.org/">Numba*</a></p></td>
+<td><p>Documentation for Numba - Just-In-Time compiler for Numpy-like codes. Used in conjunction with
+<a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a>.</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="to-do">
+<h1>To-Do<a class="headerlink" href="#to-do" title="Link to this heading">¶</a></h1>
+<div class="admonition-todo admonition">
+<p class="admonition-title">Todo</p>
+<p>Document debugging section</p>
+</div>
+<p class="todo-source"><a class="reference internal" href="programming_dpep.html#id1"><em>original entry</em></a></p>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="demos.html"
+                          title="previous chapter">Demos</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.2.6. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/.buildinfo b/pull/44/.buildinfo
new file mode 100644
index 0000000..b00e2c1
--- /dev/null
+++ b/pull/44/.buildinfo
@@ -0,0 +1,4 @@
+# Sphinx build info version 1
+# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
+config: f6559a5f534fe3fb7c807cfbb435275b
+tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/demos/mandelbrot/mandelbrot_demo/impl/__init__.py b/pull/44/.nojekyll
similarity index 100%
rename from demos/mandelbrot/mandelbrot_demo/impl/__init__.py
rename to pull/44/.nojekyll
diff --git a/pull/44/_images/DPEP-large.png b/pull/44/_images/DPEP-large.png
new file mode 100644
index 0000000..0ccbb3d
Binary files /dev/null and b/pull/44/_images/DPEP-large.png differ
diff --git a/pull/44/_images/advisor_roofline_gen9.png b/pull/44/_images/advisor_roofline_gen9.png
new file mode 100644
index 0000000..93dfa6c
Binary files /dev/null and b/pull/44/_images/advisor_roofline_gen9.png differ
diff --git a/pull/44/_images/dpep-all.png b/pull/44/_images/dpep-all.png
new file mode 100644
index 0000000..ffa6a96
Binary files /dev/null and b/pull/44/_images/dpep-all.png differ
diff --git a/pull/44/_images/dpep-cores.png b/pull/44/_images/dpep-cores.png
new file mode 100644
index 0000000..4debbcb
Binary files /dev/null and b/pull/44/_images/dpep-cores.png differ
diff --git a/pull/44/_images/dpep-ilp.png b/pull/44/_images/dpep-ilp.png
new file mode 100644
index 0000000..ddf8725
Binary files /dev/null and b/pull/44/_images/dpep-ilp.png differ
diff --git a/pull/44/_images/dpep-simd.png b/pull/44/_images/dpep-simd.png
new file mode 100644
index 0000000..8f2e078
Binary files /dev/null and b/pull/44/_images/dpep-simd.png differ
diff --git a/pull/44/_images/fp-cancellation.png b/pull/44/_images/fp-cancellation.png
new file mode 100644
index 0000000..6163146
Binary files /dev/null and b/pull/44/_images/fp-cancellation.png differ
diff --git a/pull/44/_images/hetero-devices.png b/pull/44/_images/hetero-devices.png
new file mode 100644
index 0000000..4d9e491
Binary files /dev/null and b/pull/44/_images/hetero-devices.png differ
diff --git a/pull/44/_images/kernel-queue-device.png b/pull/44/_images/kernel-queue-device.png
new file mode 100644
index 0000000..15482f5
Binary files /dev/null and b/pull/44/_images/kernel-queue-device.png differ
diff --git a/pull/44/_images/queue-exception1.png b/pull/44/_images/queue-exception1.png
new file mode 100644
index 0000000..b707ab9
Binary files /dev/null and b/pull/44/_images/queue-exception1.png differ
diff --git a/pull/44/_images/queue-exception2.png b/pull/44/_images/queue-exception2.png
new file mode 100644
index 0000000..003b06b
Binary files /dev/null and b/pull/44/_images/queue-exception2.png differ
diff --git a/pull/44/_images/queue-exception3.png b/pull/44/_images/queue-exception3.png
new file mode 100644
index 0000000..630cd12
Binary files /dev/null and b/pull/44/_images/queue-exception3.png differ
diff --git a/pull/44/_sources/benchmarks.rst.txt b/pull/44/_sources/benchmarks.rst.txt
new file mode 100644
index 0000000..4942f25
--- /dev/null
+++ b/pull/44/_sources/benchmarks.rst.txt
@@ -0,0 +1,40 @@
+.. _benchmarks:
+.. include:: ./ext_links.txt
+
+Benchmarks
+==========
+
+**Data Parallel Extensions for Python** provide a set of
+`benchmarks <https://github.com/IntelPython/dpbench>`_ illustrating different aspects of
+implementing the performant code with Data Parallel Extensions for Python.
+Benchmarks represent some real life numerical problem or some important part (kernel) of real life application.
+Each application/kernel is implemented in several variants (not necessarily all variants):
+
+- Pure Python: Typically the slowest and used just as a reference implementation
+
+- ``numpy``: Same application/kernel implemented using NumPy library
+
+- ``dpnp``: Modified numpy implementation to run on a specific device. You can use numpy as a baseline while evaluating the dpnp implementation and its performance
+
+- ``numba @njit`` array-style: application/kernel implemented using NumPy and compiled with Numba. You can use numpy as a baseline when evaluate numba @njit array-style implementat and its performance
+
+- ``numba @njit`` direct loops (prange): Same application/kernel implemented using Numba compiler using direct loops. Sometimes array-style programming is cumbersome and performance inefficient. Using direct loop programming may lead to more readable and performance code. Thus, while evaluating the performance of direct loop implementation it is useful to compare array-style Numba implementation as a baseline
+
+- ``numba-dpex @dpjit`` array-style: Modified numba @njit array-style implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing numba-dpex implementation details and performance. You can also compare it against dpnp implementation to see how much extra performance numba-dpex can bring when you compile NumPy code for a given device
+
+- ``numba-dpex @dpjit`` direct loops (prange): Modified numba @njit direct loop implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing numba-dpex implementation details and performance. You can also compare it against dpnp implementation to see how much extra performance numba-dpex can bring when you compile NumPy code for a given device
+
+- ``numba-dpex @dpjit`` kernel: Kernel-style programming, which is close to @cuda.jit programming model used in vanilla Numba
+
+- ``numba-mlir``: Array-style, direct loops and kernel-style implementations for experimental MLIR-based backend for Numba
+
+- ``cupy``: NumPy-like implementation using CuPy to run on CUDA-compatible devices
+
+- ``@cuda.jit``: Kernel-style Numba implementation to run on CUDA-compatible devices
+
+- Native SYCL: Most applications/kernels also have DPC++ implementation, which can be used to compare performance of above implementations to DPC++ compiled code.
+
+These benchmarks are implemented in ``dpbench`` framework, which allows you to run all or select benchmarks and variants to evaluate their performance on different hardware.
+
+For more details please refer to ``dpbench``
+`documentation <https://github.com/IntelPython/dpbench/blob/main/README.md>`_.
diff --git a/pull/44/_sources/demos.rst.txt b/pull/44/_sources/demos.rst.txt
new file mode 100644
index 0000000..452d097
--- /dev/null
+++ b/pull/44/_sources/demos.rst.txt
@@ -0,0 +1,19 @@
+.. _demos:
+.. include:: ./ext_links.txt
+
+Demos
+=====
+
+There are several demo applications illustrating the power of the **Data Parallel Extensions for Python**. They are:
+
+- `Monte Carlo Pi <https://github.com/IntelPython/DPEP/tree/main/demos/mcpi>`_
+  The Monte Carlo method to estimate the value of :math:`\pi`.
+
+- `Mandelbrot Set <https://github.com/IntelPython/DPEP/tree/main/demos/mandelbrot>`_
+  Visualization of the breathtaking process of diving in the famous Mandelbrot fractal
+
+- `Game of Life <https://github.com/IntelPython/DPEP/tree/main/demos/game-of-life>`_
+  Visualization of the life evolution using famous Conway's model
+
+All demos are located in the `GitHub repository <https://github.com/IntelPython/DPEP/tree/main/demos>`_.
+For more details please refer to the documentation located in the individual demo directory.
diff --git a/pull/44/_sources/examples.rst.txt b/pull/44/_sources/examples.rst.txt
new file mode 100644
index 0000000..ab28d17
--- /dev/null
+++ b/pull/44/_sources/examples.rst.txt
@@ -0,0 +1,41 @@
+.. _examples:
+.. include:: ./ext_links.txt
+
+Examples
+========
+All examples are located in the `GitHub repository <https://github.com/IntelPython/DPEP/tree/main/examples>`_.
+Their names start with the 2-digit number followed by a descriptive name.
+You can run examples in any order, however, if
+you are new to the Data Parallel Extensions for Python, it is recommended to go in the order examples are enumerated.
+
+The following command will run the very first example of using Data Parallel Extensions for Python
+
+.. code-block:: console
+
+    python ./examples/01-hello_dpnp.py
+
+These are listings of these examples:
+
+.. literalinclude:: ../../examples/01-hello_dpnp.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 01:** Your first NumPy code running on GPU
+   :name: examples_01_hello_dpnp
+
+.. literalinclude:: ../../examples/02-dpnp_device.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 02:** Select device type while creating array
+   :name: examples_02_dpnp_device
+
+.. literalinclude:: ../../examples/03-dpnp2numba-dpex.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 03:** Compile dpnp code with numba-dpex
+   :name: examples_03_dpnp2numba_dpex
+
+.. literalinclude:: ../../examples/04-dpctl_device_query.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 04:** Get information about devices
+   :name: examples_04_dpctl_device_query
diff --git a/pull/44/_sources/heterogeneous_computing.rst.txt b/pull/44/_sources/heterogeneous_computing.rst.txt
new file mode 100644
index 0000000..afe5890
--- /dev/null
+++ b/pull/44/_sources/heterogeneous_computing.rst.txt
@@ -0,0 +1,148 @@
+.. _heterogeneous_computing:
+.. include:: ./ext_links.txt
+
+Heterogeneous Computing
+=======================
+
+Device Offload
+**************
+
+Python is an interpreted language, which implies that most of the Python script will run on CPU,
+and only a few data parallel regions will execute on data parallel devices.
+That is why the concept of the host and offload devices is helpful when it comes to conceptualizing
+a heterogeneous programming model in Python.
+
+.. image:: ./_images/hetero-devices.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+The above diagram illustrates the *host* (the CPU which runs Python interpreter) and three *devices*
+(two GPU devices and one attached accelerator device). **Data Parallel Extensions for Python**
+offer a programming model where a script executed by Python interpreter on the host can *offload* data-parallel
+kernels to a user-specified device. A *kernel* is the *data-parallel region* of a program submitted
+for execution on the device. There can be multiple data-parallel regions, and hence multiple *offload kernels*.
+
+Kernels can be pre-compiled into a library, such as ``dpnp``, or directly coded
+in a programming language for heterogeneous computing, such as `OpenCl*`_ or `DPC++`_ .
+**Data Parallel Extensions for Python** offer the way of writing kernels directly in Python
+using `Numba*`_ compiler along with ``numba-dpex``, the `Data Parallel Extension for Numba*`_.
+
+One or more kernels are submitted for execution into a *queue* targeting an *offload device*.
+For each device, you can create one or more queues. In most cases, you do not need to work
+with device queues directly. Data Parallel Extensions for Python will do necessary underlying
+work with queues for you through the :ref:`Compute-Follows-Data`.
+
+Unified Shared Memory
+*********************
+
+Each device has its memory, not necessarily accessible from another device.
+
+.. image:: ./_images/hetero-devices.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+For example, **Device 1** memory may not be directly accessible from the host but accessible
+via expensive copying by a driver software. Similarly, depending on the architecture, direct data
+exchange between **Device 2** and **Device 1** may be only impossible possible via expensive
+copying through the host memory. These aspects must be taken into consideration when programming
+data parallel devices.
+
+On the illustration above the **Device 2** logically consists of two sub-devices: **Sub-Device 1**
+and **Sub-Device 2**. The programming model allows accessing **Device 2** as a single logical device, or
+by working with each individual sub-devices. For the former case a programmer needs to create
+a queue for **Device 2**. For the latter case a programmer needs to create 2 queues, one for each sub-device.
+
+`SYCL*`_ standard introduces a concept of the *Unified Shared Memory* (USM). USM requires hardware support
+for unified virtual address space, which allows coherency between the host and the device
+pointers. The host allocates all memory, but offers three distinct allocation types:
+
+* **Host: located on the host, accessible by the host or device.** This type of memory is useful in a situation
+  when you need to stream read-only data from the host to the device once.
+
+* **Device: located on the device, accessible by device only.** The fastest type of memory.
+  Useful in a situation when most of the data crunching happens on the device.
+
+* **Shared: location is both host and device, accessible by the host and device**.
+  Shared allocations are useful when both host and device access data,
+  since a user does not need to manage data migration explicitly.
+  However, it is much slower than the USM Device memory type.
+
+Compute-Follows-Data
+********************
+Since data copying between devices is typically very expensive, for performance reasons it is essential
+to process data close to where it is allocated. This is the premise of the *Compute-Follows-Data* programming model,
+which states that the compute happens where the data resides. Tensors implemented in ``dpctl`` and ``dpnp``
+carry information about allocation queues, and hence, about the device on which an array is allocated.
+Based on tensor input arguments of the offload kernel, it deduces the queue on which the execution happens.
+
+.. image:: ./_images/kernel-queue-device.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+The picture above illustrates the *Compute-Follows-Data* concept. Arrays ``A`` and ``B`` are inputs to the
+**Offload Kernel**. These arrays carry information about their *allocation queue* (**Device Queue**) and the
+*device* (**Device 1**) where they were created. According to the Compute-Follows-Data paradigm
+the **Offload Kernel** will be submitted to this **Device Queue**, and the resulting array ``C`` will
+be created on the **Device Queue** associated with the **Device 1**.
+
+**Data Parallel Extensions for Python** require all input tensor arguments to have the **same** allocation queue.
+Otherwise, an exception is thrown. For example, the following usages will result in an exception.
+
+.. figure:: ./_images/queue-exception1.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+    Input tensors are on different devices and different queues. Exception is thrown.
+
+.. figure:: ./_images/queue-exception2.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+    Input tensors are on the same device, but queues are different. Exception is thrown.
+
+.. figure:: ./_images/queue-exception3.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+    Data belongs to the same device, but queues are different and associated with different sub-devices.
+
+Copying Data Between Devices and Queues
+***************************************
+
+**Data Parallel Extensions for Python** create **one** *canonical queue* per device. Normally,
+you do not need to directly manage queues. Having one canonical queue per device
+allows you to copy data between devices using the ``to_device()`` method:
+
+.. code-block:: python
+
+   a_new = a.to_device(b.device)
+
+Array ``a`` is copied to the device associated with array ``b`` into the new array ``a_new``.
+The same queue is associated with ``b`` and ``a_new``.
+
+Alternatively, you can do this as follows:
+
+.. code-block:: python
+    :caption: DPNP array
+
+    a_new = dpnp.asarray(a, device=b.device)
+
+.. code-block:: python
+    :caption: DPCtl array
+
+    a_new = dpctl.tensor.asarray(a, device=b.device)
+
+Creating Additional Queues
+**************************
+
+As said before, **Data Parallel Extensions for Python** automatically creates one canonical queue per device,
+and you normally work with this queue implicitly. However, you can always create as many additional queues per device
+as needed and work explicitly with them, for example, for profiling purposes.
+
+Read `Data Parallel Control`_ documentation for more details about queues.
diff --git a/pull/44/_sources/index.rst.txt b/pull/44/_sources/index.rst.txt
new file mode 100644
index 0000000..49fdf23
--- /dev/null
+++ b/pull/44/_sources/index.rst.txt
@@ -0,0 +1,36 @@
+.. _index:
+.. include:: ./ext_links.txt
+
+.. image:: ./_images/DPEP-large.png
+    :width: 400px
+    :align: center
+    :alt: Data Parallel Extensions for Python
+
+Data Parallel Extensions for Python
+===================================
+
+Data Parallel Extensions for Python* extend numerical Python capabilities beyond CPU and allow even higher performance
+gains on data parallel devices, such as GPUs. It consists of three foundational packages:
+
+* **dpnp** - Data Parallel Extensions for `Numpy*`_ - a library that implements a subset of
+  Numpy that can be executed on any data parallel device. The subset is a drop-in replacement
+  of core Numpy functions and numerical data types.
+* **numba_dpex** - Data Parallel Extensions for `Numba*`_ - an extension for Numba compiler
+  that lets you program data-parallel devices as you program CPU with Numba.
+* **dpctl - Data Parallel Control library** that provides utilities for device selection,
+  allocation of data on devices, tensor data structure along with `Python* Array API Standard`_ implementation, and support for creation of user-defined data-parallel extensions.
+
+Table of Contents
+*****************
+.. toctree::
+    :maxdepth: 2
+
+    prerequisites_and_installation
+    parallelism
+    heterogeneous_computing
+    programming_dpep
+    examples
+    jupyter_notebook
+    benchmarks
+    demos
+    useful_links
diff --git a/pull/44/_sources/jupyter_notebook.rst.txt b/pull/44/_sources/jupyter_notebook.rst.txt
new file mode 100644
index 0000000..6292fd0
--- /dev/null
+++ b/pull/44/_sources/jupyter_notebook.rst.txt
@@ -0,0 +1,40 @@
+.. _jupyter_notebook:
+.. include:: ./ext_links.txt
+
+Tutorials
+*********
+
+Getting started Jupyter* Notebooks illustrating the usage of **Data Parallel Extensions for Python** are located
+in the `GitHub repository <https://github.com/IntelPython/DPEP/tree/main/notebooks>`_
+
+To run the tutorial, in the command line prompt type:
+
+.. code-block:: console
+
+    jupyter notebook
+
+This will print some information about the notebook server in your terminal, including the URL of
+the web application (by default, ``http://localhost:8888``):
+
+
+.. code-block:: console
+
+    $ jupyter notebook
+    [I 08:58:24.417 NotebookApp] Serving notebooks from local directory: /Users/catherine
+    [I 08:58:24.417 NotebookApp] 0 active kernels
+    [I 08:58:24.417 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/
+    [I 08:58:24.417 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
+    It will then open your default web browser to this URL.
+
+When the notebook opens in your browser, you will see the Notebook Dashboard,
+which will show a list of the notebooks, files, and subdirectories
+in the directory where the notebook server was started.
+Navigate to the notebook of your interest and open it in the dashboard.
+
+For more information please refer to `Jupyter documentation <https://docs.jupyter.org/en/latest/running.html>`_
+
+.. toctree::
+   :maxdepth: 1
+
+   Getting Started <notebooks/01-get_started.ipynb>
+   Controlling `dpnp` fallback to `numpy` <notebooks/02-dpnp_numpy_fallback.ipynb>
diff --git a/pull/44/_sources/notebooks/01-get_started.ipynb.txt b/pull/44/_sources/notebooks/01-get_started.ipynb.txt
new file mode 100644
index 0000000..e0a970a
--- /dev/null
+++ b/pull/44/_sources/notebooks/01-get_started.ipynb.txt
@@ -0,0 +1,490 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "a002ea61",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "# Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python\n",
+    "<img src=\"https://intelpython.github.io/DPEP/main/_images/DPEP-large.png\" width=\"300\"/>\n",
+    "\n",
+    "[Data Parallel Extensions for Python](https://intelpython.github.io/DPEP/main/) allow you to run NumPy-like code beyond CPU using **Data Parallel Extension for NumPy**. It will also allow you to compile the code using **Data Parallel Extension for Numba**. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0565bf88-a3e9-4ee3-a815-3efe977c2a8f",
+   "metadata": {
+    "jp-MarkdownHeadingCollapsed": true,
+    "tags": []
+   },
+   "source": [
+    "## Modifying CPU script to run on GPU\n",
+    "\n",
+    "In many cases the process of running Python on GPU is about making minor changes to your CPU script, which are:\n",
+    "1. Changing import statement(s)\n",
+    "2. Specifying on which device(s) the data is allocated\n",
+    "3. Explicitly copying data between devices and the host as needed\n",
+    "\n",
+    "We will illustrate these concepts on series of short examples. Let's assume we have the following NumPy script originally written to run on CPU, which is nothing more than creating two matrices `x` and `y` and performing matrix-matrix multiplication with `numpy.matmul()`, and prining the resulting matrix:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "d9e8711d",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[2 2]\n",
+      " [2 2]]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# CPU script for matrix-matrix multiplication using NumPy\n",
+    "\n",
+    "# 1. Import numpy\n",
+    "import numpy as np\n",
+    "\n",
+    "# 2. Create two matrices\n",
+    "x = np.array([[1, 1], [1, 1]])\n",
+    "y = np.array([[1, 1], [1, 1]])\n",
+    "\n",
+    "# 3. Perform matrix-matrix multiplication\n",
+    "res = np.matmul(x, y)\n",
+    "\n",
+    "# 4. Print resulting matrix\n",
+    "print(res)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "402c3d61",
+   "metadata": {},
+   "source": [
+    "As stated before in many cases to run the same code on GPU is a trivial modification of a few lines of the code, like this:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "c10b7d83",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[2 2]\n",
+      " [2 2]]\n",
+      "Array x is allocated on the device: Device(level_zero:gpu:0)\n",
+      "Array y is allocated on the device: Device(level_zero:gpu:0)\n",
+      "res is allocated on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Modified script to run the same code on GPU using dpnp\n",
+    "\n",
+    "# 1. Import dpnp\n",
+    "import dpnp as np  # Note, we changed the import statement. Since dpnp is a drop-in replacement of numpy the rest of the code will run lik regular numpy\n",
+    "\n",
+    "# 2. Create two matrices\n",
+    "x = np.array([[1, 1], [1, 1]])\n",
+    "y = np.array([[1, 1], [1, 1]])\n",
+    "\n",
+    "# 3. Perform matrix-matrix multiplication\n",
+    "res = np.matmul(x, y)\n",
+    "\n",
+    "# 4. Print what's going on under the hood\n",
+    "print(res)\n",
+    "print(\"Array x is allocated on the device:\", x.device)\n",
+    "print(\"Array y is allocated on the device:\", y.device)\n",
+    "print(\"res is allocated on the device:\", res.device)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d6a58f17",
+   "metadata": {},
+   "source": [
+    "Let's see what we actually changed.\n",
+    "\n",
+    "1. Obviously we changed the import statement. Now we import `dpnp`, which is a drop-in replacement for a subset of `numpy` that extends numpy-like codes beyond CPU\n",
+    "2. No change in matrix creation code. How does `dpnp` know that matrices `x` and `y` need to be allocated on GPU? This is because, if we do not specify the device explicitly, the driver will use the default device, which is GPU on systems with installed GPU drivers.\n",
+    "3. No change in matrix multiplication code. This is because `dpnp` programming model is the Compute-Follows-Data. It means that `dpnp.matmul()` determines which device will execute an operation based on where array inputs are allocated. Since our inputs `x` and `y` are allocated on the default device (GPU) the matrix-matrix multiplication will follow data allocation and execute on GPU too.\n",
+    "4. Note, arrays `x`, `y`, `res` all have the `device` attribute by printing which we make sure that all inputs are indeed on the GPU device, and the result is also on the GPU deivice. To be precise the data allocation (and execution) happened on GPU device 0 through Level-Zero driver."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "be340585",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "## More on data allocation and the Compute-Follows-Data\n",
+    "\n",
+    "Sometimes you may want to be specific about the device type, not relying on the default behavior. You can do so by specifying the device in a keyword arguments for `dpnp` array creation functions and random number generators."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "0435d7f0",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import dpnp as np\n",
+    "\n",
+    "a = np.arange(3, 30, step = 6, device=\"gpu\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a6765095",
+   "metadata": {},
+   "source": [
+    "`dpnp.arange()` is the array creation function that has optional keyword argument `device`, using which you can specify the device you want data to be allocated on with filter selector string. In our case the string specifies device type `\"gpu\"`. The proper way of handling situations when the specified device is not available would be as follows:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "e613398f",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "The a is allocated on the device: Device(level_zero:gpu:0)\n",
+      "Reduction sum y:  75\n",
+      "Result y is located on the device: Device(level_zero:gpu:0)\n",
+      "y.shape= ()\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpnp as np\n",
+    "\n",
+    "try:\n",
+    "    a = np.arange(3, 30, step = 6, device=\"gpu\")\n",
+    "    print(\"The a is allocated on the device:\", a.device)\n",
+    "except:\n",
+    "    print(\"GPU device is not available\")\n",
+    "    # Do some fallback code\n",
+    "\n",
+    "# Do reduction on the selected device\n",
+    "y = np.sum(a)\n",
+    "\n",
+    "print(\"Reduction sum y: \", y)  # Expect 75\n",
+    "print(\"Result y is located on the device:\", y.device)\n",
+    "print(\"y.shape=\", y.shape)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "88b4915e",
+   "metadata": {},
+   "source": [
+    "Note that `y` is itself a device array (not a scalar!), its data resides on the same device as input array `a`."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "94cb3b9b",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "### Advanced data and device control with Data Parallel Control library `dpctl`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9fb4b1b5",
+   "metadata": {},
+   "source": [
+    "Data Parallel Control library, `dpctl`, among other things provide advanced capabilities for controling devices and data. Among its useful functions is `dpctl.lsplatform(verbosity)`, printing information about the list of available devices on the system with different levels of verbosity:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "b890ae71",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Intel(R) OpenCL HD Graphics OpenCL 3.0 \n",
+      "Intel(R) Level-Zero 1.3\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "dpctl.lsplatform()  # Print platform information"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "db5e8db4",
+   "metadata": {},
+   "source": [
+    "Using a different verbosity setting to print extra meta-data:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "ffcf0cfb",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Platform  0 ::\n",
+      "    Name        Intel(R) OpenCL HD Graphics\n",
+      "    Version     OpenCL 3.0 \n",
+      "    Vendor      Intel(R) Corporation\n",
+      "    Backend     opencl\n",
+      "    Num Devices 1\n",
+      "      # 0\n",
+      "        Name                Intel(R) UHD Graphics 620\n",
+      "        Version             31.0.101.2111\n",
+      "        Filter string       opencl:gpu:0\n",
+      "Platform  1 ::\n",
+      "    Name        Intel(R) Level-Zero\n",
+      "    Version     1.3\n",
+      "    Vendor      Intel(R) Corporation\n",
+      "    Backend     ext_oneapi_level_zero\n",
+      "    Num Devices 1\n",
+      "      # 0\n",
+      "        Name                Intel(R) UHD Graphics 620\n",
+      "        Version             1.3.0\n",
+      "        Filter string       level_zero:gpu:0\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "dpctl.lsplatform(2)  # Print platform information with verbocitz level 2 (highest level)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f63525d3",
+   "metadata": {},
+   "source": [
+    "You can also query whether system has GPU devices and retrieve respective device objects:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "84ff47e9",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "This system has 2 GPUs\n",
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  31.0.101.2111\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   opencl:gpu:0\n",
+      "\n",
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Array x is on the device: Device(opencl:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "import dpnp as np\n",
+    "\n",
+    "if dpctl.has_gpu_devices():\n",
+    "    devices = dpctl.get_devices(device_type='gpu')\n",
+    "    print(f\"This system has {len(devices)} GPUs\")\n",
+    "    for device in devices:\n",
+    "        device.print_device_info()\n",
+    "        \n",
+    "    x = np.array([1, 2, 3], device=devices[0])  # Another way of selecting on which device to allocate the data\n",
+    "    print(\"Array x is on the device:\", x.device)\n",
+    "else:\n",
+    "    print(\"GPU devices are not available on this system\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e0918733-0992-41e8-bfa5-228a080bc165",
+   "metadata": {},
+   "source": [
+    "The following snapshot illustrates how to select the default GPU device using `dpctl` and generate an array of random numbers on this device:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "1c068447",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Array x: [0.87253657 0.87415047 0.61092713 0.1395424  0.95248436]\n",
+      "Array x.device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "try:\n",
+    "    gpu = dpctl.select_gpu_device()\n",
+    "    gpu.print_device_info() # print GPU device information\n",
+    "    x = np.random.random(5, device=gpu)  # Create array of random numbers on the default GPU device\n",
+    "    print(\"Array x:\", x)\n",
+    "    print(\"Array x.device:\", x.device)\n",
+    "except:\n",
+    "    print (\"No GPU devices available\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c378b79d",
+   "metadata": {},
+   "source": [
+    "Or by creating GPU device object from the filter selector string:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "ad83abb5",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "try:\n",
+    "    l0_gpu_0 = dpctl.SyclDevice(\"level_zero:gpu:0\")\n",
+    "    l0_gpu_0.print_device_info()\n",
+    "except:\n",
+    "    print(\"Cannot create the device object from a given filter selector string\")    "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "eadefe0b",
+   "metadata": {},
+   "source": [
+    "The following snapshot checks whether a given device supports certain aspects, which may be important for the application, such as support for float64 (double precision) or the amount of available global memory on the device, etc."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "a94756d7",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Has double precision: True\n",
+      "Has atomic operations support: True\n",
+      "Global memory size: 6284.109375 MB\n",
+      "Global memory cache size: 512.0 KB\n",
+      "Maximum compute units: 24\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "try:\n",
+    "    gpu = dpctl.select_gpu_device()\n",
+    "    gpu.print_device_info()\n",
+    "    print(\"Has double precision:\", gpu.has_aspect_fp64)\n",
+    "    print(\"Has atomic operations support:\", gpu.has_aspect_atomic64)\n",
+    "    print(f\"Global memory size: {gpu.global_mem_size/1024/1024} MB\")\n",
+    "    print(f\"Global memory cache size: {gpu.global_mem_cache_size/1024} KB\")\n",
+    "    print(f\"Maximum compute units: {gpu.max_compute_units}\")\n",
+    "except:\n",
+    "    print(\"The GPU device is not available\")   "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "97b53113-8264-4f7e-9a9d-a997e70ed3bc",
+   "metadata": {},
+   "source": [
+    "For more information about `dpctl` device selection please refer to [Data Parallel Control: Device Selection](https://intelpython.github.io/dpctl/latest/docfiles/user_guides/manual/dpctl/device_selection.html)\n",
+    "\n",
+    "For more information about `dpctl.SyclDevice` class methods and attributes please refer to [Data Parallel Control: dpctl.SyclDevice](https://intelpython.github.io/dpctl/latest/docfiles/dpctl/SyclDevice.html)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pull/44/_sources/notebooks/02-dpnp_numpy_fallback.ipynb.txt b/pull/44/_sources/notebooks/02-dpnp_numpy_fallback.ipynb.txt
new file mode 100644
index 0000000..ca03c12
--- /dev/null
+++ b/pull/44/_sources/notebooks/02-dpnp_numpy_fallback.ipynb.txt
@@ -0,0 +1,196 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "be340585",
+   "metadata": {},
+   "source": [
+    "# Jupyter Notebook 2: Falling back to NumPy"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9008dbe5",
+   "metadata": {},
+   "source": [
+    "**Data Parallel Extensions for Python** are still in active development and have not yet reached production quality. This in particular means that some functional and performance gaps may exist in certain `dpnp` functions that require workarounds. The functional gaps include:\n",
+    "\n",
+    "* Certain NumPy APIs are not supported. For complete reference please see the [comparison table](https://intelpython.github.io/dpnp/reference/comparison.html) for **Data Parallel Extension for NumPy**.\n",
+    "* Limited support of `dtypes`. At present the **Data Parallel Extension for NumPy** supports `float32`, `float64`, `int32`, and `int64` types.\n",
+    "* Certain keyword arguments are supported for default settings only. Please refer to the [Data Parallel Extension for NumPy API Reference](https://intelpython.github.io/dpnp/reference/index.html) for details.\n",
+    "\n",
+    "Since NumPy API is versatily there are typically some workaround options exist. Please refer to [Data Parallel Extension for NumPy API Reference](https://intelpython.github.io/dpnp/reference/index.html) and [NumPy documentation](https://numpy.org/doc/stable/) for hints for possible alternatives.\n",
+    "\n",
+    "Another possible workaround is to fall back to the host and execute the script via NumPy. This is a discouraged use because it typically results in significant performance penalties associated with copying data from the device to the host and back. However, for debugging purposes you may still want to enable this behavior.\n",
+    "\n",
+    "To do so you must set the `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` environment variable to `0`.\n",
+    "\n",
+    "Let's take the following example:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "c78511cd",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n"
+     ]
+    },
+    {
+     "ename": "NotImplementedError",
+     "evalue": "Requested funtion=full with args=((20000, 20000), 3.0, None, 'C') and kwargs={'like': array([])} isn't currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception.",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mNotImplementedError\u001b[0m                       Traceback (most recent call last)",
+      "Cell \u001b[1;32mIn[3], line 9\u001b[0m\n\u001b[0;32m      7\u001b[0m a_np \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39mfull((N, N), \u001b[38;5;241m3.\u001b[39m, like \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39mzeros((N, \u001b[38;5;241m0\u001b[39m)))\n\u001b[0;32m      8\u001b[0m \u001b[38;5;28mprint\u001b[39m(a_np)\n\u001b[1;32m----> 9\u001b[0m a_dp \u001b[38;5;241m=\u001b[39m \u001b[43mdpnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfull\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mN\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mN\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m3.\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlike\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mdpnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mzeros\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mN\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     10\u001b[0m \u001b[38;5;28mprint\u001b[39m(a_dp)\n",
+      "File \u001b[1;32m~\\AppData\\Local\\Continuum\\miniconda3\\envs\\ndpex-examples\\lib\\site-packages\\dpnp\\dpnp_iface_arraycreation.py:747\u001b[0m, in \u001b[0;36mfull\u001b[1;34m(shape, fill_value, dtype, order, like, device, usm_type, sycl_queue)\u001b[0m\n\u001b[0;32m    738\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m    739\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m dpnp_container\u001b[38;5;241m.\u001b[39mfull(shape,\n\u001b[0;32m    740\u001b[0m                                fill_value,\n\u001b[0;32m    741\u001b[0m                                dtype\u001b[38;5;241m=\u001b[39mdtype,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    744\u001b[0m                                usm_type\u001b[38;5;241m=\u001b[39musm_type,\n\u001b[0;32m    745\u001b[0m                                sycl_queue\u001b[38;5;241m=\u001b[39msycl_queue)\n\u001b[1;32m--> 747\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcall_origin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnumpy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfull\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshape\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlike\u001b[49m\u001b[43m)\u001b[49m\n",
+      "File \u001b[1;32mdpnp\\dpnp_utils\\dpnp_algo_utils.pyx:132\u001b[0m, in \u001b[0;36mdpnp.dpnp_utils.dpnp_algo_utils.call_origin\u001b[1;34m()\u001b[0m\n",
+      "\u001b[1;31mNotImplementedError\u001b[0m: Requested funtion=full with args=((20000, 20000), 3.0, None, 'C') and kwargs={'like': array([])} isn't currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception."
+     ]
+    }
+   ],
+   "source": [
+    "import dpnp\n",
+    "import numpy\n",
+    "\n",
+    "N = 200*100\n",
+    "\n",
+    "# Create an two dimencial array with singular element and array like option\n",
+    "a_np = numpy.full((N, N), 3., like = numpy.zeros((N, 0)))\n",
+    "print(a_np)\n",
+    "a_dp = dpnp.full((N, N), 3., like = dpnp.zeros((N, 0)))\n",
+    "print(a_dp)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ae026021",
+   "metadata": {},
+   "source": [
+    "We are attempting to call `dpnp.full()` function with the keyword argument `like` set to another `dpnp` array, which is currently unsupported. A possible alternative would be to use `dpnp.full_like` function:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "5e588080-484a-44f4-a168-7d07f760c7a0",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Elapsed 1494.33 ms\n",
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n",
+      "Array a is located on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "from time import time\n",
+    "\n",
+    "t = time()\n",
+    "a = dpnp.full_like(dpnp.zeros((N, 0)), 3., shape=(N, N))\n",
+    "print(f\"Elapsed {(time()-t)*1000:.2f} ms\")\n",
+    "print(a)\n",
+    "print(\"Array a is located on the device:\", a.device)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "210440c3",
+   "metadata": {},
+   "source": [
+    "Now we enable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to fall back to NumPy in case of `NotImplementedError`."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bca7490d",
+   "metadata": {},
+   "source": [
+    "**Note: Restart Jupyter Notebook kernel before running the following code** "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "05ad1565",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK = 0\n",
+      "Elapsed 2231.62 ms\n",
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n",
+      "Array a is located on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "import os\n",
+    "os.environ[\"DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK\"] = \"0\" \n",
+    "\n",
+    "import dpnp as np\n",
+    "print (\"DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK =\", np.config.__DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK__)  # Expect 0\n",
+    "\n",
+    "from time import time\n",
+    "\n",
+    "N = 200*100\n",
+    "\n",
+    "t = time()\n",
+    "a = np.full((N, N), 3., like = np.zeros((N, 0)))\n",
+    "print(f\"Elapsed {(time()-t)*1000:.2f} ms\")\n",
+    "print(a)\n",
+    "print(\"Array a is located on the device:\", a.device)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pull/44/_sources/parallelism.rst.txt b/pull/44/_sources/parallelism.rst.txt
new file mode 100644
index 0000000..e1078e2
--- /dev/null
+++ b/pull/44/_sources/parallelism.rst.txt
@@ -0,0 +1,43 @@
+.. _parallelism:
+.. include:: ./ext_links.txt
+
+Parallelism in Modern Data-Parallel Architectures
+=================================================
+
+Python is loved for its productivity and interactivity. But when it comes to dealing with
+computationally heavy codes, Python performance cannot be compromised. Intel and Python numerical
+computing communities, such as `NumFOCUS <https://numfocus.org/>`_, dedicate attention to
+optimizing core numerical and data science packages for leveraging parallelism available in modern CPUs:
+
+* **Multiple computational cores:** Several computational cores allow to process the data concurrently.
+  Compared to a single-core CPU, *N* cores can process either *N* times bigger data in a fixed time, or
+  reduce a computation time *N* times for a set amount of data.
+
+.. image:: ./_images/dpep-cores.png
+    :width: 600px
+    :align: center
+    :alt: Multiple CPU Cores
+
+* **SIMD parallelism:** SIMD (Single Instruction Multiple Data) is a special type of instructions
+  that perform operations on vectors of data elements at the same time. The size of vectors is called the SIMD width.
+  If a SIMD width is *K* then a SIMD instruction can process *K* data elements in parallel.
+
+  In the following diagram, the SIMD width is 2, which means that a single instruction processes two elements simultaneously.
+  Compared to regular instructions that process one element at a time, 2-wide SIMD instruction performs
+  two times more data in fixed time, or, respectively, process a fixed amount of data two times faster.
+
+.. image:: ./_images/dpep-simd.png
+    :width: 150px
+    :align: center
+    :alt: SIMD
+
+* **Instruction-Level Parallelism:** Modern CISC architectures, such as x86, allow performing data independent
+  instructions in parallel. In the following example, see how to compute :math:`a * b + (c - d)`.
+  Operations :math:`*` and :math:`-` can be executed in parallel, the last instruction
+  :math:`+` depends on availability of :math:`a * b` and :math:`c - d` and cannot be executed in parallel
+  with :math:`*` and :math:`-`.
+
+.. image:: ./_images/dpep-ilp.png
+    :width: 150px
+    :align: center
+    :alt: SIMD
diff --git a/pull/44/_sources/prerequisites_and_installation.rst.txt b/pull/44/_sources/prerequisites_and_installation.rst.txt
new file mode 100644
index 0000000..37d64ea
--- /dev/null
+++ b/pull/44/_sources/prerequisites_and_installation.rst.txt
@@ -0,0 +1,50 @@
+.. _prerequisites_and_installation:
+.. include:: ./ext_links.txt
+
+.. |copy| unicode:: U+000A9
+
+.. |trade| unicode:: U+2122
+
+Prerequisites and Installation
+==============================
+
+1. Device Drivers
+******************
+
+To start programming data parallel devices beyond CPU, you will need an appropriate hardware.
+For example, Data Parallel Extensions for Python work fine on Intel |copy| laptops with integrated graphics.
+In majority of cases, your Windows*-based laptop already has all necessary device drivers installed. But if you want the most
+up-to-date driver, you can always
+`update it to the latest one <https://www.intel.com/content/www/us/en/download-center/home.html>`_.
+Follow device driver installation instructions
+to complete this step.
+
+All other necessary components for programming data parallel devices will be installed with
+Data Parallel Extensions for Python.
+
+2. Python Interpreter
+**********************
+
+You will need Python 3.8, 3.9, or 3.10 installed on your system. If you do not have one yet the easiest way to do
+that is to install `Intel Distribution for Python*`_.
+It installs all essential Python numerical and machine
+learning packages optimized for the Intel hardware, including Data Parallel Extensions for Python*.
+If you have Python installation from another vendor, it is fine too. All you need is to install Data Parallel
+Extensions for Python manually as shown in the next section.
+
+3. Data Parallel Extensions for Python
+***************************************
+
+Skip this step if you already installed Intel |copy| Distribution for Python.
+
+The easiest way to install Data Parallel Extensions for Python is to install numba-dpex:
+
+* Conda: ``conda install numba-dpex``
+
+* Pip: ``pip install numba-dpex``
+
+These commands install ``numba-dpex`` along with its dependencies, including ``dpnp``, ``dpctl``,
+and required compiler runtimes.
+
+.. WARNING::
+   Before installing with conda or pip it is strongly advised to update ``conda`` and ``pip`` to latest versions
diff --git a/pull/44/_sources/programming_dpep.rst.txt b/pull/44/_sources/programming_dpep.rst.txt
new file mode 100644
index 0000000..4205ce3
--- /dev/null
+++ b/pull/44/_sources/programming_dpep.rst.txt
@@ -0,0 +1,305 @@
+.. _programming_dpep:
+.. include:: ./ext_links.txt
+
+
+.. |copy| unicode:: U+000A9
+.. |trade| unicode:: U+2122
+
+
+Programming with Data Parallel Extensions for Python
+====================================================
+
+.. image:: ./_images/dpep-all.png
+   :width: 600px
+   :align: center
+   :alt: Data Parallel Extensions for Python
+
+**Data Parallel Extensions for Python** consist of three foundational packages:
+
+* The `Numpy*`_-like library, ``dpnp``;
+* The compiler extension for `Numba*`_, ``numba-dpex``
+* The library for managing devices, queues, and heterogeneous data, ``dpctl``.
+
+Their underlying implementation is based on `SYCL*`_ standard, which is a cross-platform abstraction layer
+for heterogeneous computing on data parallel devices, such as CPU, GPU, or domain-specific accelerators.
+
+Scalars vs. 0-Dimensional Arrays
+********************************
+
+Primitive types, such as Python’s and Numpy’s ``float``, ``int``, or ``complex``, used to represent scalars,
+have the host storage. In contrast, ``dpctl.tensor.usm_ndarray`` and ``dpnp.ndarray`` have the USM storage
+and carry associated allocation queue. For the :ref:`Compute-Follows-Data` consistent behavior
+all ``dpnp`` operations that produce scalars will instead produce respective 0-dimensional arrays.
+
+That implies, that some code changes may be needed to replace scalar math operations with respective
+``dpnp`` array operations. See `Data Parallel Extension for Numpy*`_ - **API Reference** section for details.
+
+Data Parallel Extension for Numpy - dpnp
+****************************************
+
+The ``dpnp`` library is a bare minimum to start programming numerical codes for data-parallel devices.
+If you already have a Python script written in `Numpy*`_, then running it on a GPU will typically require
+changing just a few lines of the code:
+
+.. literalinclude:: ../../examples/01-hello_dpnp.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 01:** Your first NumPy code running on GPU
+   :name: ex_01_hello_dpnp
+
+
+In this example, ``np.asarray()`` creates an array on the default `SYCL*`_ device, which is a ``"gpu"`` on systems
+with integrated or discrete GPU (it is the ``"host"`` on systems that do not have GPU).
+The queue associated with this array is now carried with ``x``, and ``np.sum(x)`` derives it from ``x``,
+and respective pre-compiled kernel implementing ``np.sum()`` is submitted to that queue.
+The result ``y`` is allocated on the device 0-dimensional array associated with that queue too.
+
+All ``dpnp`` array creation routines and random number generators have additional optional keyword arguments:
+``device``, ``queue``, and ``usm_type``, using which you can explicitly specify on which device or queue you want
+the tensor data to be created along with the USM memory type to be used (``"host"``, ``"device"``, or ``"shared"``).
+In the following example, the array ``x`` is created on the GPU device, and reduction sum is done on it:
+
+.. literalinclude:: ../../examples/02-dpnp_device.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 02:** Select device type while creating array
+   :name: ex_02_dpnp_device
+
+
+Data Parallel Extension for Numba - numba-dpex
+**********************************************
+
+`Numba*`_ is a powerful Just-In-Time (JIT) compiler that works best on `Numpy*`_ arrays, `Numpy*`_ functions, and loops.
+Data-parallel loops is where the data parallelism resides. It allows leveraging all available CPU cores,
+SIMD instructions, and schedules those in a way that exploits maximum instruction-level parallelism.
+The ``numba-dpex`` extension allows to compile and offload data-parallel regions to any data parallel device.
+It takes just a few lines to modify your CPU `Numba*`_ script to run on GPU:
+
+.. literalinclude:: ../../examples/03-dpnp2numba-dpex.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 03:** Compile dpnp code with numba-dpex
+   :name: ex_03_dpnp2numba_dpex
+
+In this example, you can see a custom function ``sum_it()`` that takes an array input. By compiling it with
+`Data Parallel Extension for Numba*`_, the queue information is derived from input argument ``x``,
+which is associated with the default device (``"gpu"`` on systems with integrated or discrete GPU) and
+dynamically compiles the kernel submitted to that queue. The result resides as a 0-dimensional array on the device
+associated with the queue, and on exit from the offload kernel it will be assigned to the tensor ``y``.
+
+Data Parallel Control - dpctl
+*****************************
+
+Both ``dpnp`` and ``numba-dpex`` provide enough API versatility for programming data parallel devices but
+there are some situations when you need to use ``dpctl`` advanced capabilities:
+
+1. **Advanced device management.** Both ``dpnp`` and ``numba-dpex`` support Numpy array creation routines
+   with additional parameters that specify the device on which the data is allocated and the type of memory to be used
+   (``"device"``, ``"host"``, or ``"shared"``). However, if you need some more advanced device and data management
+   capabilities, you need to import ``dpctl`` in addition to ``dpnp`` and/or ``numba-dpex``.
+
+   One of frequent usages of ``dpctl`` is to query the list devices present on the system, available driver backend
+   (such as ``"opencl"``, ``"level_zero"``, ``"cuda"``, etc.)
+
+   Another frequent usage is the creation of additional queues for the purpose of profiling or choosing an out-of-order
+   execution of offload kernels.
+
+.. literalinclude:: ../../examples/04-dpctl_device_query.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 04:** Get information about devices
+   :name: ex_04_dpctl_device_query
+
+2. **Cross-platform development using Python Array API standard.** If you
+   program Numpy-like codes and target different hardware vendors and different tensor implementations,
+   then going with `Python* Array API Standard`_ is a good choice for writing a portable Numpy-like code.
+   The ``dpctl.tensor`` implements `Python* Array API Standard`_ for `SYCL*`_ devices. Accompanied with
+   respective SYCL device, driver from different vendors, ``dpctl.tensor`` becomes a portable solution
+   for writing numerical codes for any SYCL device.
+
+   For example, some Python communities, such as
+   `Scikit-Learn* community <https://github.com/scikit-learn/scikit-learn/issues/22352>`_, are already establishing
+   a path for having algorithms (re-)implemented using `Python* Array API Standard`_ .
+   This is a reliable path for extending their capabilities beyond CPU only, or beyond certain GPU vendor only.
+
+3. **Zero-copy data exchange between tensor implementations.** Certain Python projects may have their tensor
+   implementations not relying on ``dpctl.tensor`` or ``dpnp.ndarray`` tensors. However, you can still exchange data
+   between these tensors not copying it back and forth through the host.
+   `Python* Array API Standard`_ specifies the data exchange protocol for zero-copy exchange
+   between tensors through ``dlpack``. Being the `Python* Array API Standard`_ implementation
+   ``dpctl`` provides ``dpctl.tensor.from_dlpack()`` function used for zero-copy view of another tensor input.
+
+
+Debugging and Profiling Data Parallel Extensions for Python
+***********************************************************
+`Intel oneAPI Base Toolkit`_ provides two tools to assist programmers to analyze performance issues in programs
+that use **Data Parallel Extensions for Python**. They are `Intel VTune Profiler`_ and
+`Intel Advisor`_.
+
+Intel |copy| VTune |trade| Profiler examines various performance aspects of a program like, the most time-consuming parts,
+efficiency of offloaded code, impact of memory sub-systems, etc.
+
+Intel |copy| Advisor |trade| provides insights on the performance of offloaded code with respect to the peak performance and
+memory bandwidth.
+
+Below you can find how to use Intel VTune Profiler and Intel Advisor with
+heterogenous programs that use **Data Parallel Extensions for Python**.
+
+Profiling with Intel VTune Profiler
+-----------------------------------
+
+Intel |copy| VTune |trade| Profiler provides two mechanisms to profile heterogeneous programs
+targeted to GPUs.
+
+* GPU offload
+* GPU hotspots
+
+The *GPU offload* analysis profiles the entire application (both GPU and host code) and helps to identify
+if the application is CPU- or GPU-bound. It provides information on the proportion of the execution time spent
+in GPU execution. It also provides information about various hotspots in the program. The key goal of the *GPU offload*
+analysis is to identify the parts of the program that can benefit from offloading to GPUs.
+
+The *GPU hotspots* analysis focuses on providing insights into the performance of GPU-offloaded code.
+It provides insights about the parallelism in the GPU kernel, the efficiency of the kernel, SIMD utilization,
+and memory latency. It also provides performance data regarding synchronization operations like GPU barriers and
+atomic operations.
+
+The following instructions are used to execute the two Intel VTune Profiler analyses on programs written
+using **Data Parallel Extensions for Python**:
+
+.. code-block:: console
+    :caption: **GPU Offload**
+
+    > vtune -collect gpu-offload -r <output_dir> -- python <script>.py <args>
+
+.. code-block:: console
+    :caption: **GPU Hotspots**
+
+    > vtune -collect gpu-hotspots -r <output_dir> -- python <script>.py <args>
+
+Intel VTune Profiler performs dynamic binary analysis on a given program to obtain insights on various
+performance characteristics. It can run on unmodified binaries with no extra requirements for program compilation.
+After collecting the data using the above commands, the Intel VTune Profiler GUI can be used to view various
+performance characteristics. In addition to the GUI, it provides mechanisms to generate reports through
+the command line and setup a web server for post processing the data.
+
+See `Intel VTune Profiler User Guide <https://www.intel.com/content/www/us/en/develop/documentation/vtune-help/top.html>`_
+for more details.
+
+Profiling with Intel Advisor
+----------------------------
+
+The primary goal of Intel |copy| Advisor is to help you make targeted optimizations by identifying
+appropriate kernels and characterizing the performance limiting factors. It provides mechanisms
+to analyze the performance of GPU kernels against the hardware roof-line performance. Intel Advisor gives you information
+about the maximum achievable performance with the given hardware conditions and helps identify the best
+kernels for optimization. Further, it helps you to characterize if a GPU kernel is bound by
+compute capacity or by memory bandwidth.
+
+The following instructions are used to generate GPU roof-line performance graphs using Intel Advisor.
+
+.. code-block:: console
+    :caption: **Collect Roofline**
+
+    > advisor --collect=roofline --profile-gpu --project-dir=<output_dir> --search-dir src:r=<search_dir> -- <executable> <args>
+
+This command collects the GPU roof-line data from executing the application written using
+**Data Parallel Extensions for Python**.
+
+The next command generates the roof-line graph as a HTML file in the output directory:
+
+.. code-block:: console
+    :caption: **Generate Roofline HTML-File**
+
+    > advisor --report=roofline --gpu --project-dir=<output_dir> --report-output=<output_dir>/roofline_gpu.html
+
+.. image:: ./_images/advisor_roofline_gen9.png
+    :width: 800px
+    :align: center
+    :alt: Advisor roofline analysis example on Gen9 integrated GPU
+
+The figure above shows the example of roof-line graph generated using Intel Advisor.
+The X-axis in the graph represents arithmetic intensity and the Y-axis represents performance in GFLOPS.
+The horizontal lines parallel to the X-axis represent the roof-line compute capacity for the given hardware.
+The cross-diagonal lines represent the peak memory bandwidth of different layers of the memory hierarchy.
+The red colored dot corresponds to the executed GPU kernel. The graph shows the performance of the kernel relative
+to the peak compute capacity and memory bandwidth. It also shows whether the GPU kernel is memory or compute
+bound depending on the roof-line that is limiting the GPU kernel.
+
+For further details on Intel Advisor and its extended capabilities, refer to the
+`Intel |copy| Advisor User Guide <https://www.intel.com/content/www/us/en/develop/documentation/advisor-user-guide/top.html>`_.
+
+
+.. todo::
+   Document debugging section
+
+Writing Robust Numerical Codes for Heterogeneous Computing
+**********************************************************
+
+Default primitive type (``dtype``) in `Numpy*`_ is the double precision (``float64``), which is supported by
+majority of modern CPUs. When it comes to program GPUs and especially specialized accelerators,
+the set of supported primitive data types may be limited. For example, certain GPUs may not support
+double precision or half-precision. **Data Parallel Extensions for Python** select default ``dtype`` depending on
+device’s default type in accordance with Python Array API Standard. It can be either ``float64`` or ``float32``.
+It means that unlike traditional `Numpy*`_ programming on a CPU, the heterogeneous computing requires
+careful management of hardware peculiarities to keep the Python script portable and robust on any device.
+
+There are several hints how to make the numerical code portable and robust.
+
+Sensitivity to Floating-Point Errors
+------------------------------------
+
+Floating-point arithmetic has a finite precision, which implies that only a tiny fraction of real numbers can be
+represented in floating-point arithmetic. It is almost certain that every floating-point operation
+induces a rounding error because the result cannot be accurately represented as a floating-point number.
+The `IEEE 754-2019 Standard for Floating-Point Arithmetic`_ sets the upper bound for rounding errors in each
+arithmetic operation to 0.5 *ulp*, meaning that each arithmetic operation must be accurate to the last bit of
+floating-point mantissa, which is an order of :math:`10^-16` in double precision and :math:`10^-7`
+in single precision.
+
+In robust numerical codes, these errors tend to accumulate slowly so that single precision is enough to
+calculate the result accurate to three-five decimal digits.
+
+However, there is a situation known as a *catastrophic cancellation*, when small accumulated errors
+result in a significant, or even complete, loss of accuracy. The catastrophic cancellation happens
+when two close floating-point numbers with small rounding errors are subtracted. As a result the original
+rounding errors amplify by the number of identical leading digits:
+
+.. image:: ./_images/fp-cancellation.png
+    :scale: 50%
+    :align: center
+    :alt: Floating-Point Cancellation
+
+In the example above, green digits are accurate digits, a few trailing digits in red are inaccurate due to
+induced errors. As a result of subtraction, only one accurate digit remains.
+
+Situations with catastrophic cancellations must be carefully handled. An example where catastrophic
+cancellation happens naturally is the numeric differentiation, where two close numbers are subtracted
+to approximate the derivative:
+
+.. math::
+
+   df/dx \approx \frac{f(x+\delta) - f(x-\delta)}{2\delta}
+
+Smaller you take :math:`\delta` is greater the catastrophic cancellation. At the same time, bigger :math:`\delta`
+results in bigger approximation error. Books on numerical computing and floating-point arithmetic discuss
+variety of technics to make catastrophic cancellations controllable. For more details about floating-point
+arithmetic, refer to `IEEE 754-2019 Standard for Floating-Point Arithmetic`_ and the article by
+`David Goldberg, What every computer scientist should know about floating-point arithmetic`_.
+
+
+Switching Between Single and Double Precision
+---------------------------------------------
+
+1. Implement your code to switch easily between single and double precision in a controlled fashion.
+   For example, implement a utility function or introduce a constant that selects ``dtype`` for
+   the rest of the `Numpy*`_ code.
+
+2. Run your code on a representative set of inputs in single and double precisions.
+   Observe sensitivity of computed results to the switching between single and double precisions.
+   If results remain identical to three-five digits for different inputs, it is a good sign that your code
+   is not sensitive to floating-point errors.
+
+3. Write your code with catastrophic cancellations in mind. These blocks of code will require special
+   care such as the use of extended precision or other techniques to control cancellations.
+   It is likely that this part of the code requires a hardware specific implementation.
diff --git a/pull/44/_sources/useful_links.rst.txt b/pull/44/_sources/useful_links.rst.txt
new file mode 100644
index 0000000..5ebb865
--- /dev/null
+++ b/pull/44/_sources/useful_links.rst.txt
@@ -0,0 +1,48 @@
+.. _useful_links:
+.. include:: ./ext_links.txt
+
+Useful links
+============
+
+.. list-table:: **Companion documentation**
+   :widths: 70 200
+   :header-rows: 1
+
+   * - Document
+     - Description
+   * - `Data Parallel Extension for Numpy*`_
+     - Documentation for programming NumPy-like codes on data-parallel devices
+   * - `Data Parallel Extension for Numba*`_
+     - Documentation for programming Numba codes on data-parallel devices as you program Numba on CPU
+   * - `Data Parallel Control`_
+     - Documentation how to manage data and devices, how to interchange data between different tensor implementations,
+       and how to write data parallel extensions
+   * - `Intel VTune Profiler`_
+     - Performance profiler supporting analysis of bottlenecks from function leve down to low level instructions.
+       Supports Python and Numba
+   * - `Intel Advisor`_
+     - Analyzes native and Python codes and provides the advice for better composition of heterogeneous algorithms
+   * - `Python* Array API Standard`_
+     - Standard for writing portable Numpy-like codes targeting different hardware vendors and frameworks
+       operating with tensor data
+   * - `SYCL*`_
+     - Standard for writing C++-like codes for heterogeneous computing
+   * - `DPC++`_
+     - Free e-book on how to program data-parallel devices using Data Parallel C++
+   * - `OpenCl*`_
+     - OpenCl* Standard for heterogeneous programming
+   * - `IEEE 754-2019 Standard for Floating-Point Arithmetic`_
+     - Standard for floating-point arithmetic, essential for writing robust numerical codes
+   * - `David Goldberg, What every computer scientist should know about floating-point arithmetic`_
+     - Scientific paper. Important for understanding how to write robust numerical code
+   * - `Numpy*`_
+     - Documentation for Numpy - foundational CPU library for array programming. Used in conjunction with
+       `Data Parallel Extension for Numpy*`_.
+   * - `Numba*`_
+     - Documentation for Numba - Just-In-Time compiler for Numpy-like codes. Used in conjunction with
+       `Data Parallel Extension for Numba*`_.
+
+
+To-Do
+=====
+.. todolist::
diff --git a/docs/sources/sdc-sphinx-theme/static/DPEP.png b/pull/44/_static/DPEP.png
similarity index 100%
rename from docs/sources/sdc-sphinx-theme/static/DPEP.png
rename to pull/44/_static/DPEP.png
diff --git a/pull/44/_static/basic.css b/pull/44/_static/basic.css
new file mode 100644
index 0000000..7577acb
--- /dev/null
+++ b/pull/44/_static/basic.css
@@ -0,0 +1,903 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+    clear: both;
+}
+
+div.section::after {
+    display: block;
+    content: '';
+    clear: left;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+    width: 100%;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+    word-wrap: break-word;
+    overflow-wrap : break-word;
+}
+
+div.sphinxsidebar ul {
+    list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox form.search {
+    overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+    float: left;
+    width: 80%;
+    padding: 0.25em;
+    box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+    float: left;
+    width: 20%;
+    border-left: none;
+    padding: 0.25em;
+    box-sizing: border-box;
+}
+
+
+img {
+    border: 0;
+    max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li p.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+    width: 90%;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+    width: 100%;
+}
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable ul {
+    margin-top: 0;
+    margin-bottom: 0;
+    list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+    padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+div.modindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+    padding: 2px;
+    border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+    min-width: 360px;
+    max-width: 800px;
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+    -moz-hyphens: auto;
+    -ms-hyphens: auto;
+    -webkit-hyphens: auto;
+    hyphens: auto;
+}
+
+a.headerlink {
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+    clear: left;
+    float: left;
+    margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+    clear: right;
+    float: right;
+    margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+    text-align: left;
+}
+
+.align-center {
+    text-align: center;
+}
+
+.align-default {
+    text-align: center;
+}
+
+.align-right {
+    text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar,
+aside.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+    clear: right;
+    overflow-x: auto;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+nav.contents,
+aside.topic,
+div.admonition, div.topic, blockquote {
+    clear: left;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+    border: 1px solid #ccc;
+    padding: 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+nav.contents > :last-child,
+aside.topic > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+    margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+nav.contents::after,
+aside.topic::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+    display: block;
+    content: '';
+    clear: both;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    border: 0;
+    border-collapse: collapse;
+}
+
+table.align-center {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table.align-default {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table caption span.caption-number {
+    font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 5px;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+table.citation {
+    border-left: solid 1px gray;
+    margin-left: 1px;
+}
+
+table.citation td {
+    border-bottom: none;
+}
+
+th > :first-child,
+td > :first-child {
+    margin-top: 0px;
+}
+
+th > :last-child,
+td > :last-child {
+    margin-bottom: 0px;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure, figure {
+    margin: 0.5em;
+    padding: 0.5em;
+}
+
+div.figure p.caption, figcaption {
+    padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+    font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.field-name {
+    -moz-hyphens: manual;
+    -ms-hyphens: manual;
+    -webkit-hyphens: manual;
+    hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist {
+    margin: 1em 0;
+}
+
+table.hlist td {
+    vertical-align: top;
+}
+
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+	font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.sig-name {
+	font-size: 1.1em;
+}
+
+code.descname {
+    font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.sig-paren {
+    font-size: larger;
+}
+
+.sig-param.n {
+	font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+	font-family: unset;
+}
+
+.sig.c   .k, .sig.c   .kt,
+.sig.cpp .k, .sig.cpp .kt {
+	color: #0033B3;
+}
+
+.sig.c   .m,
+.sig.cpp .m {
+	color: #1750EB;
+}
+
+.sig.c   .s, .sig.c   .sc,
+.sig.cpp .s, .sig.cpp .sc {
+	color: #067D17;
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+    list-style: decimal;
+}
+
+ol.loweralpha {
+    list-style: lower-alpha;
+}
+
+ol.upperalpha {
+    list-style: upper-alpha;
+}
+
+ol.lowerroman {
+    list-style: lower-roman;
+}
+
+ol.upperroman {
+    list-style: upper-roman;
+}
+
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
+    margin-top: 0px;
+}
+
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+    margin-bottom: 0px;
+}
+
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+    margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+    margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+    margin-bottom: 0;
+}
+
+aside.footnote > span,
+div.citation > span {
+    float: left;
+}
+aside.footnote > span:last-of-type,
+div.citation > span:last-of-type {
+  padding-right: 0.5em;
+}
+aside.footnote > p {
+  margin-left: 2em;
+}
+div.citation > p {
+  margin-left: 4em;
+}
+aside.footnote > p:last-of-type,
+div.citation > p:last-of-type {
+    margin-bottom: 0em;
+}
+aside.footnote > p:last-of-type:after,
+div.citation > p:last-of-type:after {
+    content: "";
+    clear: both;
+}
+
+dl.field-list {
+    display: grid;
+    grid-template-columns: fit-content(30%) auto;
+}
+
+dl.field-list > dt {
+    font-weight: bold;
+    word-break: break-word;
+    padding-left: 0.5em;
+    padding-right: 5px;
+}
+
+dl.field-list > dd {
+    padding-left: 0.5em;
+    margin-top: 0em;
+    margin-left: 0em;
+    margin-bottom: 0em;
+}
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd > :first-child {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+    margin-bottom: 0;
+}
+
+dt:target, span.highlighted {
+    background-color: #fbe54e;
+}
+
+rect.highlighted {
+    fill: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+.footnote:target  {
+    background-color: #ffa;
+}
+
+.line-block {
+    display: block;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.line-block .line-block {
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+    font-family: sans-serif;
+}
+
+.accelerator {
+    text-decoration: underline;
+}
+
+.classifier {
+    font-style: oblique;
+}
+
+.classifier:before {
+    font-style: normal;
+    margin: 0 0.5em;
+    content: ":";
+    display: inline-block;
+}
+
+abbr, acronym {
+    border-bottom: dotted 1px;
+    cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+    overflow: auto;
+    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
+}
+
+pre, div[class*="highlight-"] {
+    clear: both;
+}
+
+span.pre {
+    -moz-hyphens: none;
+    -ms-hyphens: none;
+    -webkit-hyphens: none;
+    hyphens: none;
+    white-space: nowrap;
+}
+
+div[class*="highlight-"] {
+    margin: 1em 0;
+}
+
+td.linenos pre {
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    display: block;
+}
+
+table.highlighttable tbody {
+    display: block;
+}
+
+table.highlighttable tr {
+    display: flex;
+}
+
+table.highlighttable td {
+    margin: 0;
+    padding: 0;
+}
+
+table.highlighttable td.linenos {
+    padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+    flex: 1;
+    overflow: hidden;
+}
+
+.highlight .hll {
+    display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+    margin: 0;
+}
+
+div.code-block-caption + div {
+    margin-top: 0;
+}
+
+div.code-block-caption {
+    margin-top: 1em;
+    padding: 2px 5px;
+    font-size: small;
+}
+
+div.code-block-caption code {
+    background-color: transparent;
+}
+
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp {  /* gp: Generic.Prompt */
+  user-select: none;
+  -webkit-user-select: text; /* Safari fallback only */
+  -webkit-user-select: none; /* Chrome/Safari */
+  -moz-user-select: none; /* Firefox */
+  -ms-user-select: none; /* IE10+ */
+}
+
+div.code-block-caption span.caption-number {
+    padding: 0.1em 0.3em;
+    font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+    margin: 1em 0;
+}
+
+code.xref, a code {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+    background-color: transparent;
+}
+
+.viewcode-link {
+    float: right;
+}
+
+.viewcode-back {
+    float: right;
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    margin: -1px -10px;
+    padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+    vertical-align: middle;
+}
+
+div.body div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+span.eqno a.headerlink {
+    position: absolute;
+    z-index: 1;
+}
+
+div.math:hover a.headerlink {
+    visibility: visible;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0 !important;
+        width: 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    #top-link {
+        display: none;
+    }
+}
\ No newline at end of file
diff --git a/pull/44/_static/copybutton.js b/pull/44/_static/copybutton.js
new file mode 100644
index 0000000..8f12e23
--- /dev/null
+++ b/pull/44/_static/copybutton.js
@@ -0,0 +1,62 @@
+$(document).ready(function() {
+    /* Add a [>>>] button on the top-right corner of code samples to hide
+     * the >>> and ... prompts and the output and thus make the code
+     * copyable. */
+    var div = $('.highlight-python .highlight,' +
+                '.highlight-python3 .highlight,' +
+                '.highlight-default .highlight')
+    var pre = div.find('pre');
+
+    // get the styles from the current theme
+    pre.parent().parent().css('position', 'relative');
+    var hide_text = 'Hide the prompts and output';
+    var show_text = 'Show the prompts and output';
+    var border_width = pre.css('border-top-width');
+    var border_style = pre.css('border-top-style');
+    var border_color = pre.css('border-top-color');
+    var button_styles = {
+        'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0',
+        'border-color': border_color, 'border-style': border_style,
+        'border-width': border_width, 'color': border_color, 'text-size': '75%',
+        'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em',
+        'border-radius': '0 3px 0 0'
+    }
+
+    // create and add the button to all the code blocks that contain >>>
+    div.each(function(index) {
+        var jthis = $(this);
+        if (jthis.find('.gp').length > 0) {
+            var button = $('<span class="copybutton">&gt;&gt;&gt;</span>');
+            button.css(button_styles)
+            button.attr('title', hide_text);
+            button.data('hidden', 'false');
+            jthis.prepend(button);
+        }
+        // tracebacks (.gt) contain bare text elements that need to be
+        // wrapped in a span to work with .nextUntil() (see later)
+        jthis.find('pre:has(.gt)').contents().filter(function() {
+            return ((this.nodeType == 3) && (this.data.trim().length > 0));
+        }).wrap('<span>');
+    });
+
+    // define the behavior of the button when it's clicked
+    $('.copybutton').click(function(e){
+        e.preventDefault();
+        var button = $(this);
+        if (button.data('hidden') === 'false') {
+            // hide the code output
+            button.parent().find('.go, .gp, .gt').hide();
+            button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden');
+            button.css('text-decoration', 'line-through');
+            button.attr('title', show_text);
+            button.data('hidden', 'true');
+        } else {
+            // show the code output
+            button.parent().find('.go, .gp, .gt').show();
+            button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible');
+            button.css('text-decoration', 'none');
+            button.attr('title', hide_text);
+            button.data('hidden', 'false');
+        }
+    });
+});
diff --git a/pull/44/_static/doctools.js b/pull/44/_static/doctools.js
new file mode 100644
index 0000000..d06a71d
--- /dev/null
+++ b/pull/44/_static/doctools.js
@@ -0,0 +1,156 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Base JavaScript utilities for all Sphinx HTML documentation.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
+  "TEXTAREA",
+  "INPUT",
+  "SELECT",
+  "BUTTON",
+]);
+
+const _ready = (callback) => {
+  if (document.readyState !== "loading") {
+    callback();
+  } else {
+    document.addEventListener("DOMContentLoaded", callback);
+  }
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const Documentation = {
+  init: () => {
+    Documentation.initDomainIndexTable();
+    Documentation.initOnKeyListeners();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS: {},
+  PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
+  LOCALE: "unknown",
+
+  // gettext and ngettext don't access this so that the functions
+  // can safely bound to a different name (_ = Documentation.gettext)
+  gettext: (string) => {
+    const translated = Documentation.TRANSLATIONS[string];
+    switch (typeof translated) {
+      case "undefined":
+        return string; // no translation
+      case "string":
+        return translated; // translation exists
+      default:
+        return translated[0]; // (singular, plural) translation tuple exists
+    }
+  },
+
+  ngettext: (singular, plural, n) => {
+    const translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated !== "undefined")
+      return translated[Documentation.PLURAL_EXPR(n)];
+    return n === 1 ? singular : plural;
+  },
+
+  addTranslations: (catalog) => {
+    Object.assign(Documentation.TRANSLATIONS, catalog.messages);
+    Documentation.PLURAL_EXPR = new Function(
+      "n",
+      `return (${catalog.plural_expr})`
+    );
+    Documentation.LOCALE = catalog.locale;
+  },
+
+  /**
+   * helper function to focus on search bar
+   */
+  focusSearchBar: () => {
+    document.querySelectorAll("input[name=q]")[0]?.focus();
+  },
+
+  /**
+   * Initialise the domain index toggle buttons
+   */
+  initDomainIndexTable: () => {
+    const toggler = (el) => {
+      const idNumber = el.id.substr(7);
+      const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
+      if (el.src.substr(-9) === "minus.png") {
+        el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
+        toggledRows.forEach((el) => (el.style.display = "none"));
+      } else {
+        el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
+        toggledRows.forEach((el) => (el.style.display = ""));
+      }
+    };
+
+    const togglerElements = document.querySelectorAll("img.toggler");
+    togglerElements.forEach((el) =>
+      el.addEventListener("click", (event) => toggler(event.currentTarget))
+    );
+    togglerElements.forEach((el) => (el.style.display = ""));
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
+  },
+
+  initOnKeyListeners: () => {
+    // only install a listener if it is really needed
+    if (
+      !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
+      !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
+    )
+      return;
+
+    document.addEventListener("keydown", (event) => {
+      // bail for input elements
+      if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+      // bail with special keys
+      if (event.altKey || event.ctrlKey || event.metaKey) return;
+
+      if (!event.shiftKey) {
+        switch (event.key) {
+          case "ArrowLeft":
+            if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+            const prevLink = document.querySelector('link[rel="prev"]');
+            if (prevLink && prevLink.href) {
+              window.location.href = prevLink.href;
+              event.preventDefault();
+            }
+            break;
+          case "ArrowRight":
+            if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+            const nextLink = document.querySelector('link[rel="next"]');
+            if (nextLink && nextLink.href) {
+              window.location.href = nextLink.href;
+              event.preventDefault();
+            }
+            break;
+        }
+      }
+
+      // some keyboard layouts may need Shift to get /
+      switch (event.key) {
+        case "/":
+          if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
+          Documentation.focusSearchBar();
+          event.preventDefault();
+      }
+    });
+  },
+};
+
+// quick alias for translations
+const _ = Documentation.gettext;
+
+_ready(Documentation.init);
diff --git a/pull/44/_static/documentation_options.js b/pull/44/_static/documentation_options.js
new file mode 100644
index 0000000..cf359c0
--- /dev/null
+++ b/pull/44/_static/documentation_options.js
@@ -0,0 +1,14 @@
+var DOCUMENTATION_OPTIONS = {
+    URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
+    VERSION: '0.1',
+    LANGUAGE: 'en',
+    COLLAPSE_INDEX: false,
+    BUILDER: 'html',
+    FILE_SUFFIX: '.html',
+    LINK_SUFFIX: '.html',
+    HAS_SOURCE: true,
+    SOURCELINK_SUFFIX: '.txt',
+    NAVIGATION_WITH_KEYS: false,
+    SHOW_SEARCH_SUMMARY: true,
+    ENABLE_SEARCH_SHORTCUTS: true,
+};
\ No newline at end of file
diff --git a/pull/44/_static/file.png b/pull/44/_static/file.png
new file mode 100644
index 0000000..a858a41
Binary files /dev/null and b/pull/44/_static/file.png differ
diff --git a/pull/44/_static/intel_logo.png b/pull/44/_static/intel_logo.png
new file mode 100644
index 0000000..08a8ca1
Binary files /dev/null and b/pull/44/_static/intel_logo.png differ
diff --git a/pull/44/_static/language_data.js b/pull/44/_static/language_data.js
new file mode 100644
index 0000000..250f566
--- /dev/null
+++ b/pull/44/_static/language_data.js
@@ -0,0 +1,199 @@
+/*
+ * language_data.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * This script contains the language-specific data used by searchtools.js,
+ * namely the list of stopwords, stemmer, scorer and splitter.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
+
+
+/* Non-minified version is copied as a separate JS file, is available */
+
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
diff --git a/pull/44/_static/minus.png b/pull/44/_static/minus.png
new file mode 100644
index 0000000..d96755f
Binary files /dev/null and b/pull/44/_static/minus.png differ
diff --git a/pull/44/_static/nbsphinx-broken-thumbnail.svg b/pull/44/_static/nbsphinx-broken-thumbnail.svg
new file mode 100644
index 0000000..4919ca8
--- /dev/null
+++ b/pull/44/_static/nbsphinx-broken-thumbnail.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+  <style>
+    svg { fill: lightcoral; }
+    @media (prefers-color-scheme: dark) {
+      svg { fill: crimson; }
+    }
+  </style>
+  <path d="m 80.856887,38.34474 h 2.903414 l 7.066397,13.332221 V 38.34474 h 2.092166 V 54.281494 H 90.01545 L 82.949053,40.949273 v 13.332221 h -2.092166 z m -13.812565,0 h 10.076555 v 1.814633 h -7.920343 v 4.718048 h 7.589439 v 1.814634 h -7.589439 v 5.774805 h 8.11248 v 1.814634 H 67.044322 Z m -14.335606,0 h 2.156212 v 6.735493 L 62.01672,38.34474 h 2.775323 l -7.909669,7.429324 8.475407,8.50743 h -2.839368 l -7.653485,-7.674833 v 7.674833 h -2.156212 z m -10.738365,1.462381 q -2.348349,0 -3.73601,1.750588 -1.376987,1.750588 -1.376987,4.771419 0,3.010158 1.376987,4.760746 1.387661,1.750587 3.73601,1.750587 2.34835,0 3.714663,-1.750587 1.376986,-1.750588 1.376986,-4.760746 0,-3.020831 -1.376986,-4.771419 -1.366313,-1.750588 -3.714663,-1.750588 z m 0,-1.750588 q 3.351736,0 5.358507,2.252281 2.006772,2.241606 2.006772,6.020314 0,3.768034 -2.006772,6.020315 -2.006771,2.241606 -5.358507,2.241606 -3.362409,0 -5.379855,-2.241606 -2.006772,-2.241607 -2.006772,-6.020315 0,-3.778708 2.006772,-6.020314 2.017446,-2.252281 5.379855,-2.252281 z m -14.100771,8.75294 q 0.693831,0.234835 1.344964,1.003385 0.661808,0.768551 1.323615,2.113515 l 2.188235,4.355121 H 30.410068 L 28.371273,50.193231 Q 27.581374,48.592083 26.834172,48.069042 26.097644,47.546 24.816726,47.546 h -2.34835 v 6.735494 H 20.312164 V 38.34474 h 4.867489 q 2.732625,0 4.077588,1.142152 1.344964,1.142151 1.344964,3.447804 0,1.505078 -0.704505,2.49779 -0.69383,0.992711 -2.02812,1.376987 z m -5.401204,-6.692797 v 5.657388 h 2.711277 q 1.55845,0 2.348349,-0.715179 0.800574,-0.725854 0.800574,-2.124189 0,-1.398336 -0.800574,-2.102841 -0.789899,-0.715179 -2.348349,-0.715179 z M 7.4709616,46.670707 v 5.838851 H 10.92944 q 1.739914,0 2.57251,-0.71518 0.843271,-0.725853 0.843271,-2.209583 0,-1.494404 -0.843271,-2.198909 -0.832596,-0.715179 -2.57251,-0.715179 z m 0,-6.554031 v 4.803443 h 3.1916204 q 1.579799,0 2.34835,-0.587088 0.779225,-0.597761 0.779225,-1.814634 0,-1.206197 -0.779225,-1.803959 -0.768551,-0.597762 -2.34835,-0.597762 z M 5.3147497,38.34474 h 5.5079473 q 2.465767,0 3.800057,1.024734 1.334289,1.024734 1.334289,2.914088 0,1.462382 -0.683156,2.327001 -0.683156,0.86462 -2.006772,1.078106 1.590474,0.341579 2.465768,1.430359 0.885968,1.078106 0.885968,2.700602 0,2.134863 -1.451707,3.298364 -1.451707,1.1635 -4.130961,1.1635 H 5.3147497 Z M 65.365328,74.550032 H 67.52154 V 88.67217 h 7.760238 v 1.814634 h -9.91645 z m -6.447298,0 h 2.156214 V 90.486804 H 58.91803 Z m -9.955303,2.124192 -2.924765,7.931025 h 5.860208 z m -1.216872,-2.124192 h 2.444423 l 6.073692,15.936772 h -2.241606 l -1.451709,-4.088268 h -7.183824 l -1.451707,4.088268 H 41.66149 Z m -21.264514,0 h 2.903417 L 36.45116,87.882271 V 74.550032 h 2.092171 V 90.486804 H 35.639914 L 28.573506,77.154569 v 13.332235 h -2.092165 z m 53.454813,-9.781663 v 5.838858 h 3.458479 q 1.739919,0 2.572513,-0.71518 0.843272,-0.725854 0.843272,-2.209586 0,-1.494406 -0.843272,-2.198912 -0.832594,-0.71518 -2.572513,-0.71518 z m 0,-6.554037 v 4.803447 h 3.191622 q 1.579803,0 2.348355,-0.587087 0.779225,-0.597763 0.779225,-1.814636 0,-1.206199 -0.779225,-1.803962 -0.768552,-0.597762 -2.348355,-0.597762 z m -2.156212,-1.771939 h 5.507949 q 2.465772,0 3.800065,1.024736 1.334288,1.024735 1.334288,2.914092 0,1.462383 -0.683157,2.327003 -0.683157,0.864621 -2.006771,1.078107 1.590471,0.341579 2.46577,1.43036 0.885967,1.078107 0.885967,2.700605 0,2.134866 -1.451708,3.298368 -1.451709,1.163502 -4.130963,1.163502 h -5.72144 z m -18.86154,0 h 3.212969 l 4.066921,10.845118 4.088269,-10.845118 H 73.49953 V 72.379166 H 71.396692 V 58.385121 L 67.287075,69.315634 H 65.120183 L 61.010567,58.385121 v 13.994045 h -2.092165 z m -16.246333,0 h 2.166892 v 9.681616 q 0,2.561839 0.928668,3.693318 0.928667,1.120804 3.010159,1.120804 2.070819,0 2.999486,-1.120804 0.928667,-1.131479 0.928667,-3.693318 v -9.681616 h 2.166886 v 9.948474 q 0,3.116904 -1.547776,4.70738 -1.537104,1.590474 -4.547263,1.590474 -3.020833,0 -4.568615,-1.590474 -1.537104,-1.590476 -1.537104,-4.70738 z m -16.192953,0 h 2.156213 v 6.532689 h 7.83496 v -6.532689 h 2.156213 v 15.936773 h -2.156213 v -7.589448 h -7.83496 v 7.589448 h -2.156213 z m -15.563168,0 h 13.481671 v 1.814636 H 18.740226 V 72.379166 H 16.573339 V 58.257029 h -5.657391 z" />
+</svg>
diff --git a/pull/44/_static/nbsphinx-code-cells.css b/pull/44/_static/nbsphinx-code-cells.css
new file mode 100644
index 0000000..199fa5a
--- /dev/null
+++ b/pull/44/_static/nbsphinx-code-cells.css
@@ -0,0 +1,253 @@
+/* remove conflicting styling from Sphinx themes */
+div.nbinput.container div.prompt *,
+div.nboutput.container div.prompt *,
+div.nbinput.container div.input_area pre,
+div.nboutput.container div.output_area pre,
+div.nbinput.container div.input_area .highlight,
+div.nboutput.container div.output_area .highlight {
+    border: none;
+    padding: 0;
+    margin: 0;
+    box-shadow: none;
+}
+
+div.nbinput.container > div[class*=highlight],
+div.nboutput.container > div[class*=highlight] {
+    margin: 0;
+}
+
+div.nbinput.container div.prompt *,
+div.nboutput.container div.prompt * {
+    background: none;
+}
+
+div.nboutput.container div.output_area .highlight,
+div.nboutput.container div.output_area pre {
+    background: unset;
+}
+
+div.nboutput.container div.output_area div.highlight {
+    color: unset;  /* override Pygments text color */
+}
+
+/* avoid gaps between output lines */
+div.nboutput.container div[class*=highlight] pre {
+    line-height: normal;
+}
+
+/* input/output containers */
+div.nbinput.container,
+div.nboutput.container {
+    display: -webkit-flex;
+    display: flex;
+    align-items: flex-start;
+    margin: 0;
+    width: 100%;
+}
+@media (max-width: 540px) {
+    div.nbinput.container,
+    div.nboutput.container {
+        flex-direction: column;
+    }
+}
+
+/* input container */
+div.nbinput.container {
+    padding-top: 5px;
+}
+
+/* last container */
+div.nblast.container {
+    padding-bottom: 5px;
+}
+
+/* input prompt */
+div.nbinput.container div.prompt pre {
+    color: #307FC1;
+}
+
+/* output prompt */
+div.nboutput.container div.prompt pre {
+    color: #BF5B3D;
+}
+
+/* all prompts */
+div.nbinput.container div.prompt,
+div.nboutput.container div.prompt {
+    width: 4.5ex;
+    padding-top: 5px;
+    position: relative;
+    user-select: none;
+}
+
+div.nbinput.container div.prompt > div,
+div.nboutput.container div.prompt > div {
+    position: absolute;
+    right: 0;
+    margin-right: 0.3ex;
+}
+
+@media (max-width: 540px) {
+    div.nbinput.container div.prompt,
+    div.nboutput.container div.prompt {
+        width: unset;
+        text-align: left;
+        padding: 0.4em;
+    }
+    div.nboutput.container div.prompt.empty {
+        padding: 0;
+    }
+
+    div.nbinput.container div.prompt > div,
+    div.nboutput.container div.prompt > div {
+        position: unset;
+    }
+}
+
+/* disable scrollbars and line breaks on prompts */
+div.nbinput.container div.prompt pre,
+div.nboutput.container div.prompt pre {
+    overflow: hidden;
+    white-space: pre;
+}
+
+/* input/output area */
+div.nbinput.container div.input_area,
+div.nboutput.container div.output_area {
+    -webkit-flex: 1;
+    flex: 1;
+    overflow: auto;
+}
+@media (max-width: 540px) {
+    div.nbinput.container div.input_area,
+    div.nboutput.container div.output_area {
+        width: 100%;
+    }
+}
+
+/* input area */
+div.nbinput.container div.input_area {
+    border: 1px solid #e0e0e0;
+    border-radius: 2px;
+    /*background: #f5f5f5;*/
+}
+
+/* override MathJax center alignment in output cells */
+div.nboutput.container div[class*=MathJax] {
+    text-align: left !important;
+}
+
+/* override sphinx.ext.imgmath center alignment in output cells */
+div.nboutput.container div.math p {
+    text-align: left;
+}
+
+/* standard error */
+div.nboutput.container div.output_area.stderr {
+    background: #fdd;
+}
+
+/* ANSI colors */
+.ansi-black-fg { color: #3E424D; }
+.ansi-black-bg { background-color: #3E424D; }
+.ansi-black-intense-fg { color: #282C36; }
+.ansi-black-intense-bg { background-color: #282C36; }
+.ansi-red-fg { color: #E75C58; }
+.ansi-red-bg { background-color: #E75C58; }
+.ansi-red-intense-fg { color: #B22B31; }
+.ansi-red-intense-bg { background-color: #B22B31; }
+.ansi-green-fg { color: #00A250; }
+.ansi-green-bg { background-color: #00A250; }
+.ansi-green-intense-fg { color: #007427; }
+.ansi-green-intense-bg { background-color: #007427; }
+.ansi-yellow-fg { color: #DDB62B; }
+.ansi-yellow-bg { background-color: #DDB62B; }
+.ansi-yellow-intense-fg { color: #B27D12; }
+.ansi-yellow-intense-bg { background-color: #B27D12; }
+.ansi-blue-fg { color: #208FFB; }
+.ansi-blue-bg { background-color: #208FFB; }
+.ansi-blue-intense-fg { color: #0065CA; }
+.ansi-blue-intense-bg { background-color: #0065CA; }
+.ansi-magenta-fg { color: #D160C4; }
+.ansi-magenta-bg { background-color: #D160C4; }
+.ansi-magenta-intense-fg { color: #A03196; }
+.ansi-magenta-intense-bg { background-color: #A03196; }
+.ansi-cyan-fg { color: #60C6C8; }
+.ansi-cyan-bg { background-color: #60C6C8; }
+.ansi-cyan-intense-fg { color: #258F8F; }
+.ansi-cyan-intense-bg { background-color: #258F8F; }
+.ansi-white-fg { color: #C5C1B4; }
+.ansi-white-bg { background-color: #C5C1B4; }
+.ansi-white-intense-fg { color: #A1A6B2; }
+.ansi-white-intense-bg { background-color: #A1A6B2; }
+
+.ansi-default-inverse-fg { color: #FFFFFF; }
+.ansi-default-inverse-bg { background-color: #000000; }
+
+.ansi-bold { font-weight: bold; }
+.ansi-underline { text-decoration: underline; }
+
+
+div.nbinput.container div.input_area div[class*=highlight] > pre,
+div.nboutput.container div.output_area div[class*=highlight] > pre,
+div.nboutput.container div.output_area div[class*=highlight].math,
+div.nboutput.container div.output_area.rendered_html,
+div.nboutput.container div.output_area > div.output_javascript,
+div.nboutput.container div.output_area:not(.rendered_html) > img{
+    padding: 5px;
+    margin: 0;
+}
+
+/* fix copybtn overflow problem in chromium (needed for 'sphinx_copybutton') */
+div.nbinput.container div.input_area > div[class^='highlight'],
+div.nboutput.container div.output_area > div[class^='highlight']{
+    overflow-y: hidden;
+}
+
+/* hide copybtn icon on prompts (needed for 'sphinx_copybutton') */
+.prompt .copybtn {
+    display: none;
+}
+
+/* Some additional styling taken form the Jupyter notebook CSS */
+.jp-RenderedHTMLCommon table,
+div.rendered_html table {
+  border: none;
+  border-collapse: collapse;
+  border-spacing: 0;
+  color: black;
+  font-size: 12px;
+  table-layout: fixed;
+}
+.jp-RenderedHTMLCommon thead,
+div.rendered_html thead {
+  border-bottom: 1px solid black;
+  vertical-align: bottom;
+}
+.jp-RenderedHTMLCommon tr,
+.jp-RenderedHTMLCommon th,
+.jp-RenderedHTMLCommon td,
+div.rendered_html tr,
+div.rendered_html th,
+div.rendered_html td {
+  text-align: right;
+  vertical-align: middle;
+  padding: 0.5em 0.5em;
+  line-height: normal;
+  white-space: normal;
+  max-width: none;
+  border: none;
+}
+.jp-RenderedHTMLCommon th,
+div.rendered_html th {
+  font-weight: bold;
+}
+.jp-RenderedHTMLCommon tbody tr:nth-child(odd),
+div.rendered_html tbody tr:nth-child(odd) {
+  background: #f5f5f5;
+}
+.jp-RenderedHTMLCommon tbody tr:hover,
+div.rendered_html tbody tr:hover {
+  background: rgba(66, 165, 245, 0.2);
+}
+
diff --git a/pull/44/_static/nbsphinx-gallery.css b/pull/44/_static/nbsphinx-gallery.css
new file mode 100644
index 0000000..365c27a
--- /dev/null
+++ b/pull/44/_static/nbsphinx-gallery.css
@@ -0,0 +1,31 @@
+.nbsphinx-gallery {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
+    gap: 5px;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.nbsphinx-gallery > a {
+    padding: 5px;
+    border: 1px dotted currentColor;
+    border-radius: 2px;
+    text-align: center;
+}
+
+.nbsphinx-gallery > a:hover {
+    border-style: solid;
+}
+
+.nbsphinx-gallery img {
+    max-width: 100%;
+    max-height: 100%;
+}
+
+.nbsphinx-gallery > a > div:first-child {
+    display: flex;
+    align-items: start;
+    justify-content: center;
+    height: 120px;
+    margin-bottom: 5px;
+}
diff --git a/pull/44/_static/nbsphinx-no-thumbnail.svg b/pull/44/_static/nbsphinx-no-thumbnail.svg
new file mode 100644
index 0000000..9dca758
--- /dev/null
+++ b/pull/44/_static/nbsphinx-no-thumbnail.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+  <style>
+    svg { fill: #ccc; }
+    @media (prefers-color-scheme: dark) {
+      svg { fill: #999; }
+    }
+  </style>
+  <path d="M 65.365328,74.550032 H 67.52154 V 88.67217 h 7.760238 v 1.814634 h -9.91645 z m -6.447298,0 h 2.156214 V 90.486804 H 58.91803 Z m -9.955303,2.124192 -2.924765,7.931025 h 5.860208 z m -1.216872,-2.124192 h 2.444423 l 6.073692,15.936772 h -2.241606 l -1.451709,-4.088268 h -7.183824 l -1.451707,4.088268 H 41.66149 Z m -21.264514,0 h 2.903417 L 36.45116,87.882271 V 74.550032 h 2.092171 V 90.486804 H 35.639914 L 28.573506,77.154569 v 13.332235 h -2.092165 z m 53.454813,-9.781663 v 5.838858 h 3.458479 q 1.739919,0 2.572513,-0.71518 0.843272,-0.725854 0.843272,-2.209586 0,-1.494406 -0.843272,-2.198912 -0.832594,-0.71518 -2.572513,-0.71518 z m 0,-6.554037 v 4.803447 h 3.191622 q 1.579803,0 2.348355,-0.587087 0.779225,-0.597763 0.779225,-1.814636 0,-1.206199 -0.779225,-1.803962 -0.768552,-0.597762 -2.348355,-0.597762 z m -2.156212,-1.771939 h 5.507949 q 2.465772,0 3.800065,1.024736 1.334288,1.024735 1.334288,2.914092 0,1.462383 -0.683157,2.327003 -0.683157,0.864621 -2.006771,1.078107 1.590471,0.341579 2.46577,1.43036 0.885967,1.078107 0.885967,2.700605 0,2.134866 -1.451708,3.298368 -1.451709,1.163502 -4.130963,1.163502 h -5.72144 z m -18.86154,0 h 3.212969 l 4.066921,10.845118 4.088269,-10.845118 H 73.49953 V 72.379166 H 71.396692 V 58.385121 L 67.287075,69.315634 H 65.120183 L 61.010567,58.385121 v 13.994045 h -2.092165 z m -16.246333,0 h 2.166892 v 9.681616 q 0,2.561839 0.928668,3.693318 0.928667,1.120804 3.010159,1.120804 2.070819,0 2.999486,-1.120804 0.928667,-1.131479 0.928667,-3.693318 v -9.681616 h 2.166886 v 9.948474 q 0,3.116904 -1.547776,4.70738 -1.537104,1.590474 -4.547263,1.590474 -3.020833,0 -4.568615,-1.590474 -1.537104,-1.590476 -1.537104,-4.70738 z m -16.192953,0 h 2.156213 v 6.532689 h 7.83496 v -6.532689 h 2.156213 v 15.936773 h -2.156213 v -7.589448 h -7.83496 v 7.589448 h -2.156213 z m -15.563168,0 h 13.481671 v 1.814636 H 18.740226 V 72.379166 H 16.573339 V 58.257029 H 10.915948 Z M 65.497127,39.809967 q -2.34835,0 -3.736011,1.750588 -1.376987,1.750588 -1.376987,4.771419 0,3.010157 1.376987,4.760745 1.387661,1.750588 3.736011,1.750588 2.348349,0 3.714662,-1.750588 1.376986,-1.750588 1.376986,-4.760745 0,-3.020831 -1.376986,-4.771419 -1.366313,-1.750588 -3.714662,-1.750588 z m 0,-1.750588 q 3.351735,0 5.358506,2.252281 2.006772,2.241606 2.006772,6.020314 0,3.768034 -2.006772,6.020315 -2.006771,2.241606 -5.358506,2.241606 -3.36241,0 -5.379856,-2.241606 -2.006771,-2.241607 -2.006771,-6.020315 0,-3.778708 2.006771,-6.020314 2.017446,-2.252281 5.379856,-2.252281 z m -22.821688,0.288206 h 2.903414 L 52.64525,51.679807 V 38.347585 h 2.092166 V 54.28434 H 51.834001 L 44.767605,40.952119 V 54.28434 h -2.092166 z" />
+</svg>
diff --git a/pull/44/_static/plus.png b/pull/44/_static/plus.png
new file mode 100644
index 0000000..7107cec
Binary files /dev/null and b/pull/44/_static/plus.png differ
diff --git a/pull/44/_static/pygments.css b/pull/44/_static/pygments.css
new file mode 100644
index 0000000..691aeb8
--- /dev/null
+++ b/pull/44/_static/pygments.css
@@ -0,0 +1,74 @@
+pre { line-height: 125%; }
+td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+.highlight .hll { background-color: #ffffcc }
+.highlight { background: #eeffcc; }
+.highlight .c { color: #408090; font-style: italic } /* Comment */
+.highlight .err { border: 1px solid #FF0000 } /* Error */
+.highlight .k { color: #007020; font-weight: bold } /* Keyword */
+.highlight .o { color: #666666 } /* Operator */
+.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #007020 } /* Comment.Preproc */
+.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
+.highlight .gd { color: #A00000 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #FF0000 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #00A000 } /* Generic.Inserted */
+.highlight .go { color: #333333 } /* Generic.Output */
+.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #0044DD } /* Generic.Traceback */
+.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #007020 } /* Keyword.Pseudo */
+.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #902000 } /* Keyword.Type */
+.highlight .m { color: #208050 } /* Literal.Number */
+.highlight .s { color: #4070a0 } /* Literal.String */
+.highlight .na { color: #4070a0 } /* Name.Attribute */
+.highlight .nb { color: #007020 } /* Name.Builtin */
+.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.highlight .no { color: #60add5 } /* Name.Constant */
+.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.highlight .ne { color: #007020 } /* Name.Exception */
+.highlight .nf { color: #06287e } /* Name.Function */
+.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
+.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #bb60d5 } /* Name.Variable */
+.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mb { color: #208050 } /* Literal.Number.Bin */
+.highlight .mf { color: #208050 } /* Literal.Number.Float */
+.highlight .mh { color: #208050 } /* Literal.Number.Hex */
+.highlight .mi { color: #208050 } /* Literal.Number.Integer */
+.highlight .mo { color: #208050 } /* Literal.Number.Oct */
+.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
+.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
+.highlight .sc { color: #4070a0 } /* Literal.String.Char */
+.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
+.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
+.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
+.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.highlight .sx { color: #c65d09 } /* Literal.String.Other */
+.highlight .sr { color: #235388 } /* Literal.String.Regex */
+.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
+.highlight .ss { color: #517918 } /* Literal.String.Symbol */
+.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #06287e } /* Name.Function.Magic */
+.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
+.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
+.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
+.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
+.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/pull/44/_static/sdc.css b/pull/44/_static/sdc.css
new file mode 100644
index 0000000..e777ebd
--- /dev/null
+++ b/pull/44/_static/sdc.css
@@ -0,0 +1,694 @@
+/*!
+ * Bootstrap v1.4.0
+ *
+ * Copyright 2011 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Heavily modified by Kyle Barbary for the AstroPy Project for use with Sphinx.
+ * Modified by Intel Corporation for Intel(R) Scalable Dataframe Compiler
+ */
+
+@import url("basic.css");
+
+/* Caption text --------------------------------------------------------------*/
+span-caption-text {
+  font-weight: bold;
+}
+
+/* Body text -----------------------------------------------------------------*/
+body {
+  background-color: #ffffff;
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 18px;
+  color: #001d33;
+}
+
+/* Hyperlinks ----------------------------------------------------------------*/
+
+a {
+  color: #0069d6;
+  text-decoration: none;
+  line-height: inherit;
+  font-weight: inherit;
+}
+
+a:hover {
+  color: #00438a;
+  text-decoration: underline;
+}
+
+/* Typography ----------------------------------------------------------------*/
+
+h1,h2,h3,h4,h5,h6 {
+  color: #003a66;
+  margin: 0.7em 0 0 0;
+  line-height: 1.5em;
+}
+h1 {
+  font-size: 26px;
+  margin: 0;
+}
+h2 {
+  font-size: 20px;
+  line-height: 1.2em;
+  margin: 1em 0 0.5em 0;
+  border-bottom: 1px solid #0070c5;
+}
+h3 {
+  font-size: 18px;
+}
+h4 {
+  font-size: 16px;
+}
+h5 {
+  font-size: 14px;
+}
+h6 {
+  font-size: 13px;
+  text-transform: uppercase;
+}
+
+p {
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 18px;
+  margin-top: 0px;
+  margin-bottom: 9px;
+}
+
+ul, ol {
+  margin-left: 0;
+  padding: 0 0 0 25px;
+}
+ul ul, ul ol, ol ol, ol ul {
+  margin-bottom: 0;
+}
+ul {
+  list-style: disc;
+}
+ol {
+  list-style: decimal;
+}
+li {
+  line-height: 18px;
+  color: #000010;
+}
+ul.unstyled {
+  list-style: none;
+  margin-left: 0;
+}
+dl {
+  margin-bottom: 18px;
+}
+dl dt, dl dd {
+  line-height: 18px;
+}
+dl dd {
+  margin-left: 9px;
+}
+hr {
+  margin: 20px 0 19px;
+  border: 0;
+  border-bottom: 1px solid #eee;
+}
+strong {
+  font-style: inherit;
+  font-weight: bold;
+}
+em {
+  font-style: italic;
+  font-weight: inherit;
+  line-height: inherit;
+}
+.muted {
+  color: #bfbfbf;
+}
+
+address {
+  display: block;
+  line-height: 18px;
+  margin-bottom: 18px;
+}
+code, pre {
+  padding: 0 3px 2px;
+  font-family: monospace;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+tt {
+  font-family: monospace;
+}
+code {
+  padding: 1px 3px;
+}
+pre {
+  display: block;
+  padding: 8.5px;
+  margin: 0 0 18px;
+  line-height: 18px;
+  border: 1px solid #ddd;
+  border: 1px solid rgba(0, 0, 0, 0.12);
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  white-space: pre;
+  word-wrap: break-word;
+}
+
+img {
+  margin: 9px 0;
+}
+
+/* format inline code with a rounded box */
+tt, code {
+    margin: 0 2px;
+    padding: 0 5px;
+    border: 1px solid #ddd;
+    border: 1px solid rgba(0, 0, 0, 0.12);
+    border-radius: 3px;
+}
+
+code.xref, a code {
+    margin: 0;
+    padding: 0 1px 0 1px;
+    background-color: transparent;
+    border: none;
+}
+
+/* all code has same box background color, even in headers */
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt,
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code,
+pre, code, tt {
+  background-color: #f8f8f8;
+}
+
+/* override box for links & other sphinx-specifc stuff */
+tt.xref, a tt, tt.descname, tt.descclassname {
+  padding: 0 1px 0 1px;
+  border: none;
+}
+
+/* override box for related bar at the top of the page */
+.related tt {
+  border: none;
+  padding: 0 1px 0 1px;
+  background-color: transparent;
+  font-weight: bold;
+}
+
+th {
+    background-color: #dddddd;
+}
+
+.viewcode-back {
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    background-color: #f4debf;
+    border-top: 1px solid #ac9;
+    border-bottom: 1px solid #ac9;
+}
+
+table.docutils {
+    border-spacing: 5px;
+    border-collapse: separate;
+}
+
+/* Topbar --------------------------------------------------------------------*/
+
+/* Horizontal bar */
+div.topbar {
+  height: 70px;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  z-index: 10000;
+  padding: 0px 10px;
+  background-color: #0070c5;
+  background-repeat: repeat-x;
+  background-image: -khtml-gradient(linear, left top, left bottom, from(#0070c5), to(#0091ff));
+  background-image: -moz-linear-gradient(top, #0070c5, #0091ff);
+  background-image: -ms-linear-gradient(top, #0070c5, #0091ff);
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #0070c5), color-stop(100%, #0091ff));
+  background-image: -webkit-linear-gradient(top, #0070c5, #0091ff);
+  background-image: -o-linear-gradient(top, #0070c5, #0091ff);
+  background-image: linear-gradient(to top, #0070c5, #0091ff);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0070c5', endColorstr='#0091ff', GradientType=0);
+  overflow-x: hidden;
+  overflow-y: hidden;
+  width: 100%;
+}
+
+/* Scalable Dataframe Compiler png */
+div.topbar a.brand_sdc {
+  width: 200px;
+  float: left;
+  display: block;
+  height: 60px;
+  padding: 8px 12px 0px 45px;
+  margin-left: -10px;
+  background: transparent url("DPEP.png") no-repeat 10px 4px;
+  background-size: 200px 50px;
+}
+
+
+div.topbar .brand:hover, div.topbar .brand_sdc:hover, div.topbar ul li a.homelink:hover {
+  background-color: #333;
+  background-color: rgba(255, 255, 255, 0.05);
+}
+
+div.topbar ul {
+    font-size: 120%;
+    list-style-type: none;
+    margin: 20px;
+    padding: 0 0 0 10px;
+    float: right;
+    color: #eeeeee;
+    text-align: center;
+    text-decoration: none;
+    height: 100%;
+    vertical-align: middle;
+}
+div.topbar ul li {
+    float: left;
+    display: inline-block;
+    height: 60px;
+    margin: 5px;
+    padding: 0px;
+    vertical-align: middle;
+}
+
+div.topbar ul li a {
+  color: #eeeeee;
+  text-decoration: none;
+  padding: 5px;
+  display: block;
+  height: auto;
+  text-align: center;
+  vertical-align: middle;
+  border-radius: 4px;
+}
+
+div.topbar ul li a:hover {
+  color: #ffffff;
+  text-decoration: none;
+}
+
+
+div.dropdown {
+    position: relative; /* Fixed this to relative */
+    display: inline-block;
+    z-index: 999999;
+}
+
+div.dropdown-content {
+    display: none; /* Fix this at none */
+    background-color: DimGray;
+    color: White;
+    width: 235px;
+    height: 155px;
+    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+    padding-top: 3px;
+    padding-right: 15px;
+    position: fixed;
+}
+
+div.dropdown:hover .dropdown-content {
+    display: block;
+}
+
+div.dropdown-content a {
+    display: block;
+}
+
+div.dropdown-content a:hover {
+    color: white;
+}
+
+div.dropdown a:hover {
+    color: #FF5000;
+}
+
+div.dropdown z:hover {
+    color: #FF5000;
+    width: 10px;
+    display: none;
+}
+
+div.dropdown z {
+    color: white;
+}
+
+div.dropdown:after {
+    content: "";
+    position: absolute;
+    right: -13px;
+    top: 9px;
+    width: 0;
+    height: 0;
+    border-left: 5px solid transparent;
+    border-right: 5px solid transparent;
+    border-top: 5px solid white;
+    z-index: 999999;
+}
+
+div.dropdown:hover {
+  cursor: pointer;
+}
+
+/* Intel(R) SDC Github page */
+div.topbar ul li a.homelink {
+  margin: -20px;
+  width: 90px;
+  display: block;
+  height: 60px;
+  padding: 5px 0px;
+  background: transparent url("sdc_github.png") no-repeat 5px 0px;
+  background-size: 60px 60px;
+}
+
+/* Intel(R) SDC Examples & Tutorials */
+div.topbar ul li a.exampleslink {
+  margin: -20px;
+  width: 90px;
+  display: block;
+  height: 60px;
+  padding: 5px 0px;
+  background: transparent url("sdc_examples.png") no-repeat 5px 0px;
+  background-size: 60px 60px;
+}
+
+/* Intel(R) SDC Email */
+div.topbar ul li a.emaillink {
+  margin: -20px;
+  width: 90px;
+  display: block;
+  height: 60px;
+  padding: 5px 0px;
+  background: transparent url("sdc_email.png") no-repeat 5px 0px;
+  background-size: 60px 60px;
+}
+
+/* Intel(R) SDC Issues */
+div.topbar ul li a.issueslink {
+  margin: -20px;
+  width: 90px;
+  display: block;
+  height: 60px;
+  padding: 5px 0px;
+  background: transparent url("sdc_issues.png") no-repeat 5px 0px;
+  background-size: 60px 60px;
+}
+
+
+div.topbar form {
+  text-align: left;
+  margin: 0 0 0 5px;
+  position: relative;
+  filter: alpha(opacity=100);
+  -khtml-opacity: 1;
+  -moz-opacity: 1;
+  opacity: 1;
+}
+
+div.topbar input {
+  background-color: #444;
+  background-color: rgba(255, 255, 255, 0.3);
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: medium;
+  font-weight: 200;
+  line-height: 1;
+  padding: 4px 9px;
+  color: #ffffff;
+  color: rgba(255, 255, 255, 0.75);
+  border: 1px solid #111;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
+  -webkit-transition: none;
+  -moz-transition: none;
+  -ms-transition: none;
+  -o-transition: none;
+  transition: none;
+}
+div.topbar input:-moz-placeholder {
+  color: #e6e6e6;
+}
+div.topbar input::-webkit-input-placeholder {
+  color: #e6e6e6;
+}
+div.topbar input:hover {
+  background-color: #bfbfbf;
+  background-color: rgba(255, 255, 255, 0.5);
+  color: #ffffff;
+}
+div.topbar input:focus, div.topbar input.focused {
+  outline: 0;
+  background-color: #ffffff;
+  color: #0070c5;
+  text-shadow: 0 1px 0 #ffffff;
+  border: 0;
+  padding: 5px 10px;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+
+/* Relation bar (breadcrumbs, prev, next) ------------------------------------*/
+
+div.related {
+    height: 21px;
+    width: auto;
+    margin: 0 10px;
+    position: relative;
+    top: 42px;
+    clear: both;
+    left: 0;
+    right: 0;
+    z-index: 999;
+    font-size: 100%;
+    vertical-align: middle;
+    background-color: #fff;
+    border-bottom: 1px solid #bbb;
+}
+div.related ul {
+    padding: 0;
+    margin: 0;
+}
+
+
+/* Footer --------------------------------------------------------------------*/
+
+footer {
+  display: block;
+  margin: 10px 10px 0px;
+  padding: 10px 0 0 0;
+  border-top: 1px solid #bbb;
+}
+.pull-right {
+  float: right;
+  width: 30em;
+  text-align: right;
+}
+
+
+/* Sphinx sidebar ------------------------------------------------------------*/
+div.sphinxsidebar {
+    font-size: inherit;
+    border-radius: 3px;
+    background-color: #eee;
+    border: 1px solid #bbb;
+    word-wrap: break-word;
+    /* overflow-wrap is the canonical name for word-wrap in the CSS3 text draft.
+    We include it here mainly for future-proofing. */
+    overflow-wrap: break-word;
+}
+
+div.sphinxsidebarwrapper {
+    padding: 0px 0px 0px 5px;
+}
+
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 5px 0px 0px 5px;
+    padding: 0;
+    line-height: 1.6em;
+}
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+div.sphinxsidebar p {
+}
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+div.sphinxsidebar ul {
+    margin: 0px 0px 0px 5px;
+    padding: 0;
+}
+
+div.sphinxsidebar ul ul {
+    margin-left: 15px;
+    list-style-type: disc;
+}
+
+/* If showing the global TOC (toctree),
+   color the current page differently */
+div.sphinxsidebar a.current {
+    color: #0070c5;
+}
+div.sphinxsidebar a.current:hover {
+    color: #0070c5;
+}
+
+
+/* document, documentwrapper, body, bodywrapper ----------------------------- */
+
+div.document {
+    margin-top: 72px;
+    margin-left: 10px;
+    margin-right: 10px;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.body {
+    background-color: #ffffff;
+    padding: 0 0 0px 20px;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+    max-width: 55em;
+}
+
+
+/* Header links ------------------------------------------------------------- */
+
+a.headerlink {
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+
+a.headerlink:hover {
+    background-color: #0069d6;
+    color: white;
+    text-decoration: none;
+}
+
+
+/* Admonitions and warnings ------------------------------------------------- */
+
+/* Shared by admonitions and warnings */
+div.admonition,
+div.warning {
+    padding: 0px;
+    border-radius: 3px;
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+}
+div.admonition p,
+div.warning p {
+    margin: 0.5em 1em 0.5em 1em;
+    padding: 0;
+}
+div.admonition pre,
+div.warning pre {
+    margin: 0.4em 1em 0.4em 1em;
+}
+div.admonition p.admonition-title,
+div.warning p.admonition-title {
+    margin: 0;
+    padding: 0.1em 0 0.1em 0.5em;
+    color: white;
+    font-weight: bold;
+    font-size: 1.1em;
+}
+div.admonition ul, div.admonition ol,
+div.warning ul, div.warning ol {
+    margin: 0.1em 0.5em 0.5em 3em;
+    padding: 0;
+}
+
+/* Admonitions only */
+div.admonition {
+    border: 1px solid  #0066cc;
+    background-color: #b3d9ff;
+}
+div.admonition p.admonition-title {
+    background-color: #1a8cff;
+}
+
+/* Warnings only */
+div.warning {
+    border: 1px solid #805500;
+    background-color: #ffe6b3;
+}
+div.warning p.admonition-title {
+    background-color: #ffc34d;
+}
+
+
+/* Figures ------------------------------------------------------------------ */
+
+.figure.align-center {
+    clear: none;
+}
+
+/* This is a div for containing multiple figures side-by-side, for use with
+ * .. container:: figures */
+div.figures {
+    border: 1px solid #CCCCCC;
+    background-color: #F8F8F8;
+    margin: 1em;
+    text-align: center;
+}
+
+div.figures .figure {
+    clear: none;
+    float: none;
+    display: inline-block;
+    border: none;
+    margin-left: 0.5em;
+    margin-right: 0.5em;
+}
+
+.field-list th {
+    white-space: nowrap;
+}
+
+table.field-list {
+    border-spacing: 0px;
+    margin-left: 1px;
+    border-left: 5px solid rgb(238, 238, 238) !important;
+}
+
+table.field-list th.field-name {
+    display: inline-block;
+    padding: 1px 8px 1px 5px;
+    white-space: nowrap;
+    background-color: rgb(238, 238, 238);
+    border-radius: 0 3px 3px 0;
+    -webkit-border-radius: 0 3px 3px 0;
+}
diff --git a/pull/44/_static/sdc_email.png b/pull/44/_static/sdc_email.png
new file mode 100644
index 0000000..9fde617
Binary files /dev/null and b/pull/44/_static/sdc_email.png differ
diff --git a/pull/44/_static/sdc_examples.png b/pull/44/_static/sdc_examples.png
new file mode 100644
index 0000000..dd7095b
Binary files /dev/null and b/pull/44/_static/sdc_examples.png differ
diff --git a/pull/44/_static/sdc_github.png b/pull/44/_static/sdc_github.png
new file mode 100644
index 0000000..89467c5
Binary files /dev/null and b/pull/44/_static/sdc_github.png differ
diff --git a/pull/44/_static/sdc_issues.png b/pull/44/_static/sdc_issues.png
new file mode 100644
index 0000000..13d5974
Binary files /dev/null and b/pull/44/_static/sdc_issues.png differ
diff --git a/pull/44/_static/searchtools.js b/pull/44/_static/searchtools.js
new file mode 100644
index 0000000..97d56a7
--- /dev/null
+++ b/pull/44/_static/searchtools.js
@@ -0,0 +1,566 @@
+/*
+ * searchtools.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for the full-text search.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+/**
+ * Simple result scoring code.
+ */
+if (typeof Scorer === "undefined") {
+  var Scorer = {
+    // Implement the following function to further tweak the score for each result
+    // The function takes a result array [docname, title, anchor, descr, score, filename]
+    // and returns the new score.
+    /*
+    score: result => {
+      const [docname, title, anchor, descr, score, filename] = result
+      return score
+    },
+    */
+
+    // query matches the full name of an object
+    objNameMatch: 11,
+    // or matches in the last dotted part of the object name
+    objPartialMatch: 6,
+    // Additive scores depending on the priority of the object
+    objPrio: {
+      0: 15, // used to be importantResults
+      1: 5, // used to be objectResults
+      2: -5, // used to be unimportantResults
+    },
+    //  Used when the priority is not in the mapping.
+    objPrioDefault: 0,
+
+    // query found in title
+    title: 15,
+    partialTitle: 7,
+    // query found in terms
+    term: 5,
+    partialTerm: 2,
+  };
+}
+
+const _removeChildren = (element) => {
+  while (element && element.lastChild) element.removeChild(element.lastChild);
+};
+
+/**
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
+ */
+const _escapeRegExp = (string) =>
+  string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
+
+const _displayItem = (item, searchTerms) => {
+  const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
+  const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT;
+  const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
+  const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
+  const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
+
+  const [docName, title, anchor, descr, score, _filename] = item;
+
+  let listItem = document.createElement("li");
+  let requestUrl;
+  let linkUrl;
+  if (docBuilder === "dirhtml") {
+    // dirhtml builder
+    let dirname = docName + "/";
+    if (dirname.match(/\/index\/$/))
+      dirname = dirname.substring(0, dirname.length - 6);
+    else if (dirname === "index/") dirname = "";
+    requestUrl = docUrlRoot + dirname;
+    linkUrl = requestUrl;
+  } else {
+    // normal html builders
+    requestUrl = docUrlRoot + docName + docFileSuffix;
+    linkUrl = docName + docLinkSuffix;
+  }
+  let linkEl = listItem.appendChild(document.createElement("a"));
+  linkEl.href = linkUrl + anchor;
+  linkEl.dataset.score = score;
+  linkEl.innerHTML = title;
+  if (descr)
+    listItem.appendChild(document.createElement("span")).innerHTML =
+      " (" + descr + ")";
+  else if (showSearchSummary)
+    fetch(requestUrl)
+      .then((responseData) => responseData.text())
+      .then((data) => {
+        if (data)
+          listItem.appendChild(
+            Search.makeSearchSummary(data, searchTerms)
+          );
+      });
+  Search.output.appendChild(listItem);
+};
+const _finishSearch = (resultCount) => {
+  Search.stopPulse();
+  Search.title.innerText = _("Search Results");
+  if (!resultCount)
+    Search.status.innerText = Documentation.gettext(
+      "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
+    );
+  else
+    Search.status.innerText = _(
+      `Search finished, found ${resultCount} page(s) matching the search query.`
+    );
+};
+const _displayNextItem = (
+  results,
+  resultCount,
+  searchTerms
+) => {
+  // results left, load the summary and display it
+  // this is intended to be dynamic (don't sub resultsCount)
+  if (results.length) {
+    _displayItem(results.pop(), searchTerms);
+    setTimeout(
+      () => _displayNextItem(results, resultCount, searchTerms),
+      5
+    );
+  }
+  // search finished, update title and status message
+  else _finishSearch(resultCount);
+};
+
+/**
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
+ * custom function per language.
+ *
+ * The regular expression works by splitting the string on consecutive characters
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
+ */
+if (typeof splitQuery === "undefined") {
+  var splitQuery = (query) => query
+      .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
+      .filter(term => term)  // remove remaining empty strings
+}
+
+/**
+ * Search Module
+ */
+const Search = {
+  _index: null,
+  _queued_query: null,
+  _pulse_status: -1,
+
+  htmlToText: (htmlString) => {
+    const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
+    htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
+    const docContent = htmlElement.querySelector('[role="main"]');
+    if (docContent !== undefined) return docContent.textContent;
+    console.warn(
+      "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
+    );
+    return "";
+  },
+
+  init: () => {
+    const query = new URLSearchParams(window.location.search).get("q");
+    document
+      .querySelectorAll('input[name="q"]')
+      .forEach((el) => (el.value = query));
+    if (query) Search.performSearch(query);
+  },
+
+  loadIndex: (url) =>
+    (document.body.appendChild(document.createElement("script")).src = url),
+
+  setIndex: (index) => {
+    Search._index = index;
+    if (Search._queued_query !== null) {
+      const query = Search._queued_query;
+      Search._queued_query = null;
+      Search.query(query);
+    }
+  },
+
+  hasIndex: () => Search._index !== null,
+
+  deferQuery: (query) => (Search._queued_query = query),
+
+  stopPulse: () => (Search._pulse_status = -1),
+
+  startPulse: () => {
+    if (Search._pulse_status >= 0) return;
+
+    const pulse = () => {
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      Search.dots.innerText = ".".repeat(Search._pulse_status);
+      if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
+    };
+    pulse();
+  },
+
+  /**
+   * perform a search for something (or wait until index is loaded)
+   */
+  performSearch: (query) => {
+    // create the required interface elements
+    const searchText = document.createElement("h2");
+    searchText.textContent = _("Searching");
+    const searchSummary = document.createElement("p");
+    searchSummary.classList.add("search-summary");
+    searchSummary.innerText = "";
+    const searchList = document.createElement("ul");
+    searchList.classList.add("search");
+
+    const out = document.getElementById("search-results");
+    Search.title = out.appendChild(searchText);
+    Search.dots = Search.title.appendChild(document.createElement("span"));
+    Search.status = out.appendChild(searchSummary);
+    Search.output = out.appendChild(searchList);
+
+    const searchProgress = document.getElementById("search-progress");
+    // Some themes don't use the search progress node
+    if (searchProgress) {
+      searchProgress.innerText = _("Preparing search...");
+    }
+    Search.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (Search.hasIndex()) Search.query(query);
+    else Search.deferQuery(query);
+  },
+
+  /**
+   * execute search (requires search index to be loaded)
+   */
+  query: (query) => {
+    const filenames = Search._index.filenames;
+    const docNames = Search._index.docnames;
+    const titles = Search._index.titles;
+    const allTitles = Search._index.alltitles;
+    const indexEntries = Search._index.indexentries;
+
+    // stem the search terms and add them to the correct list
+    const stemmer = new Stemmer();
+    const searchTerms = new Set();
+    const excludedTerms = new Set();
+    const highlightTerms = new Set();
+    const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
+    splitQuery(query.trim()).forEach((queryTerm) => {
+      const queryTermLower = queryTerm.toLowerCase();
+
+      // maybe skip this "word"
+      // stopwords array is from language_data.js
+      if (
+        stopwords.indexOf(queryTermLower) !== -1 ||
+        queryTerm.match(/^\d+$/)
+      )
+        return;
+
+      // stem the word
+      let word = stemmer.stemWord(queryTermLower);
+      // select the correct list
+      if (word[0] === "-") excludedTerms.add(word.substr(1));
+      else {
+        searchTerms.add(word);
+        highlightTerms.add(queryTermLower);
+      }
+    });
+
+    if (SPHINX_HIGHLIGHT_ENABLED) {  // set in sphinx_highlight.js
+      localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
+    }
+
+    // console.debug("SEARCH: searching for:");
+    // console.info("required: ", [...searchTerms]);
+    // console.info("excluded: ", [...excludedTerms]);
+
+    // array of [docname, title, anchor, descr, score, filename]
+    let results = [];
+    _removeChildren(document.getElementById("search-progress"));
+
+    const queryLower = query.toLowerCase();
+    for (const [title, foundTitles] of Object.entries(allTitles)) {
+      if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
+        for (const [file, id] of foundTitles) {
+          let score = Math.round(100 * queryLower.length / title.length)
+          results.push([
+            docNames[file],
+            titles[file] !== title ? `${titles[file]} > ${title}` : title,
+            id !== null ? "#" + id : "",
+            null,
+            score,
+            filenames[file],
+          ]);
+        }
+      }
+    }
+
+    // search for explicit entries in index directives
+    for (const [entry, foundEntries] of Object.entries(indexEntries)) {
+      if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
+        for (const [file, id] of foundEntries) {
+          let score = Math.round(100 * queryLower.length / entry.length)
+          results.push([
+            docNames[file],
+            titles[file],
+            id ? "#" + id : "",
+            null,
+            score,
+            filenames[file],
+          ]);
+        }
+      }
+    }
+
+    // lookup as object
+    objectTerms.forEach((term) =>
+      results.push(...Search.performObjectSearch(term, objectTerms))
+    );
+
+    // lookup as search terms in fulltext
+    results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
+
+    // let the scorer override scores with a custom scoring function
+    if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
+
+    // now sort the results by score (in opposite order of appearance, since the
+    // display function below uses pop() to retrieve items) and then
+    // alphabetically
+    results.sort((a, b) => {
+      const leftScore = a[4];
+      const rightScore = b[4];
+      if (leftScore === rightScore) {
+        // same score: sort alphabetically
+        const leftTitle = a[1].toLowerCase();
+        const rightTitle = b[1].toLowerCase();
+        if (leftTitle === rightTitle) return 0;
+        return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+      }
+      return leftScore > rightScore ? 1 : -1;
+    });
+
+    // remove duplicate search results
+    // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
+    let seen = new Set();
+    results = results.reverse().reduce((acc, result) => {
+      let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
+      if (!seen.has(resultStr)) {
+        acc.push(result);
+        seen.add(resultStr);
+      }
+      return acc;
+    }, []);
+
+    results = results.reverse();
+
+    // for debugging
+    //Search.lastresults = results.slice();  // a copy
+    // console.info("search results:", Search.lastresults);
+
+    // print the results
+    _displayNextItem(results, results.length, searchTerms);
+  },
+
+  /**
+   * search for object names
+   */
+  performObjectSearch: (object, objectTerms) => {
+    const filenames = Search._index.filenames;
+    const docNames = Search._index.docnames;
+    const objects = Search._index.objects;
+    const objNames = Search._index.objnames;
+    const titles = Search._index.titles;
+
+    const results = [];
+
+    const objectSearchCallback = (prefix, match) => {
+      const name = match[4]
+      const fullname = (prefix ? prefix + "." : "") + name;
+      const fullnameLower = fullname.toLowerCase();
+      if (fullnameLower.indexOf(object) < 0) return;
+
+      let score = 0;
+      const parts = fullnameLower.split(".");
+
+      // check for different match types: exact matches of full name or
+      // "last name" (i.e. last dotted part)
+      if (fullnameLower === object || parts.slice(-1)[0] === object)
+        score += Scorer.objNameMatch;
+      else if (parts.slice(-1)[0].indexOf(object) > -1)
+        score += Scorer.objPartialMatch; // matches in last name
+
+      const objName = objNames[match[1]][2];
+      const title = titles[match[0]];
+
+      // If more than one term searched for, we require other words to be
+      // found in the name/title/description
+      const otherTerms = new Set(objectTerms);
+      otherTerms.delete(object);
+      if (otherTerms.size > 0) {
+        const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
+        if (
+          [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
+        )
+          return;
+      }
+
+      let anchor = match[3];
+      if (anchor === "") anchor = fullname;
+      else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
+
+      const descr = objName + _(", in ") + title;
+
+      // add custom score for some objects according to scorer
+      if (Scorer.objPrio.hasOwnProperty(match[2]))
+        score += Scorer.objPrio[match[2]];
+      else score += Scorer.objPrioDefault;
+
+      results.push([
+        docNames[match[0]],
+        fullname,
+        "#" + anchor,
+        descr,
+        score,
+        filenames[match[0]],
+      ]);
+    };
+    Object.keys(objects).forEach((prefix) =>
+      objects[prefix].forEach((array) =>
+        objectSearchCallback(prefix, array)
+      )
+    );
+    return results;
+  },
+
+  /**
+   * search for full-text terms in the index
+   */
+  performTermsSearch: (searchTerms, excludedTerms) => {
+    // prepare search
+    const terms = Search._index.terms;
+    const titleTerms = Search._index.titleterms;
+    const filenames = Search._index.filenames;
+    const docNames = Search._index.docnames;
+    const titles = Search._index.titles;
+
+    const scoreMap = new Map();
+    const fileMap = new Map();
+
+    // perform the search on the required terms
+    searchTerms.forEach((word) => {
+      const files = [];
+      const arr = [
+        { files: terms[word], score: Scorer.term },
+        { files: titleTerms[word], score: Scorer.title },
+      ];
+      // add support for partial matches
+      if (word.length > 2) {
+        const escapedWord = _escapeRegExp(word);
+        Object.keys(terms).forEach((term) => {
+          if (term.match(escapedWord) && !terms[word])
+            arr.push({ files: terms[term], score: Scorer.partialTerm });
+        });
+        Object.keys(titleTerms).forEach((term) => {
+          if (term.match(escapedWord) && !titleTerms[word])
+            arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
+        });
+      }
+
+      // no match but word was a required one
+      if (arr.every((record) => record.files === undefined)) return;
+
+      // found search word in contents
+      arr.forEach((record) => {
+        if (record.files === undefined) return;
+
+        let recordFiles = record.files;
+        if (recordFiles.length === undefined) recordFiles = [recordFiles];
+        files.push(...recordFiles);
+
+        // set score for the word in each file
+        recordFiles.forEach((file) => {
+          if (!scoreMap.has(file)) scoreMap.set(file, {});
+          scoreMap.get(file)[word] = record.score;
+        });
+      });
+
+      // create the mapping
+      files.forEach((file) => {
+        if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
+          fileMap.get(file).push(word);
+        else fileMap.set(file, [word]);
+      });
+    });
+
+    // now check if the files don't contain excluded terms
+    const results = [];
+    for (const [file, wordList] of fileMap) {
+      // check if all requirements are matched
+
+      // as search terms with length < 3 are discarded
+      const filteredTermCount = [...searchTerms].filter(
+        (term) => term.length > 2
+      ).length;
+      if (
+        wordList.length !== searchTerms.size &&
+        wordList.length !== filteredTermCount
+      )
+        continue;
+
+      // ensure that none of the excluded terms is in the search result
+      if (
+        [...excludedTerms].some(
+          (term) =>
+            terms[term] === file ||
+            titleTerms[term] === file ||
+            (terms[term] || []).includes(file) ||
+            (titleTerms[term] || []).includes(file)
+        )
+      )
+        break;
+
+      // select one (max) score for the file.
+      const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
+      // add result to the result list
+      results.push([
+        docNames[file],
+        titles[file],
+        "",
+        null,
+        score,
+        filenames[file],
+      ]);
+    }
+    return results;
+  },
+
+  /**
+   * helper function to return a node containing the
+   * search summary for a given text. keywords is a list
+   * of stemmed words.
+   */
+  makeSearchSummary: (htmlText, keywords) => {
+    const text = Search.htmlToText(htmlText);
+    if (text === "") return null;
+
+    const textLower = text.toLowerCase();
+    const actualStartPosition = [...keywords]
+      .map((k) => textLower.indexOf(k.toLowerCase()))
+      .filter((i) => i > -1)
+      .slice(-1)[0];
+    const startWithContext = Math.max(actualStartPosition - 120, 0);
+
+    const top = startWithContext === 0 ? "" : "...";
+    const tail = startWithContext + 240 < text.length ? "..." : "";
+
+    let summary = document.createElement("p");
+    summary.classList.add("context");
+    summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
+
+    return summary;
+  },
+};
+
+_ready(Search.init);
diff --git a/pull/44/_static/sidebar.js b/pull/44/_static/sidebar.js
new file mode 100644
index 0000000..8922cda
--- /dev/null
+++ b/pull/44/_static/sidebar.js
@@ -0,0 +1,160 @@
+﻿/*
+ * sidebar.js
+ * ~~~~~~~~~~
+ *
+ * This script makes the Sphinx sidebar collapsible.
+ *
+ * .sphinxsidebar contains .sphinxsidebarwrapper.  This script adds
+ * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
+ * used to collapse and expand the sidebar.
+ *
+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
+ * and the width of the sidebar and the margin-left of the document
+ * are decreased. When the sidebar is expanded the opposite happens.
+ * This script saves a per-browser/per-session cookie used to
+ * remember the position of the sidebar among the pages.
+ * Once the browser is closed the cookie is deleted and the position
+ * reset to the default (expanded).
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+$(function() {
+  // global elements used by the functions.
+  // the 'sidebarbutton' element is defined as global after its
+  // creation, in the add_sidebar_button function
+  var bodywrapper = $('.bodywrapper');
+  var sidebar = $('.sphinxsidebar');
+  var sidebarwrapper = $('.sphinxsidebarwrapper');
+
+  // for some reason, the document has no sidebar; do not run into errors
+  if (!sidebar.length) return;
+
+  // original margin-left of the bodywrapper and width of the sidebar
+  // with the sidebar expanded
+  var bw_margin_expanded = bodywrapper.css('margin-left');
+  var ssb_width_expanded = sidebar.width();
+
+  // margin-left of the bodywrapper and width of the sidebar
+  // with the sidebar collapsed
+  var bw_margin_collapsed = 12;
+  var ssb_width_collapsed = 12;
+
+  // custom colors
+  var dark_color = '#003a66';
+  var light_color = '#0070c5';
+
+  function sidebar_is_collapsed() {
+    return sidebarwrapper.is(':not(:visible)');
+  }
+
+  function toggle_sidebar() {
+    if (sidebar_is_collapsed())
+      expand_sidebar();
+    else
+      collapse_sidebar();
+  }
+
+  function collapse_sidebar() {
+    sidebarwrapper.hide();
+    sidebar.css('width', ssb_width_collapsed);
+    bodywrapper.css('margin-left', bw_margin_collapsed);
+    sidebarbutton.css({
+        'margin-left': '-1px',
+        'height': bodywrapper.height(),
+	'border-radius': '3px'
+    });
+    sidebarbutton.find('span').text('»');
+    sidebarbutton.attr('title', _('Expand sidebar'));
+    document.cookie = 'sidebar=collapsed';
+  }
+
+  function expand_sidebar() {
+    bodywrapper.css('margin-left', bw_margin_expanded);
+    sidebar.css('width', ssb_width_expanded);
+    sidebarwrapper.show();
+    sidebarbutton.css({
+        'margin-left': ssb_width_expanded - 12,
+        'height': bodywrapper.height(),
+	'border-radius': '0px 3px 3px 0px'
+    });
+    sidebarbutton.find('span').text('«');
+    sidebarbutton.attr('title', _('Collapse sidebar'));
+    document.cookie = 'sidebar=expanded';
+  }
+
+  function add_sidebar_button() {
+    sidebarwrapper.css({
+        'float': 'left',
+        'margin-right': '0',
+        'width': ssb_width_expanded - 18
+    });
+    // create the button
+    sidebar.append('<div id="sidebarbutton"><span>&laquo;</span></div>');
+    var sidebarbutton = $('#sidebarbutton');
+
+    // find the height of the viewport to center the '<<' in the page
+    var viewport_height;
+    if (window.innerHeight)
+ 	  viewport_height = window.innerHeight;
+    else
+	  viewport_height = $(window).height();
+    var sidebar_offset = sidebar.offset().top;
+    var sidebar_height = Math.max(bodywrapper.height(), sidebar.height());
+    sidebarbutton.find('span').css({
+        'font-family': '"Lucida Grande",Arial,sans-serif',
+	'display': 'block',
+	'top': Math.min(viewport_height/2, sidebar_height/2 + sidebar_offset) - 10,
+	'width': 12,
+	'position': 'fixed',
+	'text-align': 'center'
+    });
+
+    sidebarbutton.click(toggle_sidebar);
+    sidebarbutton.attr('title', _('Collapse sidebar'));
+    sidebarbutton.css({
+        'color': '#FFFFFF',
+	'background-color': light_color,
+	'border': '1px solid ' + light_color,
+        'border-radius': '0px 3px 3px 0px',
+        'font-size': '1.2em',
+        'cursor': 'pointer',
+        'height': sidebar_height,
+        'padding-top': '1px',
+	'margin': '-1px',
+        'margin-left': ssb_width_expanded - 12
+    });
+
+    sidebarbutton.hover(
+      function () {
+          $(this).css('background-color', dark_color);
+      },
+      function () {
+          $(this).css('background-color', light_color);
+      }
+    );
+  }
+
+  function set_position_from_cookie() {
+    if (!document.cookie)
+      return;
+    var items = document.cookie.split(';');
+    for(var k=0; k<items.length; k++) {
+      var key_val = items[k].split('=');
+      var key = key_val[0];
+      if (key == 'sidebar') {
+        var value = key_val[1];
+        if ((value == 'collapsed') && (!sidebar_is_collapsed()))
+          collapse_sidebar();
+        else if ((value == 'expanded') && (sidebar_is_collapsed()))
+          expand_sidebar();
+      }
+    }
+  }
+
+  add_sidebar_button();
+  var sidebarbutton = $('#sidebarbutton');
+  set_position_from_cookie();
+});
diff --git a/pull/44/_static/sphinx_highlight.js b/pull/44/_static/sphinx_highlight.js
new file mode 100644
index 0000000..aae669d
--- /dev/null
+++ b/pull/44/_static/sphinx_highlight.js
@@ -0,0 +1,144 @@
+/* Highlighting utilities for Sphinx HTML documentation. */
+"use strict";
+
+const SPHINX_HIGHLIGHT_ENABLED = true
+
+/**
+ * highlight a given string on a node by wrapping it in
+ * span elements with the given class name.
+ */
+const _highlight = (node, addItems, text, className) => {
+  if (node.nodeType === Node.TEXT_NODE) {
+    const val = node.nodeValue;
+    const parent = node.parentNode;
+    const pos = val.toLowerCase().indexOf(text);
+    if (
+      pos >= 0 &&
+      !parent.classList.contains(className) &&
+      !parent.classList.contains("nohighlight")
+    ) {
+      let span;
+
+      const closestNode = parent.closest("body, svg, foreignObject");
+      const isInSVG = closestNode && closestNode.matches("svg");
+      if (isInSVG) {
+        span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+      } else {
+        span = document.createElement("span");
+        span.classList.add(className);
+      }
+
+      span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+      parent.insertBefore(
+        span,
+        parent.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling
+        )
+      );
+      node.nodeValue = val.substr(0, pos);
+
+      if (isInSVG) {
+        const rect = document.createElementNS(
+          "http://www.w3.org/2000/svg",
+          "rect"
+        );
+        const bbox = parent.getBBox();
+        rect.x.baseVal.value = bbox.x;
+        rect.y.baseVal.value = bbox.y;
+        rect.width.baseVal.value = bbox.width;
+        rect.height.baseVal.value = bbox.height;
+        rect.setAttribute("class", className);
+        addItems.push({ parent: parent, target: rect });
+      }
+    }
+  } else if (node.matches && !node.matches("button, select, textarea")) {
+    node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
+  }
+};
+const _highlightText = (thisNode, text, className) => {
+  let addItems = [];
+  _highlight(thisNode, addItems, text, className);
+  addItems.forEach((obj) =>
+    obj.parent.insertAdjacentElement("beforebegin", obj.target)
+  );
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const SphinxHighlight = {
+
+  /**
+   * highlight the search words provided in localstorage in the text
+   */
+  highlightSearchWords: () => {
+    if (!SPHINX_HIGHLIGHT_ENABLED) return;  // bail if no highlight
+
+    // get and clear terms from localstorage
+    const url = new URL(window.location);
+    const highlight =
+        localStorage.getItem("sphinx_highlight_terms")
+        || url.searchParams.get("highlight")
+        || "";
+    localStorage.removeItem("sphinx_highlight_terms")
+    url.searchParams.delete("highlight");
+    window.history.replaceState({}, "", url);
+
+    // get individual terms from highlight string
+    const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
+    if (terms.length === 0) return; // nothing to do
+
+    // There should never be more than one element matching "div.body"
+    const divBody = document.querySelectorAll("div.body");
+    const body = divBody.length ? divBody[0] : document.querySelector("body");
+    window.setTimeout(() => {
+      terms.forEach((term) => _highlightText(body, term, "highlighted"));
+    }, 10);
+
+    const searchBox = document.getElementById("searchbox");
+    if (searchBox === null) return;
+    searchBox.appendChild(
+      document
+        .createRange()
+        .createContextualFragment(
+          '<p class="highlight-link">' +
+            '<a href="javascript:SphinxHighlight.hideSearchWords()">' +
+            _("Hide Search Matches") +
+            "</a></p>"
+        )
+    );
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords: () => {
+    document
+      .querySelectorAll("#searchbox .highlight-link")
+      .forEach((el) => el.remove());
+    document
+      .querySelectorAll("span.highlighted")
+      .forEach((el) => el.classList.remove("highlighted"));
+    localStorage.removeItem("sphinx_highlight_terms")
+  },
+
+  initEscapeListener: () => {
+    // only install a listener if it is really needed
+    if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
+
+    document.addEventListener("keydown", (event) => {
+      // bail for input elements
+      if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+      // bail with special keys
+      if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
+      if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
+        SphinxHighlight.hideSearchWords();
+        event.preventDefault();
+      }
+    });
+  },
+};
+
+_ready(SphinxHighlight.highlightSearchWords);
+_ready(SphinxHighlight.initEscapeListener);
diff --git a/pull/44/benchmarks.html b/pull/44/benchmarks.html
new file mode 100644
index 0000000..938faa0
--- /dev/null
+++ b/pull/44/benchmarks.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Benchmarks &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Demos" href="demos.html" />
+    <link rel="prev" title="Jupyter Notebook 2: Falling back to NumPy" href="notebooks/02-dpnp_numpy_fallback.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="demos.html" title="Demos">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="notebooks/02-dpnp_numpy_fallback.html" title="Jupyter Notebook 2: Falling back to NumPy">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Benchmarks</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="benchmarks"></span><section id="id1">
+<h1>Benchmarks<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<p><strong>Data Parallel Extensions for Python</strong> provide a set of
+<a class="reference external" href="https://github.com/IntelPython/dpbench">benchmarks</a> illustrating different aspects of
+implementing the performant code with Data Parallel Extensions for Python.
+Benchmarks represent some real life numerical problem or some important part (kernel) of real life application.
+Each application/kernel is implemented in several variants (not necessarily all variants):</p>
+<ul class="simple">
+<li><p>Pure Python: Typically the slowest and used just as a reference implementation</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numpy</span></code>: Same application/kernel implemented using NumPy library</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">dpnp</span></code>: Modified numpy implementation to run on a specific device. You can use numpy as a baseline while evaluating the dpnp implementation and its performance</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba</span> <span class="pre">&#64;njit</span></code> array-style: application/kernel implemented using NumPy and compiled with Numba. You can use numpy as a baseline when evaluate numba &#64;njit array-style implementat and its performance</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba</span> <span class="pre">&#64;njit</span></code> direct loops (prange): Same application/kernel implemented using Numba compiler using direct loops. Sometimes array-style programming is cumbersome and performance inefficient. Using direct loop programming may lead to more readable and performance code. Thus, while evaluating the performance of direct loop implementation it is useful to compare array-style Numba implementation as a baseline</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-dpex</span> <span class="pre">&#64;dpjit</span></code> array-style: Modified numba &#64;njit array-style implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing numba-dpex implementation details and performance. You can also compare it against dpnp implementation to see how much extra performance numba-dpex can bring when you compile NumPy code for a given device</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-dpex</span> <span class="pre">&#64;dpjit</span></code> direct loops (prange): Modified numba &#64;njit direct loop implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing numba-dpex implementation details and performance. You can also compare it against dpnp implementation to see how much extra performance numba-dpex can bring when you compile NumPy code for a given device</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-dpex</span> <span class="pre">&#64;dpjit</span></code> kernel: Kernel-style programming, which is close to &#64;cuda.jit programming model used in vanilla Numba</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-mlir</span></code>: Array-style, direct loops and kernel-style implementations for experimental MLIR-based backend for Numba</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">cupy</span></code>: NumPy-like implementation using CuPy to run on CUDA-compatible devices</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">&#64;cuda.jit</span></code>: Kernel-style Numba implementation to run on CUDA-compatible devices</p></li>
+<li><p>Native SYCL: Most applications/kernels also have DPC++ implementation, which can be used to compare performance of above implementations to DPC++ compiled code.</p></li>
+</ul>
+<p>These benchmarks are implemented in <code class="docutils literal notranslate"><span class="pre">dpbench</span></code> framework, which allows you to run all or select benchmarks and variants to evaluate their performance on different hardware.</p>
+<p>For more details please refer to <code class="docutils literal notranslate"><span class="pre">dpbench</span></code>
+<a class="reference external" href="https://github.com/IntelPython/dpbench/blob/main/README.md">documentation</a>.</p>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="notebooks/02-dpnp_numpy_fallback.html"
+                          title="previous chapter">Jupyter Notebook 2: Falling back to NumPy</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="demos.html"
+                          title="next chapter">Demos</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/demos.html b/pull/44/demos.html
new file mode 100644
index 0000000..dec6648
--- /dev/null
+++ b/pull/44/demos.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Demos &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Useful links" href="useful_links.html" />
+    <link rel="prev" title="Benchmarks" href="benchmarks.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="useful_links.html" title="Useful links">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="benchmarks.html" title="Benchmarks">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Demos</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="demos"></span><section id="id1">
+<h1>Demos<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<p>There are several demo applications illustrating the power of the <strong>Data Parallel Extensions for Python</strong>. They are:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos/mcpi">Monte Carlo Pi</a>
+The Monte Carlo method to estimate the value of <span class="math notranslate nohighlight">\(\pi\)</span>.</p></li>
+<li><p><a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos/mandelbrot">Mandelbrot Set</a>
+Visualization of the breathtaking process of diving in the famous Mandelbrot fractal</p></li>
+<li><p><a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos/game-of-life">Game of Life</a>
+Visualization of the life evolution using famous Conway’s model</p></li>
+</ul>
+<p>All demos are located in the <a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos">GitHub repository</a>.
+For more details please refer to the documentation located in the individual demo directory.</p>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="benchmarks.html"
+                          title="previous chapter">Benchmarks</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="useful_links.html"
+                          title="next chapter">Useful links</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/examples.html b/pull/44/examples.html
new file mode 100644
index 0000000..2127b4b
--- /dev/null
+++ b/pull/44/examples.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Examples &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Tutorials" href="jupyter_notebook.html" />
+    <link rel="prev" title="Programming with Data Parallel Extensions for Python" href="programming_dpep.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="#"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="jupyter_notebook.html" title="Tutorials">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="programming_dpep.html" title="Programming with Data Parallel Extensions for Python">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Examples</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="examples"></span><section id="id1">
+<h1>Examples<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<p>All examples are located in the <a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/examples">GitHub repository</a>.
+Their names start with the 2-digit number followed by a descriptive name.
+You can run examples in any order, however, if
+you are new to the Data Parallel Extensions for Python, it is recommended to go in the order examples are enumerated.</p>
+<p>The following command will run the very first example of using Data Parallel Extensions for Python</p>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">python ./examples/01-hello_dpnp.py</span>
+</pre></div>
+</div>
+<p>These are listings of these examples:</p>
+<div class="literal-block-wrapper docutils container" id="examples-01-hello-dpnp">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 01:</strong> Your first NumPy code running on GPU</span><a class="headerlink" href="#examples-01-hello-dpnp" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="examples-02-dpnp-device">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 02:</strong> Select device type while creating array</span><a class="headerlink" href="#examples-02-dpnp-device" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="examples-03-dpnp2numba-dpex">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 03:</strong> Compile dpnp code with numba-dpex</span><a class="headerlink" href="#examples-03-dpnp2numba-dpex" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">from</span> <span class="nn">numba_dpex</span> <span class="kn">import</span> <span class="n">dpjit</span> <span class="k">as</span> <span class="n">njit</span>
+
+
+<span class="nd">@njit</span><span class="p">()</span>
+<span class="k">def</span> <span class="nf">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>  <span class="c1"># Device queue is inferred from x. The kernel is submitted to that queue</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="examples-04-dpctl-device-query">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 04:</strong> Get information about devices</span><a class="headerlink" href="#examples-04-dpctl-device-query" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">()</span>  <span class="c1"># Print platform information</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;GPU devices:&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the list of all GPU devices</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;Number of GPU devices&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_num_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the number of GPU devices</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has CPU devices?&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">has_cpu_devices</span><span class="p">())</span>  <span class="c1"># Check if there are CPU devices</span>
+</pre></div>
+</div>
+</div>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="programming_dpep.html"
+                          title="previous chapter">Programming with Data Parallel Extensions for Python</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="jupyter_notebook.html"
+                          title="next chapter">Tutorials</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/genindex.html b/pull/44/genindex.html
new file mode 100644
index 0000000..ef3fbeb
--- /dev/null
+++ b/pull/44/genindex.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Index &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="#" />
+    <link rel="search" title="Search" href="search.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+       
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+
+<h1 id="index">Index</h1>
+
+<div class="genindex-jumpbox">
+ 
+</div>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/heterogeneous_computing.html b/pull/44/heterogeneous_computing.html
new file mode 100644
index 0000000..17ee00c
--- /dev/null
+++ b/pull/44/heterogeneous_computing.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Heterogeneous Computing &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Programming with Data Parallel Extensions for Python" href="programming_dpep.html" />
+    <link rel="prev" title="Parallelism in Modern Data-Parallel Architectures" href="parallelism.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="programming_dpep.html" title="Programming with Data Parallel Extensions for Python">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="parallelism.html" title="Parallelism in Modern Data-Parallel Architectures">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Heterogeneous Computing</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="heterogeneous-computing"></span><section id="id1">
+<h1>Heterogeneous Computing<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<section id="device-offload">
+<h2>Device Offload<a class="headerlink" href="#device-offload" title="Permalink to this heading">¶</a></h2>
+<p>Python is an interpreted language, which implies that most of the Python script will run on CPU,
+and only a few data parallel regions will execute on data parallel devices.
+That is why the concept of the host and offload devices is helpful when it comes to conceptualizing
+a heterogeneous programming model in Python.</p>
+<a class="reference internal image-reference" href="_images/hetero-devices.png"><img alt="SIMD" class="align-center" src="_images/hetero-devices.png" style="width: 600px;" /></a>
+<p>The above diagram illustrates the <em>host</em> (the CPU which runs Python interpreter) and three <em>devices</em>
+(two GPU devices and one attached accelerator device). <strong>Data Parallel Extensions for Python</strong>
+offer a programming model where a script executed by Python interpreter on the host can <em>offload</em> data-parallel
+kernels to a user-specified device. A <em>kernel</em> is the <em>data-parallel region</em> of a program submitted
+for execution on the device. There can be multiple data-parallel regions, and hence multiple <em>offload kernels</em>.</p>
+<p>Kernels can be pre-compiled into a library, such as <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>, or directly coded
+in a programming language for heterogeneous computing, such as <a class="reference external" href="https://www.khronos.org/opencl/">OpenCl*</a> or <a class="reference external" href="https://www.apress.com/gp/book/9781484255735">DPC++</a> .
+<strong>Data Parallel Extensions for Python</strong> offer the way of writing kernels directly in Python
+using <a class="reference external" href="https://numba.pydata.org/">Numba*</a> compiler along with <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code>, the <a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a>.</p>
+<p>One or more kernels are submitted for execution into a <em>queue</em> targeting an <em>offload device</em>.
+For each device, you can create one or more queues. In most cases, you do not need to work
+with device queues directly. Data Parallel Extensions for Python will do necessary underlying
+work with queues for you through the <a class="reference internal" href="#compute-follows-data"><span class="std std-ref">Compute-Follows-Data</span></a>.</p>
+</section>
+<section id="unified-shared-memory">
+<h2>Unified Shared Memory<a class="headerlink" href="#unified-shared-memory" title="Permalink to this heading">¶</a></h2>
+<p>Each device has its memory, not necessarily accessible from another device.</p>
+<a class="reference internal image-reference" href="_images/hetero-devices.png"><img alt="SIMD" class="align-center" src="_images/hetero-devices.png" style="width: 600px;" /></a>
+<p>For example, <strong>Device 1</strong> memory may not be directly accessible from the host but accessible
+via expensive copying by a driver software. Similarly, depending on the architecture, direct data
+exchange between <strong>Device 2</strong> and <strong>Device 1</strong> may be only impossible possible via expensive
+copying through the host memory. These aspects must be taken into consideration when programming
+data parallel devices.</p>
+<p>On the illustration above the <strong>Device 2</strong> logically consists of two sub-devices: <strong>Sub-Device 1</strong>
+and <strong>Sub-Device 2</strong>. The programming model allows accessing <strong>Device 2</strong> as a single logical device, or
+by working with each individual sub-devices. For the former case a programmer needs to create
+a queue for <strong>Device 2</strong>. For the latter case a programmer needs to create 2 queues, one for each sub-device.</p>
+<p><a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> standard introduces a concept of the <em>Unified Shared Memory</em> (USM). USM requires hardware support
+for unified virtual address space, which allows coherency between the host and the device
+pointers. The host allocates all memory, but offers three distinct allocation types:</p>
+<ul class="simple">
+<li><p><strong>Host: located on the host, accessible by the host or device.</strong> This type of memory is useful in a situation
+when you need to stream read-only data from the host to the device once.</p></li>
+<li><p><strong>Device: located on the device, accessible by device only.</strong> The fastest type of memory.
+Useful in a situation when most of the data crunching happens on the device.</p></li>
+<li><p><strong>Shared: location is both host and device, accessible by the host and device</strong>.
+Shared allocations are useful when both host and device access data,
+since a user does not need to manage data migration explicitly.
+However, it is much slower than the USM Device memory type.</p></li>
+</ul>
+</section>
+<section id="compute-follows-data">
+<h2>Compute-Follows-Data<a class="headerlink" href="#compute-follows-data" title="Permalink to this heading">¶</a></h2>
+<p>Since data copying between devices is typically very expensive, for performance reasons it is essential
+to process data close to where it is allocated. This is the premise of the <em>Compute-Follows-Data</em> programming model,
+which states that the compute happens where the data resides. Tensors implemented in <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> and <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>
+carry information about allocation queues, and hence, about the device on which an array is allocated.
+Based on tensor input arguments of the offload kernel, it deduces the queue on which the execution happens.</p>
+<a class="reference internal image-reference" href="_images/kernel-queue-device.png"><img alt="SIMD" class="align-center" src="_images/kernel-queue-device.png" style="width: 600px;" /></a>
+<p>The picture above illustrates the <em>Compute-Follows-Data</em> concept. Arrays <code class="docutils literal notranslate"><span class="pre">A</span></code> and <code class="docutils literal notranslate"><span class="pre">B</span></code> are inputs to the
+<strong>Offload Kernel</strong>. These arrays carry information about their <em>allocation queue</em> (<strong>Device Queue</strong>) and the
+<em>device</em> (<strong>Device 1</strong>) where they were created. According to the Compute-Follows-Data paradigm
+the <strong>Offload Kernel</strong> will be submitted to this <strong>Device Queue</strong>, and the resulting array <code class="docutils literal notranslate"><span class="pre">C</span></code> will
+be created on the <strong>Device Queue</strong> associated with the <strong>Device 1</strong>.</p>
+<p><strong>Data Parallel Extensions for Python</strong> require all input tensor arguments to have the <strong>same</strong> allocation queue.
+Otherwise, an exception is thrown. For example, the following usages will result in an exception.</p>
+<figure class="align-center" id="id2">
+<a class="reference internal image-reference" href="_images/queue-exception1.png"><img alt="SIMD" src="_images/queue-exception1.png" style="width: 600px;" /></a>
+<figcaption>
+<p><span class="caption-text">Input tensors are on different devices and different queues. Exception is thrown.</span><a class="headerlink" href="#id2" title="Permalink to this image">¶</a></p>
+</figcaption>
+</figure>
+<figure class="align-center" id="id3">
+<a class="reference internal image-reference" href="_images/queue-exception2.png"><img alt="SIMD" src="_images/queue-exception2.png" style="width: 600px;" /></a>
+<figcaption>
+<p><span class="caption-text">Input tensors are on the same device, but queues are different. Exception is thrown.</span><a class="headerlink" href="#id3" title="Permalink to this image">¶</a></p>
+</figcaption>
+</figure>
+<figure class="align-center" id="id4">
+<a class="reference internal image-reference" href="_images/queue-exception3.png"><img alt="SIMD" src="_images/queue-exception3.png" style="width: 600px;" /></a>
+<figcaption>
+<p><span class="caption-text">Data belongs to the same device, but queues are different and associated with different sub-devices.</span><a class="headerlink" href="#id4" title="Permalink to this image">¶</a></p>
+</figcaption>
+</figure>
+</section>
+<section id="copying-data-between-devices-and-queues">
+<h2>Copying Data Between Devices and Queues<a class="headerlink" href="#copying-data-between-devices-and-queues" title="Permalink to this heading">¶</a></h2>
+<p><strong>Data Parallel Extensions for Python</strong> create <strong>one</strong> <em>canonical queue</em> per device. Normally,
+you do not need to directly manage queues. Having one canonical queue per device
+allows you to copy data between devices using the <code class="docutils literal notranslate"><span class="pre">to_device()</span></code> method:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a_new</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">to_device</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Array <code class="docutils literal notranslate"><span class="pre">a</span></code> is copied to the device associated with array <code class="docutils literal notranslate"><span class="pre">b</span></code> into the new array <code class="docutils literal notranslate"><span class="pre">a_new</span></code>.
+The same queue is associated with <code class="docutils literal notranslate"><span class="pre">b</span></code> and <code class="docutils literal notranslate"><span class="pre">a_new</span></code>.</p>
+<p>Alternatively, you can do this as follows:</p>
+<div class="literal-block-wrapper docutils container" id="id5">
+<div class="code-block-caption"><span class="caption-text">DPNP array</span><a class="headerlink" href="#id5" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a_new</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="id6">
+<div class="code-block-caption"><span class="caption-text">DPCtl array</span><a class="headerlink" href="#id6" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a_new</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">tensor</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+</section>
+<section id="creating-additional-queues">
+<h2>Creating Additional Queues<a class="headerlink" href="#creating-additional-queues" title="Permalink to this heading">¶</a></h2>
+<p>As said before, <strong>Data Parallel Extensions for Python</strong> automatically creates one canonical queue per device,
+and you normally work with this queue implicitly. However, you can always create as many additional queues per device
+as needed and work explicitly with them, for example, for profiling purposes.</p>
+<p>Read <a class="reference external" href="https://intelpython.github.io/dpctl/latest/index.html">Data Parallel Control</a> documentation for more details about queues.</p>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="parallelism.html"
+                          title="previous chapter">Parallelism in Modern Data-Parallel Architectures</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="programming_dpep.html"
+                          title="next chapter">Programming with Data Parallel Extensions for Python</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/index.html b/pull/44/index.html
new file mode 100644
index 0000000..12b9b42
--- /dev/null
+++ b/pull/44/index.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Data Parallel Extensions for Python &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Prerequisites and Installation" href="prerequisites_and_installation.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="#"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="prerequisites_and_installation.html" title="Prerequisites and Installation">
+	  next &raquo;
+	</a>
+      </li>
+      <li>
+	<a href="#">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+       
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="index"></span><a class="reference internal image-reference" href="_images/DPEP-large.png"><img alt="Data Parallel Extensions for Python" class="align-center" src="_images/DPEP-large.png" style="width: 400px;" /></a>
+<section id="data-parallel-extensions-for-python">
+<h1>Data Parallel Extensions for Python<a class="headerlink" href="#data-parallel-extensions-for-python" title="Permalink to this heading">¶</a></h1>
+<p>Data Parallel Extensions for Python* extend numerical Python capabilities beyond CPU and allow even higher performance
+gains on data parallel devices, such as GPUs. It consists of three foundational packages:</p>
+<ul class="simple">
+<li><p><strong>dpnp</strong> - Data Parallel Extensions for <a class="reference external" href="https://numpy.org/">Numpy*</a> - a library that implements a subset of
+Numpy that can be executed on any data parallel device. The subset is a drop-in replacement
+of core Numpy functions and numerical data types.</p></li>
+<li><p><strong>numba_dpex</strong> - Data Parallel Extensions for <a class="reference external" href="https://numba.pydata.org/">Numba*</a> - an extension for Numba compiler
+that lets you program data-parallel devices as you program CPU with Numba.</p></li>
+<li><p><strong>dpctl - Data Parallel Control library</strong> that provides utilities for device selection,
+allocation of data on devices, tensor data structure along with <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> implementation, and support for creation of user-defined data-parallel extensions.</p></li>
+</ul>
+<section id="table-of-contents">
+<h2>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this heading">¶</a></h2>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="prerequisites_and_installation.html#device-drivers">1. Device Drivers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="prerequisites_and_installation.html#python-interpreter">2. Python Interpreter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="prerequisites_and_installation.html#data-parallel-extensions-for-python">3. Data Parallel Extensions for Python</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#device-offload">Device Offload</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#unified-shared-memory">Unified Shared Memory</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#compute-follows-data">Compute-Follows-Data</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#copying-data-between-devices-and-queues">Copying Data Between Devices and Queues</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#creating-additional-queues">Creating Additional Queues</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#scalars-vs-0-dimensional-arrays">Scalars vs. 0-Dimensional Arrays</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#data-parallel-extension-for-numpy-dpnp">Data Parallel Extension for Numpy - dpnp</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#data-parallel-extension-for-numba-numba-dpex">Data Parallel Extension for Numba - numba-dpex</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#data-parallel-control-dpctl">Data Parallel Control - dpctl</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#debugging-and-profiling-data-parallel-extensions-for-python">Debugging and Profiling Data Parallel Extensions for Python</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#writing-robust-numerical-codes-for-heterogeneous-computing">Writing Robust Numerical Codes for Heterogeneous Computing</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/01-get_started.html">Getting Started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+</div>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="prerequisites_and_installation.html"
+                          title="next chapter">Prerequisites and Installation</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/jupyter_notebook.html b/pull/44/jupyter_notebook.html
new file mode 100644
index 0000000..2a530f6
--- /dev/null
+++ b/pull/44/jupyter_notebook.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Tutorials &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python" href="notebooks/01-get_started.html" />
+    <link rel="prev" title="Examples" href="examples.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="notebooks/01-get_started.html" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="examples.html" title="Examples">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Tutorials</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="jupyter-notebook"></span><section id="tutorials">
+<h1>Tutorials<a class="headerlink" href="#tutorials" title="Permalink to this heading">¶</a></h1>
+<p>Getting started Jupyter* Notebooks illustrating the usage of <strong>Data Parallel Extensions for Python</strong> are located
+in the <a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/notebooks">GitHub repository</a></p>
+<p>To run the tutorial, in the command line prompt type:</p>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">jupyter notebook</span>
+</pre></div>
+</div>
+<p>This will print some information about the notebook server in your terminal, including the URL of
+the web application (by default, <code class="docutils literal notranslate"><span class="pre">http://localhost:8888</span></code>):</p>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>jupyter<span class="w"> </span>notebook
+<span class="go">[I 08:58:24.417 NotebookApp] Serving notebooks from local directory: /Users/catherine</span>
+<span class="go">[I 08:58:24.417 NotebookApp] 0 active kernels</span>
+<span class="go">[I 08:58:24.417 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/</span>
+<span class="go">[I 08:58:24.417 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).</span>
+<span class="go">It will then open your default web browser to this URL.</span>
+</pre></div>
+</div>
+<p>When the notebook opens in your browser, you will see the Notebook Dashboard,
+which will show a list of the notebooks, files, and subdirectories
+in the directory where the notebook server was started.
+Navigate to the notebook of your interest and open it in the dashboard.</p>
+<p>For more information please refer to <a class="reference external" href="https://docs.jupyter.org/en/latest/running.html">Jupyter documentation</a></p>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="notebooks/01-get_started.html">Getting Started</a></li>
+<li class="toctree-l1"><a class="reference internal" href="notebooks/02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+</ul>
+</div>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Tutorials</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/01-get_started.html">Getting Started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="examples.html"
+                          title="previous chapter">Examples</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="notebooks/01-get_started.html"
+                          title="next chapter">Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/notebooks/01-get_started.html b/pull/44/notebooks/01-get_started.html
new file mode 100644
index 0000000..bc83b8a
--- /dev/null
+++ b/pull/44/notebooks/01-get_started.html
@@ -0,0 +1,472 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/sdc.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
+    
+    <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
+    <script src="../_static/doctools.js"></script>
+    <script src="../_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="../_static/sidebar.js"></script>
+    <script type="text/javascript" src="../_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" />
+    <link rel="next" title="Jupyter Notebook 2: Falling back to NumPy" href="02-dpnp_numpy_fallback.html" />
+    <link rel="prev" title="Tutorials" href="../jupyter_notebook.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="../other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="../index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="../examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="02-dpnp_numpy_fallback.html" title="Jupyter Notebook 2: Falling back to NumPy">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="../jupyter_notebook.html" title="Tutorials">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="../index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      <li><a href="../jupyter_notebook.html" accesskey="U">Tutorials</a> &#187;</li>
+      
+      <li>Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <section id="Jupyter-Notebook-1:-Getting-started-with-Data-Parallel-Extensions-for-Python">
+<h1>Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python<a class="headerlink" href="#Jupyter-Notebook-1:-Getting-started-with-Data-Parallel-Extensions-for-Python" title="Permalink to this heading">¶</a></h1>
+<p><img alt="f4d5e04acdcd424684a66eacaf97887a" class="no-scaled-link" src="https://intelpython.github.io/DPEP/main/_images/DPEP-large.png" style="width: 300px;" /></p>
+<p><a class="reference external" href="https://intelpython.github.io/DPEP/main/">Data Parallel Extensions for Python</a> allow you to run NumPy-like code beyond CPU using <strong>Data Parallel Extension for NumPy</strong>. It will also allow you to compile the code using <strong>Data Parallel Extension for Numba</strong>.</p>
+<section id="Modifying-CPU-script-to-run-on-GPU">
+<h2>Modifying CPU script to run on GPU<a class="headerlink" href="#Modifying-CPU-script-to-run-on-GPU" title="Permalink to this heading">¶</a></h2>
+<p>In many cases the process of running Python on GPU is about making minor changes to your CPU script, which are: 1. Changing import statement(s) 2. Specifying on which device(s) the data is allocated 3. Explicitly copying data between devices and the host as needed</p>
+<p>We will illustrate these concepts on series of short examples. Let’s assume we have the following NumPy script originally written to run on CPU, which is nothing more than creating two matrices <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code> and performing matrix-matrix multiplication with <code class="docutils literal notranslate"><span class="pre">numpy.matmul()</span></code>, and prining the resulting matrix:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># CPU script for matrix-matrix multiplication using NumPy</span>
+
+<span class="c1"># 1. Import numpy</span>
+<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="c1"># 2. Create two matrices</span>
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+
+<span class="c1"># 3. Perform matrix-matrix multiplication</span>
+<span class="n">res</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">matmul</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
+
+<span class="c1"># 4. Print resulting matrix</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+[[2 2]
+ [2 2]]
+</pre></div></div>
+</div>
+<p>As stated before in many cases to run the same code on GPU is a trivial modification of a few lines of the code, like this:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Modified script to run the same code on GPU using dpnp</span>
+
+<span class="c1"># 1. Import dpnp</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>  <span class="c1"># Note, we changed the import statement. Since dpnp is a drop-in replacement of numpy the rest of the code will run lik regular numpy</span>
+
+<span class="c1"># 2. Create two matrices</span>
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+
+<span class="c1"># 3. Perform matrix-matrix multiplication</span>
+<span class="n">res</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">matmul</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
+
+<span class="c1"># 4. Print what&#39;s going on under the hood</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array y is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;res is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+[[2 2]
+ [2 2]]
+Array x is allocated on the device: Device(level_zero:gpu:0)
+Array y is allocated on the device: Device(level_zero:gpu:0)
+res is allocated on the device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+<p>Let’s see what we actually changed.</p>
+<ol class="arabic simple">
+<li><p>Obviously we changed the import statement. Now we import <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>, which is a drop-in replacement for a subset of <code class="docutils literal notranslate"><span class="pre">numpy</span></code> that extends numpy-like codes beyond CPU</p></li>
+<li><p>No change in matrix creation code. How does <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> know that matrices <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code> need to be allocated on GPU? This is because, if we do not specify the device explicitly, the driver will use the default device, which is GPU on systems with installed GPU drivers.</p></li>
+<li><p>No change in matrix multiplication code. This is because <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> programming model is the Compute-Follows-Data. It means that <code class="docutils literal notranslate"><span class="pre">dpnp.matmul()</span></code> determines which device will execute an operation based on where array inputs are allocated. Since our inputs <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code> are allocated on the default device (GPU) the matrix-matrix multiplication will follow data allocation and execute on GPU too.</p></li>
+<li><p>Note, arrays <code class="docutils literal notranslate"><span class="pre">x</span></code>, <code class="docutils literal notranslate"><span class="pre">y</span></code>, <code class="docutils literal notranslate"><span class="pre">res</span></code> all have the <code class="docutils literal notranslate"><span class="pre">device</span></code> attribute by printing which we make sure that all inputs are indeed on the GPU device, and the result is also on the GPU deivice. To be precise the data allocation (and execution) happened on GPU device 0 through Level-Zero driver.</p></li>
+</ol>
+</section>
+<section id="More-on-data-allocation-and-the-Compute-Follows-Data">
+<h2>More on data allocation and the Compute-Follows-Data<a class="headerlink" href="#More-on-data-allocation-and-the-Compute-Follows-Data" title="Permalink to this heading">¶</a></h2>
+<p>Sometimes you may want to be specific about the device type, not relying on the default behavior. You can do so by specifying the device in a keyword arguments for <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array creation functions and random number generators.</p>
+<div class="nbinput nblast docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="n">step</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<p><code class="docutils literal notranslate"><span class="pre">dpnp.arange()</span></code> is the array creation function that has optional keyword argument <code class="docutils literal notranslate"><span class="pre">device</span></code>, using which you can specify the device you want data to be allocated on with filter selector string. In our case the string specifies device type <code class="docutils literal notranslate"><span class="pre">&quot;gpu&quot;</span></code>. The proper way of handling situations when the specified device is not available would be as follows:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="n">step</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The a is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+    <span class="c1"># Do some fallback code</span>
+
+<span class="c1"># Do reduction on the selected device</span>
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Reduction sum y: &quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 75</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y.shape=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+The a is allocated on the device: Device(level_zero:gpu:0)
+Reduction sum y:  75
+Result y is located on the device: Device(level_zero:gpu:0)
+y.shape= ()
+</pre></div></div>
+</div>
+<p>Note that <code class="docutils literal notranslate"><span class="pre">y</span></code> is itself a device array (not a scalar!), its data resides on the same device as input array <code class="docutils literal notranslate"><span class="pre">a</span></code>.</p>
+<section id="Advanced-data-and-device-control-with-Data-Parallel-Control-library-dpctl">
+<h3>Advanced data and device control with Data Parallel Control library <code class="docutils literal notranslate"><span class="pre">dpctl</span></code><a class="headerlink" href="#Advanced-data-and-device-control-with-Data-Parallel-Control-library-dpctl" title="Permalink to this heading">¶</a></h3>
+<p>Data Parallel Control library, <code class="docutils literal notranslate"><span class="pre">dpctl</span></code>, among other things provide advanced capabilities for controling devices and data. Among its useful functions is <code class="docutils literal notranslate"><span class="pre">dpctl.lsplatform(verbosity)</span></code>, printing information about the list of available devices on the system with different levels of verbosity:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">()</span>  <span class="c1"># Print platform information</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Intel(R) OpenCL HD Graphics OpenCL 3.0
+Intel(R) Level-Zero 1.3
+</pre></div></div>
+</div>
+<p>Using a different verbosity setting to print extra meta-data:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>  <span class="c1"># Print platform information with verbocitz level 2 (highest level)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Platform  0 ::
+    Name        Intel(R) OpenCL HD Graphics
+    Version     OpenCL 3.0
+    Vendor      Intel(R) Corporation
+    Backend     opencl
+    Num Devices 1
+      # 0
+        Name                Intel(R) UHD Graphics 620
+        Version             31.0.101.2111
+        Filter string       opencl:gpu:0
+Platform  1 ::
+    Name        Intel(R) Level-Zero
+    Version     1.3
+    Vendor      Intel(R) Corporation
+    Backend     ext_oneapi_level_zero
+    Num Devices 1
+      # 0
+        Name                Intel(R) UHD Graphics 620
+        Version             1.3.0
+        Filter string       level_zero:gpu:0
+</pre></div></div>
+</div>
+<p>You can also query whether system has GPU devices and retrieve respective device objects:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="k">if</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">has_gpu_devices</span><span class="p">():</span>
+    <span class="n">devices</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s1">&#39;gpu&#39;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;This system has </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">devices</span><span class="p">)</span><span class="si">}</span><span class="s2"> GPUs&quot;</span><span class="p">)</span>
+    <span class="k">for</span> <span class="n">device</span> <span class="ow">in</span> <span class="n">devices</span><span class="p">:</span>
+        <span class="n">device</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span>
+
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="n">devices</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>  <span class="c1"># Another way of selecting on which device to allocate the data</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x is on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="k">else</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU devices are not available on this system&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+This system has 2 GPUs
+    Name            Intel(R) UHD Graphics 620
+    Driver version  31.0.101.2111
+    Vendor          Intel(R) Corporation
+    Filter string   opencl:gpu:0
+
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+Array x is on the device: Device(opencl:gpu:0)
+</pre></div></div>
+</div>
+<p>The following snapshot illustrates how to select the default GPU device using <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> and generate an array of random numbers on this device:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
+    <span class="n">gpu</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">select_gpu_device</span><span class="p">()</span>
+    <span class="n">gpu</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span> <span class="c1"># print GPU device information</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">gpu</span><span class="p">)</span>  <span class="c1"># Create array of random numbers on the default GPU device</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x.device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;No GPU devices available&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+Array x: [0.87253657 0.87415047 0.61092713 0.1395424  0.95248436]
+Array x.device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+<p>Or by creating GPU device object from the filter selector string:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[9]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">l0_gpu_0</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">SyclDevice</span><span class="p">(</span><span class="s2">&quot;level_zero:gpu:0&quot;</span><span class="p">)</span>
+    <span class="n">l0_gpu_0</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Cannot create the device object from a given filter selector string&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+</pre></div></div>
+</div>
+<p>The following snapshot checks whether a given device supports certain aspects, which may be important for the application, such as support for float64 (double precision) or the amount of available global memory on the device, etc.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">gpu</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">select_gpu_device</span><span class="p">()</span>
+    <span class="n">gpu</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has double precision:&quot;</span><span class="p">,</span> <span class="n">gpu</span><span class="o">.</span><span class="n">has_aspect_fp64</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has atomic operations support:&quot;</span><span class="p">,</span> <span class="n">gpu</span><span class="o">.</span><span class="n">has_aspect_atomic64</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Global memory size: </span><span class="si">{</span><span class="n">gpu</span><span class="o">.</span><span class="n">global_mem_size</span><span class="o">/</span><span class="mi">1024</span><span class="o">/</span><span class="mi">1024</span><span class="si">}</span><span class="s2"> MB&quot;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Global memory cache size: </span><span class="si">{</span><span class="n">gpu</span><span class="o">.</span><span class="n">global_mem_cache_size</span><span class="o">/</span><span class="mi">1024</span><span class="si">}</span><span class="s2"> KB&quot;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Maximum compute units: </span><span class="si">{</span><span class="n">gpu</span><span class="o">.</span><span class="n">max_compute_units</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The GPU device is not available&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+Has double precision: True
+Has atomic operations support: True
+Global memory size: 6284.109375 MB
+Global memory cache size: 512.0 KB
+Maximum compute units: 24
+</pre></div></div>
+</div>
+<p>For more information about <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> device selection please refer to <a class="reference external" href="https://intelpython.github.io/dpctl/latest/docfiles/user_guides/manual/dpctl/device_selection.html">Data Parallel Control: Device Selection</a></p>
+<p>For more information about <code class="docutils literal notranslate"><span class="pre">dpctl.SyclDevice</span></code> class methods and attributes please refer to <a class="reference external" href="https://intelpython.github.io/dpctl/latest/docfiles/dpctl/SyclDevice.html">Data Parallel Control: dpctl.SyclDevice</a></p>
+</section>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../examples.html">Examples</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../jupyter_notebook.html">Tutorials</a><ul class="current">
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Getting Started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="../jupyter_notebook.html"
+                          title="previous chapter">Tutorials</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="02-dpnp_numpy_fallback.html"
+                          title="next chapter">Jupyter Notebook 2: Falling back to NumPy</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/notebooks/01-get_started.ipynb b/pull/44/notebooks/01-get_started.ipynb
new file mode 100644
index 0000000..e0a970a
--- /dev/null
+++ b/pull/44/notebooks/01-get_started.ipynb
@@ -0,0 +1,490 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "a002ea61",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "# Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python\n",
+    "<img src=\"https://intelpython.github.io/DPEP/main/_images/DPEP-large.png\" width=\"300\"/>\n",
+    "\n",
+    "[Data Parallel Extensions for Python](https://intelpython.github.io/DPEP/main/) allow you to run NumPy-like code beyond CPU using **Data Parallel Extension for NumPy**. It will also allow you to compile the code using **Data Parallel Extension for Numba**. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0565bf88-a3e9-4ee3-a815-3efe977c2a8f",
+   "metadata": {
+    "jp-MarkdownHeadingCollapsed": true,
+    "tags": []
+   },
+   "source": [
+    "## Modifying CPU script to run on GPU\n",
+    "\n",
+    "In many cases the process of running Python on GPU is about making minor changes to your CPU script, which are:\n",
+    "1. Changing import statement(s)\n",
+    "2. Specifying on which device(s) the data is allocated\n",
+    "3. Explicitly copying data between devices and the host as needed\n",
+    "\n",
+    "We will illustrate these concepts on series of short examples. Let's assume we have the following NumPy script originally written to run on CPU, which is nothing more than creating two matrices `x` and `y` and performing matrix-matrix multiplication with `numpy.matmul()`, and prining the resulting matrix:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "d9e8711d",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[2 2]\n",
+      " [2 2]]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# CPU script for matrix-matrix multiplication using NumPy\n",
+    "\n",
+    "# 1. Import numpy\n",
+    "import numpy as np\n",
+    "\n",
+    "# 2. Create two matrices\n",
+    "x = np.array([[1, 1], [1, 1]])\n",
+    "y = np.array([[1, 1], [1, 1]])\n",
+    "\n",
+    "# 3. Perform matrix-matrix multiplication\n",
+    "res = np.matmul(x, y)\n",
+    "\n",
+    "# 4. Print resulting matrix\n",
+    "print(res)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "402c3d61",
+   "metadata": {},
+   "source": [
+    "As stated before in many cases to run the same code on GPU is a trivial modification of a few lines of the code, like this:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "c10b7d83",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[2 2]\n",
+      " [2 2]]\n",
+      "Array x is allocated on the device: Device(level_zero:gpu:0)\n",
+      "Array y is allocated on the device: Device(level_zero:gpu:0)\n",
+      "res is allocated on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Modified script to run the same code on GPU using dpnp\n",
+    "\n",
+    "# 1. Import dpnp\n",
+    "import dpnp as np  # Note, we changed the import statement. Since dpnp is a drop-in replacement of numpy the rest of the code will run lik regular numpy\n",
+    "\n",
+    "# 2. Create two matrices\n",
+    "x = np.array([[1, 1], [1, 1]])\n",
+    "y = np.array([[1, 1], [1, 1]])\n",
+    "\n",
+    "# 3. Perform matrix-matrix multiplication\n",
+    "res = np.matmul(x, y)\n",
+    "\n",
+    "# 4. Print what's going on under the hood\n",
+    "print(res)\n",
+    "print(\"Array x is allocated on the device:\", x.device)\n",
+    "print(\"Array y is allocated on the device:\", y.device)\n",
+    "print(\"res is allocated on the device:\", res.device)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d6a58f17",
+   "metadata": {},
+   "source": [
+    "Let's see what we actually changed.\n",
+    "\n",
+    "1. Obviously we changed the import statement. Now we import `dpnp`, which is a drop-in replacement for a subset of `numpy` that extends numpy-like codes beyond CPU\n",
+    "2. No change in matrix creation code. How does `dpnp` know that matrices `x` and `y` need to be allocated on GPU? This is because, if we do not specify the device explicitly, the driver will use the default device, which is GPU on systems with installed GPU drivers.\n",
+    "3. No change in matrix multiplication code. This is because `dpnp` programming model is the Compute-Follows-Data. It means that `dpnp.matmul()` determines which device will execute an operation based on where array inputs are allocated. Since our inputs `x` and `y` are allocated on the default device (GPU) the matrix-matrix multiplication will follow data allocation and execute on GPU too.\n",
+    "4. Note, arrays `x`, `y`, `res` all have the `device` attribute by printing which we make sure that all inputs are indeed on the GPU device, and the result is also on the GPU deivice. To be precise the data allocation (and execution) happened on GPU device 0 through Level-Zero driver."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "be340585",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "## More on data allocation and the Compute-Follows-Data\n",
+    "\n",
+    "Sometimes you may want to be specific about the device type, not relying on the default behavior. You can do so by specifying the device in a keyword arguments for `dpnp` array creation functions and random number generators."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "0435d7f0",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import dpnp as np\n",
+    "\n",
+    "a = np.arange(3, 30, step = 6, device=\"gpu\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a6765095",
+   "metadata": {},
+   "source": [
+    "`dpnp.arange()` is the array creation function that has optional keyword argument `device`, using which you can specify the device you want data to be allocated on with filter selector string. In our case the string specifies device type `\"gpu\"`. The proper way of handling situations when the specified device is not available would be as follows:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "e613398f",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "The a is allocated on the device: Device(level_zero:gpu:0)\n",
+      "Reduction sum y:  75\n",
+      "Result y is located on the device: Device(level_zero:gpu:0)\n",
+      "y.shape= ()\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpnp as np\n",
+    "\n",
+    "try:\n",
+    "    a = np.arange(3, 30, step = 6, device=\"gpu\")\n",
+    "    print(\"The a is allocated on the device:\", a.device)\n",
+    "except:\n",
+    "    print(\"GPU device is not available\")\n",
+    "    # Do some fallback code\n",
+    "\n",
+    "# Do reduction on the selected device\n",
+    "y = np.sum(a)\n",
+    "\n",
+    "print(\"Reduction sum y: \", y)  # Expect 75\n",
+    "print(\"Result y is located on the device:\", y.device)\n",
+    "print(\"y.shape=\", y.shape)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "88b4915e",
+   "metadata": {},
+   "source": [
+    "Note that `y` is itself a device array (not a scalar!), its data resides on the same device as input array `a`."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "94cb3b9b",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "### Advanced data and device control with Data Parallel Control library `dpctl`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9fb4b1b5",
+   "metadata": {},
+   "source": [
+    "Data Parallel Control library, `dpctl`, among other things provide advanced capabilities for controling devices and data. Among its useful functions is `dpctl.lsplatform(verbosity)`, printing information about the list of available devices on the system with different levels of verbosity:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "b890ae71",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Intel(R) OpenCL HD Graphics OpenCL 3.0 \n",
+      "Intel(R) Level-Zero 1.3\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "dpctl.lsplatform()  # Print platform information"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "db5e8db4",
+   "metadata": {},
+   "source": [
+    "Using a different verbosity setting to print extra meta-data:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "ffcf0cfb",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Platform  0 ::\n",
+      "    Name        Intel(R) OpenCL HD Graphics\n",
+      "    Version     OpenCL 3.0 \n",
+      "    Vendor      Intel(R) Corporation\n",
+      "    Backend     opencl\n",
+      "    Num Devices 1\n",
+      "      # 0\n",
+      "        Name                Intel(R) UHD Graphics 620\n",
+      "        Version             31.0.101.2111\n",
+      "        Filter string       opencl:gpu:0\n",
+      "Platform  1 ::\n",
+      "    Name        Intel(R) Level-Zero\n",
+      "    Version     1.3\n",
+      "    Vendor      Intel(R) Corporation\n",
+      "    Backend     ext_oneapi_level_zero\n",
+      "    Num Devices 1\n",
+      "      # 0\n",
+      "        Name                Intel(R) UHD Graphics 620\n",
+      "        Version             1.3.0\n",
+      "        Filter string       level_zero:gpu:0\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "dpctl.lsplatform(2)  # Print platform information with verbocitz level 2 (highest level)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f63525d3",
+   "metadata": {},
+   "source": [
+    "You can also query whether system has GPU devices and retrieve respective device objects:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "84ff47e9",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "This system has 2 GPUs\n",
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  31.0.101.2111\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   opencl:gpu:0\n",
+      "\n",
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Array x is on the device: Device(opencl:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "import dpnp as np\n",
+    "\n",
+    "if dpctl.has_gpu_devices():\n",
+    "    devices = dpctl.get_devices(device_type='gpu')\n",
+    "    print(f\"This system has {len(devices)} GPUs\")\n",
+    "    for device in devices:\n",
+    "        device.print_device_info()\n",
+    "        \n",
+    "    x = np.array([1, 2, 3], device=devices[0])  # Another way of selecting on which device to allocate the data\n",
+    "    print(\"Array x is on the device:\", x.device)\n",
+    "else:\n",
+    "    print(\"GPU devices are not available on this system\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e0918733-0992-41e8-bfa5-228a080bc165",
+   "metadata": {},
+   "source": [
+    "The following snapshot illustrates how to select the default GPU device using `dpctl` and generate an array of random numbers on this device:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "1c068447",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Array x: [0.87253657 0.87415047 0.61092713 0.1395424  0.95248436]\n",
+      "Array x.device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "try:\n",
+    "    gpu = dpctl.select_gpu_device()\n",
+    "    gpu.print_device_info() # print GPU device information\n",
+    "    x = np.random.random(5, device=gpu)  # Create array of random numbers on the default GPU device\n",
+    "    print(\"Array x:\", x)\n",
+    "    print(\"Array x.device:\", x.device)\n",
+    "except:\n",
+    "    print (\"No GPU devices available\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c378b79d",
+   "metadata": {},
+   "source": [
+    "Or by creating GPU device object from the filter selector string:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "ad83abb5",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "try:\n",
+    "    l0_gpu_0 = dpctl.SyclDevice(\"level_zero:gpu:0\")\n",
+    "    l0_gpu_0.print_device_info()\n",
+    "except:\n",
+    "    print(\"Cannot create the device object from a given filter selector string\")    "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "eadefe0b",
+   "metadata": {},
+   "source": [
+    "The following snapshot checks whether a given device supports certain aspects, which may be important for the application, such as support for float64 (double precision) or the amount of available global memory on the device, etc."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "a94756d7",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Has double precision: True\n",
+      "Has atomic operations support: True\n",
+      "Global memory size: 6284.109375 MB\n",
+      "Global memory cache size: 512.0 KB\n",
+      "Maximum compute units: 24\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "try:\n",
+    "    gpu = dpctl.select_gpu_device()\n",
+    "    gpu.print_device_info()\n",
+    "    print(\"Has double precision:\", gpu.has_aspect_fp64)\n",
+    "    print(\"Has atomic operations support:\", gpu.has_aspect_atomic64)\n",
+    "    print(f\"Global memory size: {gpu.global_mem_size/1024/1024} MB\")\n",
+    "    print(f\"Global memory cache size: {gpu.global_mem_cache_size/1024} KB\")\n",
+    "    print(f\"Maximum compute units: {gpu.max_compute_units}\")\n",
+    "except:\n",
+    "    print(\"The GPU device is not available\")   "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "97b53113-8264-4f7e-9a9d-a997e70ed3bc",
+   "metadata": {},
+   "source": [
+    "For more information about `dpctl` device selection please refer to [Data Parallel Control: Device Selection](https://intelpython.github.io/dpctl/latest/docfiles/user_guides/manual/dpctl/device_selection.html)\n",
+    "\n",
+    "For more information about `dpctl.SyclDevice` class methods and attributes please refer to [Data Parallel Control: dpctl.SyclDevice](https://intelpython.github.io/dpctl/latest/docfiles/dpctl/SyclDevice.html)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pull/44/notebooks/02-dpnp_numpy_fallback.html b/pull/44/notebooks/02-dpnp_numpy_fallback.html
new file mode 100644
index 0000000..5aae612
--- /dev/null
+++ b/pull/44/notebooks/02-dpnp_numpy_fallback.html
@@ -0,0 +1,286 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Jupyter Notebook 2: Falling back to NumPy &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/sdc.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
+    
+    <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
+    <script src="../_static/doctools.js"></script>
+    <script src="../_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="../_static/sidebar.js"></script>
+    <script type="text/javascript" src="../_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" />
+    <link rel="next" title="Benchmarks" href="../benchmarks.html" />
+    <link rel="prev" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python" href="01-get_started.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="../other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="../index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="../examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="../benchmarks.html" title="Benchmarks">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="01-get_started.html" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="../index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      <li><a href="../jupyter_notebook.html" accesskey="U">Tutorials</a> &#187;</li>
+      
+      <li>Jupyter Notebook 2: Falling back to NumPy</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <section id="Jupyter-Notebook-2:-Falling-back-to-NumPy">
+<h1>Jupyter Notebook 2: Falling back to NumPy<a class="headerlink" href="#Jupyter-Notebook-2:-Falling-back-to-NumPy" title="Permalink to this heading">¶</a></h1>
+<p><strong>Data Parallel Extensions for Python</strong> are still in active development and have not yet reached production quality. This in particular means that some functional and performance gaps may exist in certain <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> functions that require workarounds. The functional gaps include:</p>
+<ul class="simple">
+<li><p>Certain NumPy APIs are not supported. For complete reference please see the <a class="reference external" href="https://intelpython.github.io/dpnp/reference/comparison.html">comparison table</a> for <strong>Data Parallel Extension for NumPy</strong>.</p></li>
+<li><p>Limited support of <code class="docutils literal notranslate"><span class="pre">dtypes</span></code>. At present the <strong>Data Parallel Extension for NumPy</strong> supports <code class="docutils literal notranslate"><span class="pre">float32</span></code>, <code class="docutils literal notranslate"><span class="pre">float64</span></code>, <code class="docutils literal notranslate"><span class="pre">int32</span></code>, and <code class="docutils literal notranslate"><span class="pre">int64</span></code> types.</p></li>
+<li><p>Certain keyword arguments are supported for default settings only. Please refer to the <a class="reference external" href="https://intelpython.github.io/dpnp/reference/index.html">Data Parallel Extension for NumPy API Reference</a> for details.</p></li>
+</ul>
+<p>Since NumPy API is versatily there are typically some workaround options exist. Please refer to <a class="reference external" href="https://intelpython.github.io/dpnp/reference/index.html">Data Parallel Extension for NumPy API Reference</a> and <a class="reference external" href="https://numpy.org/doc/stable/">NumPy documentation</a> for hints for possible alternatives.</p>
+<p>Another possible workaround is to fall back to the host and execute the script via NumPy. This is a discouraged use because it typically results in significant performance penalties associated with copying data from the device to the host and back. However, for debugging purposes you may still want to enable this behavior.</p>
+<p>To do so you must set the <code class="docutils literal notranslate"><span class="pre">DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK</span></code> environment variable to <code class="docutils literal notranslate"><span class="pre">0</span></code>.</p>
+<p>Let’s take the following example:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span>
+<span class="kn">import</span> <span class="nn">numpy</span>
+
+<span class="n">N</span> <span class="o">=</span> <span class="mi">200</span><span class="o">*</span><span class="mi">100</span>
+
+<span class="c1"># Create an two dimencial array with singular element and array like option</span>
+<span class="n">a_np</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">like</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)))</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a_np</span><span class="p">)</span>
+<span class="n">a_dp</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">like</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)))</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a_dp</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+[[3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ ...
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]]
+</pre></div></div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+<span class="ansi-red-intense-fg ansi-bold">---------------------------------------------------------------------------</span>
+<span class="ansi-red-intense-fg ansi-bold">NotImplementedError</span>                       Traceback (most recent call last)
+Cell <span class="ansi-green-intense-fg ansi-bold">In[3], line 9</span>
+<span class="ansi-green-fg">      7</span> a_np <span style="color: rgb(98,98,98)">=</span> numpy<span style="color: rgb(98,98,98)">.</span>full((N, N), <span style="color: rgb(98,98,98)">3.</span>, like <span style="color: rgb(98,98,98)">=</span> numpy<span style="color: rgb(98,98,98)">.</span>zeros((N, <span style="color: rgb(98,98,98)">0</span>)))
+<span class="ansi-green-fg">      8</span> <span style="color: rgb(0,135,0)">print</span>(a_np)
+<span class="ansi-green-intense-fg ansi-bold">----&gt; 9</span> a_dp <span style="color: rgb(98,98,98)">=</span> <span class="ansi-yellow-bg">dpnp</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">full</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">N</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">N</span><span class="ansi-yellow-bg">)</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">3.</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">like</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">=</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">dpnp</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">zeros</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">N</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">0</span><span class="ansi-yellow-bg">)</span><span class="ansi-yellow-bg">)</span><span class="ansi-yellow-bg">)</span>
+<span class="ansi-green-fg">     10</span> <span style="color: rgb(0,135,0)">print</span>(a_dp)
+
+File <span class="ansi-green-intense-fg ansi-bold">~\AppData\Local\Continuum\miniconda3\envs\ndpex-examples\lib\site-packages\dpnp\dpnp_iface_arraycreation.py:747</span>, in <span class="ansi-cyan-fg">full</span><span class="ansi-blue-intense-fg ansi-bold">(shape, fill_value, dtype, order, like, device, usm_type, sycl_queue)</span>
+<span class="ansi-green-fg">    738</span> <span class="ansi-bold" style="color: rgb(0,135,0)">else</span>:
+<span class="ansi-green-fg">    739</span>     <span class="ansi-bold" style="color: rgb(0,135,0)">return</span> dpnp_container<span style="color: rgb(98,98,98)">.</span>full(shape,
+<span class="ansi-green-fg">    740</span>                                fill_value,
+<span class="ansi-green-fg">    741</span>                                dtype<span style="color: rgb(98,98,98)">=</span>dtype,
+<span class="ansi-green-intense-fg ansi-bold">   (...)</span>
+<span class="ansi-green-fg">    744</span>                                usm_type<span style="color: rgb(98,98,98)">=</span>usm_type,
+<span class="ansi-green-fg">    745</span>                                sycl_queue<span style="color: rgb(98,98,98)">=</span>sycl_queue)
+<span class="ansi-green-intense-fg ansi-bold">--&gt; 747</span> <span class="ansi-bold" style="color: rgb(0,135,0)">return</span> <span class="ansi-yellow-bg">call_origin</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">numpy</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">full</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">shape</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">fill_value</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">dtype</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">order</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">like</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">=</span><span class="ansi-yellow-bg">like</span><span class="ansi-yellow-bg">)</span>
+
+File <span class="ansi-green-intense-fg ansi-bold">dpnp\dpnp_utils\dpnp_algo_utils.pyx:132</span>, in <span class="ansi-cyan-fg">dpnp.dpnp_utils.dpnp_algo_utils.call_origin</span><span class="ansi-blue-intense-fg ansi-bold">()</span>
+
+<span class="ansi-red-intense-fg ansi-bold">NotImplementedError</span>: Requested funtion=full with args=((20000, 20000), 3.0, None, &#39;C&#39;) and kwargs={&#39;like&#39;: array([])} isn&#39;t currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception.
+</pre></div></div>
+</div>
+<p>We are attempting to call <code class="docutils literal notranslate"><span class="pre">dpnp.full()</span></code> function with the keyword argument <code class="docutils literal notranslate"><span class="pre">like</span></code> set to another <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array, which is currently unsupported. A possible alternative would be to use <code class="docutils literal notranslate"><span class="pre">dpnp.full_like</span></code> function:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">time</span>
+
+<span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
+<span class="n">a</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">full_like</span><span class="p">(</span><span class="n">dpnp</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">))</span>
+<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Elapsed </span><span class="si">{</span><span class="p">(</span><span class="n">time</span><span class="p">()</span><span class="o">-</span><span class="n">t</span><span class="p">)</span><span class="o">*</span><span class="mi">1000</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> ms&quot;</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array a is located on the device:&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Elapsed 1494.33 ms
+[[3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ ...
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]]
+Array a is located on the device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+<p>Now we enable <code class="docutils literal notranslate"><span class="pre">DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK</span></code> to fall back to NumPy in case of <code class="docutils literal notranslate"><span class="pre">NotImplementedError</span></code>.</p>
+<p><strong>Note: Restart Jupyter Notebook kernel before running the following code</strong></p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
+<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;0&quot;</span>
+
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK =&quot;</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">__DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK__</span><span class="p">)</span>  <span class="c1"># Expect 0</span>
+
+<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">time</span>
+
+<span class="n">N</span> <span class="o">=</span> <span class="mi">200</span><span class="o">*</span><span class="mi">100</span>
+
+<span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
+<span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">like</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)))</span>
+<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Elapsed </span><span class="si">{</span><span class="p">(</span><span class="n">time</span><span class="p">()</span><span class="o">-</span><span class="n">t</span><span class="p">)</span><span class="o">*</span><span class="mi">1000</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> ms&quot;</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array a is located on the device:&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK = 0
+Elapsed 2231.62 ms
+[[3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ ...
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]]
+Array a is located on the device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../examples.html">Examples</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../jupyter_notebook.html">Tutorials</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="01-get_started.html">Getting Started</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Controlling `dpnp` fallback to `numpy`</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="01-get_started.html"
+                          title="previous chapter">Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="../benchmarks.html"
+                          title="next chapter">Benchmarks</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/notebooks/02-dpnp_numpy_fallback.ipynb b/pull/44/notebooks/02-dpnp_numpy_fallback.ipynb
new file mode 100644
index 0000000..ca03c12
--- /dev/null
+++ b/pull/44/notebooks/02-dpnp_numpy_fallback.ipynb
@@ -0,0 +1,196 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "be340585",
+   "metadata": {},
+   "source": [
+    "# Jupyter Notebook 2: Falling back to NumPy"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9008dbe5",
+   "metadata": {},
+   "source": [
+    "**Data Parallel Extensions for Python** are still in active development and have not yet reached production quality. This in particular means that some functional and performance gaps may exist in certain `dpnp` functions that require workarounds. The functional gaps include:\n",
+    "\n",
+    "* Certain NumPy APIs are not supported. For complete reference please see the [comparison table](https://intelpython.github.io/dpnp/reference/comparison.html) for **Data Parallel Extension for NumPy**.\n",
+    "* Limited support of `dtypes`. At present the **Data Parallel Extension for NumPy** supports `float32`, `float64`, `int32`, and `int64` types.\n",
+    "* Certain keyword arguments are supported for default settings only. Please refer to the [Data Parallel Extension for NumPy API Reference](https://intelpython.github.io/dpnp/reference/index.html) for details.\n",
+    "\n",
+    "Since NumPy API is versatily there are typically some workaround options exist. Please refer to [Data Parallel Extension for NumPy API Reference](https://intelpython.github.io/dpnp/reference/index.html) and [NumPy documentation](https://numpy.org/doc/stable/) for hints for possible alternatives.\n",
+    "\n",
+    "Another possible workaround is to fall back to the host and execute the script via NumPy. This is a discouraged use because it typically results in significant performance penalties associated with copying data from the device to the host and back. However, for debugging purposes you may still want to enable this behavior.\n",
+    "\n",
+    "To do so you must set the `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` environment variable to `0`.\n",
+    "\n",
+    "Let's take the following example:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "c78511cd",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n"
+     ]
+    },
+    {
+     "ename": "NotImplementedError",
+     "evalue": "Requested funtion=full with args=((20000, 20000), 3.0, None, 'C') and kwargs={'like': array([])} isn't currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception.",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mNotImplementedError\u001b[0m                       Traceback (most recent call last)",
+      "Cell \u001b[1;32mIn[3], line 9\u001b[0m\n\u001b[0;32m      7\u001b[0m a_np \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39mfull((N, N), \u001b[38;5;241m3.\u001b[39m, like \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39mzeros((N, \u001b[38;5;241m0\u001b[39m)))\n\u001b[0;32m      8\u001b[0m \u001b[38;5;28mprint\u001b[39m(a_np)\n\u001b[1;32m----> 9\u001b[0m a_dp \u001b[38;5;241m=\u001b[39m \u001b[43mdpnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfull\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mN\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mN\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m3.\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlike\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mdpnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mzeros\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mN\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     10\u001b[0m \u001b[38;5;28mprint\u001b[39m(a_dp)\n",
+      "File \u001b[1;32m~\\AppData\\Local\\Continuum\\miniconda3\\envs\\ndpex-examples\\lib\\site-packages\\dpnp\\dpnp_iface_arraycreation.py:747\u001b[0m, in \u001b[0;36mfull\u001b[1;34m(shape, fill_value, dtype, order, like, device, usm_type, sycl_queue)\u001b[0m\n\u001b[0;32m    738\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m    739\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m dpnp_container\u001b[38;5;241m.\u001b[39mfull(shape,\n\u001b[0;32m    740\u001b[0m                                fill_value,\n\u001b[0;32m    741\u001b[0m                                dtype\u001b[38;5;241m=\u001b[39mdtype,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    744\u001b[0m                                usm_type\u001b[38;5;241m=\u001b[39musm_type,\n\u001b[0;32m    745\u001b[0m                                sycl_queue\u001b[38;5;241m=\u001b[39msycl_queue)\n\u001b[1;32m--> 747\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcall_origin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnumpy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfull\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshape\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlike\u001b[49m\u001b[43m)\u001b[49m\n",
+      "File \u001b[1;32mdpnp\\dpnp_utils\\dpnp_algo_utils.pyx:132\u001b[0m, in \u001b[0;36mdpnp.dpnp_utils.dpnp_algo_utils.call_origin\u001b[1;34m()\u001b[0m\n",
+      "\u001b[1;31mNotImplementedError\u001b[0m: Requested funtion=full with args=((20000, 20000), 3.0, None, 'C') and kwargs={'like': array([])} isn't currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception."
+     ]
+    }
+   ],
+   "source": [
+    "import dpnp\n",
+    "import numpy\n",
+    "\n",
+    "N = 200*100\n",
+    "\n",
+    "# Create an two dimencial array with singular element and array like option\n",
+    "a_np = numpy.full((N, N), 3., like = numpy.zeros((N, 0)))\n",
+    "print(a_np)\n",
+    "a_dp = dpnp.full((N, N), 3., like = dpnp.zeros((N, 0)))\n",
+    "print(a_dp)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ae026021",
+   "metadata": {},
+   "source": [
+    "We are attempting to call `dpnp.full()` function with the keyword argument `like` set to another `dpnp` array, which is currently unsupported. A possible alternative would be to use `dpnp.full_like` function:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "5e588080-484a-44f4-a168-7d07f760c7a0",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Elapsed 1494.33 ms\n",
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n",
+      "Array a is located on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "from time import time\n",
+    "\n",
+    "t = time()\n",
+    "a = dpnp.full_like(dpnp.zeros((N, 0)), 3., shape=(N, N))\n",
+    "print(f\"Elapsed {(time()-t)*1000:.2f} ms\")\n",
+    "print(a)\n",
+    "print(\"Array a is located on the device:\", a.device)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "210440c3",
+   "metadata": {},
+   "source": [
+    "Now we enable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to fall back to NumPy in case of `NotImplementedError`."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bca7490d",
+   "metadata": {},
+   "source": [
+    "**Note: Restart Jupyter Notebook kernel before running the following code** "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "05ad1565",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK = 0\n",
+      "Elapsed 2231.62 ms\n",
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n",
+      "Array a is located on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "import os\n",
+    "os.environ[\"DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK\"] = \"0\" \n",
+    "\n",
+    "import dpnp as np\n",
+    "print (\"DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK =\", np.config.__DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK__)  # Expect 0\n",
+    "\n",
+    "from time import time\n",
+    "\n",
+    "N = 200*100\n",
+    "\n",
+    "t = time()\n",
+    "a = np.full((N, N), 3., like = np.zeros((N, 0)))\n",
+    "print(f\"Elapsed {(time()-t)*1000:.2f} ms\")\n",
+    "print(a)\n",
+    "print(\"Array a is located on the device:\", a.device)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pull/44/objects.inv b/pull/44/objects.inv
new file mode 100644
index 0000000..fa9016d
Binary files /dev/null and b/pull/44/objects.inv differ
diff --git a/pull/44/parallelism.html b/pull/44/parallelism.html
new file mode 100644
index 0000000..7014774
--- /dev/null
+++ b/pull/44/parallelism.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Parallelism in Modern Data-Parallel Architectures &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Heterogeneous Computing" href="heterogeneous_computing.html" />
+    <link rel="prev" title="Prerequisites and Installation" href="prerequisites_and_installation.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="heterogeneous_computing.html" title="Heterogeneous Computing">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="prerequisites_and_installation.html" title="Prerequisites and Installation">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Parallelism in Modern Data-Parallel Architectures</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="parallelism"></span><section id="parallelism-in-modern-data-parallel-architectures">
+<h1>Parallelism in Modern Data-Parallel Architectures<a class="headerlink" href="#parallelism-in-modern-data-parallel-architectures" title="Permalink to this heading">¶</a></h1>
+<p>Python is loved for its productivity and interactivity. But when it comes to dealing with
+computationally heavy codes, Python performance cannot be compromised. Intel and Python numerical
+computing communities, such as <a class="reference external" href="https://numfocus.org/">NumFOCUS</a>, dedicate attention to
+optimizing core numerical and data science packages for leveraging parallelism available in modern CPUs:</p>
+<ul class="simple">
+<li><p><strong>Multiple computational cores:</strong> Several computational cores allow to process the data concurrently.
+Compared to a single-core CPU, <em>N</em> cores can process either <em>N</em> times bigger data in a fixed time, or
+reduce a computation time <em>N</em> times for a set amount of data.</p></li>
+</ul>
+<a class="reference internal image-reference" href="_images/dpep-cores.png"><img alt="Multiple CPU Cores" class="align-center" src="_images/dpep-cores.png" style="width: 600px;" /></a>
+<ul>
+<li><p><strong>SIMD parallelism:</strong> SIMD (Single Instruction Multiple Data) is a special type of instructions
+that perform operations on vectors of data elements at the same time. The size of vectors is called the SIMD width.
+If a SIMD width is <em>K</em> then a SIMD instruction can process <em>K</em> data elements in parallel.</p>
+<p>In the following diagram, the SIMD width is 2, which means that a single instruction processes two elements simultaneously.
+Compared to regular instructions that process one element at a time, 2-wide SIMD instruction performs
+two times more data in fixed time, or, respectively, process a fixed amount of data two times faster.</p>
+</li>
+</ul>
+<a class="reference internal image-reference" href="_images/dpep-simd.png"><img alt="SIMD" class="align-center" src="_images/dpep-simd.png" style="width: 150px;" /></a>
+<ul class="simple">
+<li><p><strong>Instruction-Level Parallelism:</strong> Modern CISC architectures, such as x86, allow performing data independent
+instructions in parallel. In the following example, see how to compute <span class="math notranslate nohighlight">\(a * b + (c - d)\)</span>.
+Operations <span class="math notranslate nohighlight">\(*\)</span> and <span class="math notranslate nohighlight">\(-\)</span> can be executed in parallel, the last instruction
+<span class="math notranslate nohighlight">\(+\)</span> depends on availability of <span class="math notranslate nohighlight">\(a * b\)</span> and <span class="math notranslate nohighlight">\(c - d\)</span> and cannot be executed in parallel
+with <span class="math notranslate nohighlight">\(*\)</span> and <span class="math notranslate nohighlight">\(-\)</span>.</p></li>
+</ul>
+<a class="reference internal image-reference" href="_images/dpep-ilp.png"><img alt="SIMD" class="align-center" src="_images/dpep-ilp.png" style="width: 150px;" /></a>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="prerequisites_and_installation.html"
+                          title="previous chapter">Prerequisites and Installation</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="heterogeneous_computing.html"
+                          title="next chapter">Heterogeneous Computing</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/prerequisites_and_installation.html b/pull/44/prerequisites_and_installation.html
new file mode 100644
index 0000000..c1add62
--- /dev/null
+++ b/pull/44/prerequisites_and_installation.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Prerequisites and Installation &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Parallelism in Modern Data-Parallel Architectures" href="parallelism.html" />
+    <link rel="prev" title="Data Parallel Extensions for Python" href="index.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="parallelism.html" title="Parallelism in Modern Data-Parallel Architectures">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="index.html" title="Data Parallel Extensions for Python">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Prerequisites and Installation</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="prerequisites-and-installation"></span><section id="id1">
+<h1>Prerequisites and Installation<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<section id="device-drivers">
+<h2>1. Device Drivers<a class="headerlink" href="#device-drivers" title="Permalink to this heading">¶</a></h2>
+<p>To start programming data parallel devices beyond CPU, you will need an appropriate hardware.
+For example, Data Parallel Extensions for Python work fine on Intel © laptops with integrated graphics.
+In majority of cases, your Windows*-based laptop already has all necessary device drivers installed. But if you want the most
+up-to-date driver, you can always
+<a class="reference external" href="https://www.intel.com/content/www/us/en/download-center/home.html">update it to the latest one</a>.
+Follow device driver installation instructions
+to complete this step.</p>
+<p>All other necessary components for programming data parallel devices will be installed with
+Data Parallel Extensions for Python.</p>
+</section>
+<section id="python-interpreter">
+<h2>2. Python Interpreter<a class="headerlink" href="#python-interpreter" title="Permalink to this heading">¶</a></h2>
+<p>You will need Python 3.8, 3.9, or 3.10 installed on your system. If you do not have one yet the easiest way to do
+that is to install <a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/distribution-for-python.html">Intel Distribution for Python*</a>.
+It installs all essential Python numerical and machine
+learning packages optimized for the Intel hardware, including Data Parallel Extensions for Python*.
+If you have Python installation from another vendor, it is fine too. All you need is to install Data Parallel
+Extensions for Python manually as shown in the next section.</p>
+</section>
+<section id="data-parallel-extensions-for-python">
+<h2>3. Data Parallel Extensions for Python<a class="headerlink" href="#data-parallel-extensions-for-python" title="Permalink to this heading">¶</a></h2>
+<p>Skip this step if you already installed Intel © Distribution for Python.</p>
+<p>The easiest way to install Data Parallel Extensions for Python is to install numba-dpex:</p>
+<ul class="simple">
+<li><p>Conda: <code class="docutils literal notranslate"><span class="pre">conda</span> <span class="pre">install</span> <span class="pre">numba-dpex</span></code></p></li>
+<li><p>Pip: <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">numba-dpex</span></code></p></li>
+</ul>
+<p>These commands install <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> along with its dependencies, including <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>, <code class="docutils literal notranslate"><span class="pre">dpctl</span></code>,
+and required compiler runtimes.</p>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>Before installing with conda or pip it is strongly advised to update <code class="docutils literal notranslate"><span class="pre">conda</span></code> and <code class="docutils literal notranslate"><span class="pre">pip</span></code> to latest versions</p>
+</div>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="index.html"
+                          title="previous chapter">Data Parallel Extensions for Python</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="parallelism.html"
+                          title="next chapter">Parallelism in Modern Data-Parallel Architectures</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/programming_dpep.html b/pull/44/programming_dpep.html
new file mode 100644
index 0000000..53a78e9
--- /dev/null
+++ b/pull/44/programming_dpep.html
@@ -0,0 +1,441 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Programming with Data Parallel Extensions for Python &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Examples" href="examples.html" />
+    <link rel="prev" title="Heterogeneous Computing" href="heterogeneous_computing.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="examples.html" title="Examples">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="heterogeneous_computing.html" title="Heterogeneous Computing">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Programming with Data Parallel Extensions for Python</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="programming-dpep"></span><section id="programming-with-data-parallel-extensions-for-python">
+<h1>Programming with Data Parallel Extensions for Python<a class="headerlink" href="#programming-with-data-parallel-extensions-for-python" title="Permalink to this heading">¶</a></h1>
+<a class="reference internal image-reference" href="_images/dpep-all.png"><img alt="Data Parallel Extensions for Python" class="align-center" src="_images/dpep-all.png" style="width: 600px;" /></a>
+<p><strong>Data Parallel Extensions for Python</strong> consist of three foundational packages:</p>
+<ul class="simple">
+<li><p>The <a class="reference external" href="https://numpy.org/">Numpy*</a>-like library, <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>;</p></li>
+<li><p>The compiler extension for <a class="reference external" href="https://numba.pydata.org/">Numba*</a>, <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code></p></li>
+<li><p>The library for managing devices, queues, and heterogeneous data, <code class="docutils literal notranslate"><span class="pre">dpctl</span></code>.</p></li>
+</ul>
+<p>Their underlying implementation is based on <a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> standard, which is a cross-platform abstraction layer
+for heterogeneous computing on data parallel devices, such as CPU, GPU, or domain-specific accelerators.</p>
+<section id="scalars-vs-0-dimensional-arrays">
+<h2>Scalars vs. 0-Dimensional Arrays<a class="headerlink" href="#scalars-vs-0-dimensional-arrays" title="Permalink to this heading">¶</a></h2>
+<p>Primitive types, such as Python’s and Numpy’s <code class="docutils literal notranslate"><span class="pre">float</span></code>, <code class="docutils literal notranslate"><span class="pre">int</span></code>, or <code class="docutils literal notranslate"><span class="pre">complex</span></code>, used to represent scalars,
+have the host storage. In contrast, <code class="docutils literal notranslate"><span class="pre">dpctl.tensor.usm_ndarray</span></code> and <code class="docutils literal notranslate"><span class="pre">dpnp.ndarray</span></code> have the USM storage
+and carry associated allocation queue. For the <a class="reference internal" href="heterogeneous_computing.html#compute-follows-data"><span class="std std-ref">Compute-Follows-Data</span></a> consistent behavior
+all <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> operations that produce scalars will instead produce respective 0-dimensional arrays.</p>
+<p>That implies, that some code changes may be needed to replace scalar math operations with respective
+<code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array operations. See <a class="reference external" href="https://intelpython.github.io/dpnp/">Data Parallel Extension for Numpy*</a> - <strong>API Reference</strong> section for details.</p>
+</section>
+<section id="data-parallel-extension-for-numpy-dpnp">
+<h2>Data Parallel Extension for Numpy - dpnp<a class="headerlink" href="#data-parallel-extension-for-numpy-dpnp" title="Permalink to this heading">¶</a></h2>
+<p>The <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> library is a bare minimum to start programming numerical codes for data-parallel devices.
+If you already have a Python script written in <a class="reference external" href="https://numpy.org/">Numpy*</a>, then running it on a GPU will typically require
+changing just a few lines of the code:</p>
+<div class="literal-block-wrapper docutils container" id="ex-01-hello-dpnp">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 01:</strong> Your first NumPy code running on GPU</span><a class="headerlink" href="#ex-01-hello-dpnp" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<p>In this example, <code class="docutils literal notranslate"><span class="pre">np.asarray()</span></code> creates an array on the default <a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> device, which is a <code class="docutils literal notranslate"><span class="pre">&quot;gpu&quot;</span></code> on systems
+with integrated or discrete GPU (it is the <code class="docutils literal notranslate"><span class="pre">&quot;host&quot;</span></code> on systems that do not have GPU).
+The queue associated with this array is now carried with <code class="docutils literal notranslate"><span class="pre">x</span></code>, and <code class="docutils literal notranslate"><span class="pre">np.sum(x)</span></code> derives it from <code class="docutils literal notranslate"><span class="pre">x</span></code>,
+and respective pre-compiled kernel implementing <code class="docutils literal notranslate"><span class="pre">np.sum()</span></code> is submitted to that queue.
+The result <code class="docutils literal notranslate"><span class="pre">y</span></code> is allocated on the device 0-dimensional array associated with that queue too.</p>
+<p>All <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array creation routines and random number generators have additional optional keyword arguments:
+<code class="docutils literal notranslate"><span class="pre">device</span></code>, <code class="docutils literal notranslate"><span class="pre">queue</span></code>, and <code class="docutils literal notranslate"><span class="pre">usm_type</span></code>, using which you can explicitly specify on which device or queue you want
+the tensor data to be created along with the USM memory type to be used (<code class="docutils literal notranslate"><span class="pre">&quot;host&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;device&quot;</span></code>, or <code class="docutils literal notranslate"><span class="pre">&quot;shared&quot;</span></code>).
+In the following example, the array <code class="docutils literal notranslate"><span class="pre">x</span></code> is created on the GPU device, and reduction sum is done on it:</p>
+<div class="literal-block-wrapper docutils container" id="ex-02-dpnp-device">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 02:</strong> Select device type while creating array</span><a class="headerlink" href="#ex-02-dpnp-device" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+</section>
+<section id="data-parallel-extension-for-numba-numba-dpex">
+<h2>Data Parallel Extension for Numba - numba-dpex<a class="headerlink" href="#data-parallel-extension-for-numba-numba-dpex" title="Permalink to this heading">¶</a></h2>
+<p><a class="reference external" href="https://numba.pydata.org/">Numba*</a> is a powerful Just-In-Time (JIT) compiler that works best on <a class="reference external" href="https://numpy.org/">Numpy*</a> arrays, <a class="reference external" href="https://numpy.org/">Numpy*</a> functions, and loops.
+Data-parallel loops is where the data parallelism resides. It allows leveraging all available CPU cores,
+SIMD instructions, and schedules those in a way that exploits maximum instruction-level parallelism.
+The <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> extension allows to compile and offload data-parallel regions to any data parallel device.
+It takes just a few lines to modify your CPU <a class="reference external" href="https://numba.pydata.org/">Numba*</a> script to run on GPU:</p>
+<div class="literal-block-wrapper docutils container" id="ex-03-dpnp2numba-dpex">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 03:</strong> Compile dpnp code with numba-dpex</span><a class="headerlink" href="#ex-03-dpnp2numba-dpex" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">from</span> <span class="nn">numba_dpex</span> <span class="kn">import</span> <span class="n">dpjit</span> <span class="k">as</span> <span class="n">njit</span>
+
+
+<span class="nd">@njit</span><span class="p">()</span>
+<span class="k">def</span> <span class="nf">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>  <span class="c1"># Device queue is inferred from x. The kernel is submitted to that queue</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<p>In this example, you can see a custom function <code class="docutils literal notranslate"><span class="pre">sum_it()</span></code> that takes an array input. By compiling it with
+<a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a>, the queue information is derived from input argument <code class="docutils literal notranslate"><span class="pre">x</span></code>,
+which is associated with the default device (<code class="docutils literal notranslate"><span class="pre">&quot;gpu&quot;</span></code> on systems with integrated or discrete GPU) and
+dynamically compiles the kernel submitted to that queue. The result resides as a 0-dimensional array on the device
+associated with the queue, and on exit from the offload kernel it will be assigned to the tensor <code class="docutils literal notranslate"><span class="pre">y</span></code>.</p>
+</section>
+<section id="data-parallel-control-dpctl">
+<h2>Data Parallel Control - dpctl<a class="headerlink" href="#data-parallel-control-dpctl" title="Permalink to this heading">¶</a></h2>
+<p>Both <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> and <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> provide enough API versatility for programming data parallel devices but
+there are some situations when you need to use <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> advanced capabilities:</p>
+<ol class="arabic">
+<li><p><strong>Advanced device management.</strong> Both <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> and <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> support Numpy array creation routines
+with additional parameters that specify the device on which the data is allocated and the type of memory to be used
+(<code class="docutils literal notranslate"><span class="pre">&quot;device&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;host&quot;</span></code>, or <code class="docutils literal notranslate"><span class="pre">&quot;shared&quot;</span></code>). However, if you need some more advanced device and data management
+capabilities, you need to import <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> in addition to <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> and/or <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code>.</p>
+<p>One of frequent usages of <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> is to query the list devices present on the system, available driver backend
+(such as <code class="docutils literal notranslate"><span class="pre">&quot;opencl&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;level_zero&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;cuda&quot;</span></code>, etc.)</p>
+<p>Another frequent usage is the creation of additional queues for the purpose of profiling or choosing an out-of-order
+execution of offload kernels.</p>
+</li>
+</ol>
+<div class="literal-block-wrapper docutils container" id="ex-04-dpctl-device-query">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 04:</strong> Get information about devices</span><a class="headerlink" href="#ex-04-dpctl-device-query" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">()</span>  <span class="c1"># Print platform information</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;GPU devices:&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the list of all GPU devices</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;Number of GPU devices&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_num_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the number of GPU devices</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has CPU devices?&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">has_cpu_devices</span><span class="p">())</span>  <span class="c1"># Check if there are CPU devices</span>
+</pre></div>
+</div>
+</div>
+<ol class="arabic" start="2">
+<li><p><strong>Cross-platform development using Python Array API standard.</strong> If you
+program Numpy-like codes and target different hardware vendors and different tensor implementations,
+then going with <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> is a good choice for writing a portable Numpy-like code.
+The <code class="docutils literal notranslate"><span class="pre">dpctl.tensor</span></code> implements <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> for <a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> devices. Accompanied with
+respective SYCL device, driver from different vendors, <code class="docutils literal notranslate"><span class="pre">dpctl.tensor</span></code> becomes a portable solution
+for writing numerical codes for any SYCL device.</p>
+<p>For example, some Python communities, such as
+<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/22352">Scikit-Learn* community</a>, are already establishing
+a path for having algorithms (re-)implemented using <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> .
+This is a reliable path for extending their capabilities beyond CPU only, or beyond certain GPU vendor only.</p>
+</li>
+<li><p><strong>Zero-copy data exchange between tensor implementations.</strong> Certain Python projects may have their tensor
+implementations not relying on <code class="docutils literal notranslate"><span class="pre">dpctl.tensor</span></code> or <code class="docutils literal notranslate"><span class="pre">dpnp.ndarray</span></code> tensors. However, you can still exchange data
+between these tensors not copying it back and forth through the host.
+<a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> specifies the data exchange protocol for zero-copy exchange
+between tensors through <code class="docutils literal notranslate"><span class="pre">dlpack</span></code>. Being the <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> implementation
+<code class="docutils literal notranslate"><span class="pre">dpctl</span></code> provides <code class="docutils literal notranslate"><span class="pre">dpctl.tensor.from_dlpack()</span></code> function used for zero-copy view of another tensor input.</p></li>
+</ol>
+</section>
+<section id="debugging-and-profiling-data-parallel-extensions-for-python">
+<h2>Debugging and Profiling Data Parallel Extensions for Python<a class="headerlink" href="#debugging-and-profiling-data-parallel-extensions-for-python" title="Permalink to this heading">¶</a></h2>
+<p><a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit.html">Intel oneAPI Base Toolkit</a> provides two tools to assist programmers to analyze performance issues in programs
+that use <strong>Data Parallel Extensions for Python</strong>. They are <a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html">Intel VTune Profiler</a> and
+<a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/advisor.html">Intel Advisor</a>.</p>
+<p>Intel © VTune ™ Profiler examines various performance aspects of a program like, the most time-consuming parts,
+efficiency of offloaded code, impact of memory sub-systems, etc.</p>
+<p>Intel © Advisor ™ provides insights on the performance of offloaded code with respect to the peak performance and
+memory bandwidth.</p>
+<p>Below you can find how to use Intel VTune Profiler and Intel Advisor with
+heterogenous programs that use <strong>Data Parallel Extensions for Python</strong>.</p>
+<section id="profiling-with-intel-vtune-profiler">
+<h3>Profiling with Intel VTune Profiler<a class="headerlink" href="#profiling-with-intel-vtune-profiler" title="Permalink to this heading">¶</a></h3>
+<p>Intel © VTune ™ Profiler provides two mechanisms to profile heterogeneous programs
+targeted to GPUs.</p>
+<ul class="simple">
+<li><p>GPU offload</p></li>
+<li><p>GPU hotspots</p></li>
+</ul>
+<p>The <em>GPU offload</em> analysis profiles the entire application (both GPU and host code) and helps to identify
+if the application is CPU- or GPU-bound. It provides information on the proportion of the execution time spent
+in GPU execution. It also provides information about various hotspots in the program. The key goal of the <em>GPU offload</em>
+analysis is to identify the parts of the program that can benefit from offloading to GPUs.</p>
+<p>The <em>GPU hotspots</em> analysis focuses on providing insights into the performance of GPU-offloaded code.
+It provides insights about the parallelism in the GPU kernel, the efficiency of the kernel, SIMD utilization,
+and memory latency. It also provides performance data regarding synchronization operations like GPU barriers and
+atomic operations.</p>
+<p>The following instructions are used to execute the two Intel VTune Profiler analyses on programs written
+using <strong>Data Parallel Extensions for Python</strong>:</p>
+<div class="literal-block-wrapper docutils container" id="id2">
+<div class="code-block-caption"><span class="caption-text"><strong>GPU Offload</strong></span><a class="headerlink" href="#id2" title="Permalink to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; vtune -collect gpu-offload -r &lt;output_dir&gt; -- python &lt;script&gt;.py &lt;args&gt;</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="id3">
+<div class="code-block-caption"><span class="caption-text"><strong>GPU Hotspots</strong></span><a class="headerlink" href="#id3" title="Permalink to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; vtune -collect gpu-hotspots -r &lt;output_dir&gt; -- python &lt;script&gt;.py &lt;args&gt;</span>
+</pre></div>
+</div>
+</div>
+<p>Intel VTune Profiler performs dynamic binary analysis on a given program to obtain insights on various
+performance characteristics. It can run on unmodified binaries with no extra requirements for program compilation.
+After collecting the data using the above commands, the Intel VTune Profiler GUI can be used to view various
+performance characteristics. In addition to the GUI, it provides mechanisms to generate reports through
+the command line and setup a web server for post processing the data.</p>
+<p>See <a class="reference external" href="https://www.intel.com/content/www/us/en/develop/documentation/vtune-help/top.html">Intel VTune Profiler User Guide</a>
+for more details.</p>
+</section>
+<section id="profiling-with-intel-advisor">
+<h3>Profiling with Intel Advisor<a class="headerlink" href="#profiling-with-intel-advisor" title="Permalink to this heading">¶</a></h3>
+<p>The primary goal of Intel © Advisor is to help you make targeted optimizations by identifying
+appropriate kernels and characterizing the performance limiting factors. It provides mechanisms
+to analyze the performance of GPU kernels against the hardware roof-line performance. Intel Advisor gives you information
+about the maximum achievable performance with the given hardware conditions and helps identify the best
+kernels for optimization. Further, it helps you to characterize if a GPU kernel is bound by
+compute capacity or by memory bandwidth.</p>
+<p>The following instructions are used to generate GPU roof-line performance graphs using Intel Advisor.</p>
+<div class="literal-block-wrapper docutils container" id="id4">
+<div class="code-block-caption"><span class="caption-text"><strong>Collect Roofline</strong></span><a class="headerlink" href="#id4" title="Permalink to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; advisor --collect=roofline --profile-gpu --project-dir=&lt;output_dir&gt; --search-dir src:r=&lt;search_dir&gt; -- &lt;executable&gt; &lt;args&gt;</span>
+</pre></div>
+</div>
+</div>
+<p>This command collects the GPU roof-line data from executing the application written using
+<strong>Data Parallel Extensions for Python</strong>.</p>
+<p>The next command generates the roof-line graph as a HTML file in the output directory:</p>
+<div class="literal-block-wrapper docutils container" id="id5">
+<div class="code-block-caption"><span class="caption-text"><strong>Generate Roofline HTML-File</strong></span><a class="headerlink" href="#id5" title="Permalink to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; advisor --report=roofline --gpu --project-dir=&lt;output_dir&gt; --report-output=&lt;output_dir&gt;/roofline_gpu.html</span>
+</pre></div>
+</div>
+</div>
+<a class="reference internal image-reference" href="_images/advisor_roofline_gen9.png"><img alt="Advisor roofline analysis example on Gen9 integrated GPU" class="align-center" src="_images/advisor_roofline_gen9.png" style="width: 800px;" /></a>
+<p>The figure above shows the example of roof-line graph generated using Intel Advisor.
+The X-axis in the graph represents arithmetic intensity and the Y-axis represents performance in GFLOPS.
+The horizontal lines parallel to the X-axis represent the roof-line compute capacity for the given hardware.
+The cross-diagonal lines represent the peak memory bandwidth of different layers of the memory hierarchy.
+The red colored dot corresponds to the executed GPU kernel. The graph shows the performance of the kernel relative
+to the peak compute capacity and memory bandwidth. It also shows whether the GPU kernel is memory or compute
+bound depending on the roof-line that is limiting the GPU kernel.</p>
+<p>For further details on Intel Advisor and its extended capabilities, refer to the
+<a class="reference external" href="https://www.intel.com/content/www/us/en/develop/documentation/advisor-user-guide/top.html">Intel |copy| Advisor User Guide</a>.</p>
+<div class="admonition-todo admonition" id="id1">
+<p class="admonition-title">Todo</p>
+<p>Document debugging section</p>
+</div>
+</section>
+</section>
+<section id="writing-robust-numerical-codes-for-heterogeneous-computing">
+<h2>Writing Robust Numerical Codes for Heterogeneous Computing<a class="headerlink" href="#writing-robust-numerical-codes-for-heterogeneous-computing" title="Permalink to this heading">¶</a></h2>
+<p>Default primitive type (<code class="docutils literal notranslate"><span class="pre">dtype</span></code>) in <a class="reference external" href="https://numpy.org/">Numpy*</a> is the double precision (<code class="docutils literal notranslate"><span class="pre">float64</span></code>), which is supported by
+majority of modern CPUs. When it comes to program GPUs and especially specialized accelerators,
+the set of supported primitive data types may be limited. For example, certain GPUs may not support
+double precision or half-precision. <strong>Data Parallel Extensions for Python</strong> select default <code class="docutils literal notranslate"><span class="pre">dtype</span></code> depending on
+device’s default type in accordance with Python Array API Standard. It can be either <code class="docutils literal notranslate"><span class="pre">float64</span></code> or <code class="docutils literal notranslate"><span class="pre">float32</span></code>.
+It means that unlike traditional <a class="reference external" href="https://numpy.org/">Numpy*</a> programming on a CPU, the heterogeneous computing requires
+careful management of hardware peculiarities to keep the Python script portable and robust on any device.</p>
+<p>There are several hints how to make the numerical code portable and robust.</p>
+<section id="sensitivity-to-floating-point-errors">
+<h3>Sensitivity to Floating-Point Errors<a class="headerlink" href="#sensitivity-to-floating-point-errors" title="Permalink to this heading">¶</a></h3>
+<p>Floating-point arithmetic has a finite precision, which implies that only a tiny fraction of real numbers can be
+represented in floating-point arithmetic. It is almost certain that every floating-point operation
+induces a rounding error because the result cannot be accurately represented as a floating-point number.
+The <a class="reference external" href="https://standards.ieee.org/ieee/754/6210/">IEEE 754-2019 Standard for Floating-Point Arithmetic</a> sets the upper bound for rounding errors in each
+arithmetic operation to 0.5 <em>ulp</em>, meaning that each arithmetic operation must be accurate to the last bit of
+floating-point mantissa, which is an order of <span class="math notranslate nohighlight">\(10^-16\)</span> in double precision and <span class="math notranslate nohighlight">\(10^-7\)</span>
+in single precision.</p>
+<p>In robust numerical codes, these errors tend to accumulate slowly so that single precision is enough to
+calculate the result accurate to three-five decimal digits.</p>
+<p>However, there is a situation known as a <em>catastrophic cancellation</em>, when small accumulated errors
+result in a significant, or even complete, loss of accuracy. The catastrophic cancellation happens
+when two close floating-point numbers with small rounding errors are subtracted. As a result the original
+rounding errors amplify by the number of identical leading digits:</p>
+<a class="reference internal image-reference" href="_images/fp-cancellation.png"><img alt="Floating-Point Cancellation" class="align-center" src="_images/fp-cancellation.png" style="width: 327.0px; height: 141.0px;" /></a>
+<p>In the example above, green digits are accurate digits, a few trailing digits in red are inaccurate due to
+induced errors. As a result of subtraction, only one accurate digit remains.</p>
+<p>Situations with catastrophic cancellations must be carefully handled. An example where catastrophic
+cancellation happens naturally is the numeric differentiation, where two close numbers are subtracted
+to approximate the derivative:</p>
+<div class="math notranslate nohighlight">
+\[df/dx \approx \frac{f(x+\delta) - f(x-\delta)}{2\delta}\]</div>
+<p>Smaller you take <span class="math notranslate nohighlight">\(\delta\)</span> is greater the catastrophic cancellation. At the same time, bigger <span class="math notranslate nohighlight">\(\delta\)</span>
+results in bigger approximation error. Books on numerical computing and floating-point arithmetic discuss
+variety of technics to make catastrophic cancellations controllable. For more details about floating-point
+arithmetic, refer to <a class="reference external" href="https://standards.ieee.org/ieee/754/6210/">IEEE 754-2019 Standard for Floating-Point Arithmetic</a> and the article by
+<a class="reference external" href="https://www.itu.dk/~sestoft/bachelor/IEEE754_article.pdf&gt;">David Goldberg, What every computer scientist should know about floating-point arithmetic</a>.</p>
+</section>
+<section id="switching-between-single-and-double-precision">
+<h3>Switching Between Single and Double Precision<a class="headerlink" href="#switching-between-single-and-double-precision" title="Permalink to this heading">¶</a></h3>
+<ol class="arabic simple">
+<li><p>Implement your code to switch easily between single and double precision in a controlled fashion.
+For example, implement a utility function or introduce a constant that selects <code class="docutils literal notranslate"><span class="pre">dtype</span></code> for
+the rest of the <a class="reference external" href="https://numpy.org/">Numpy*</a> code.</p></li>
+<li><p>Run your code on a representative set of inputs in single and double precisions.
+Observe sensitivity of computed results to the switching between single and double precisions.
+If results remain identical to three-five digits for different inputs, it is a good sign that your code
+is not sensitive to floating-point errors.</p></li>
+<li><p>Write your code with catastrophic cancellations in mind. These blocks of code will require special
+care such as the use of extended precision or other techniques to control cancellations.
+It is likely that this part of the code requires a hardware specific implementation.</p></li>
+</ol>
+</section>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="heterogeneous_computing.html"
+                          title="previous chapter">Heterogeneous Computing</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="examples.html"
+                          title="next chapter">Examples</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/search.html b/pull/44/search.html
new file mode 100644
index 0000000..12a463c
--- /dev/null
+++ b/pull/44/search.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Search &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <script src="_static/searchtools.js"></script>
+    <script src="_static/language_data.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="#" />
+  <script src="searchindex.js" defer></script>
+  
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+       
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <h1 id="search-documentation">Search</h1>
+  
+  <noscript>
+  <div class="admonition warning">
+  <p>
+    Please activate JavaScript to enable the search
+    functionality.
+  </p>
+  </div>
+  </noscript>
+  
+  
+  <p>
+    Searching for multiple words only shows matches that contain
+    all words.
+  </p>
+  
+  
+  <form action="" method="get">
+    <input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+    <input type="submit" value="search" />
+    <span id="search-progress" style="padding-left: 10px"></span>
+  </form>
+  
+  
+  
+  <div id="search-results">
+  
+  </div>
+  
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/44/searchindex.js b/pull/44/searchindex.js
new file mode 100644
index 0000000..efb6650
--- /dev/null
+++ b/pull/44/searchindex.js
@@ -0,0 +1 @@
+Search.setIndex({"docnames": ["benchmarks", "demos", "examples", "heterogeneous_computing", "index", "jupyter_notebook", "notebooks/01-get_started", "notebooks/02-dpnp_numpy_fallback", "parallelism", "prerequisites_and_installation", "programming_dpep", "useful_links"], "filenames": ["benchmarks.rst", "demos.rst", "examples.rst", "heterogeneous_computing.rst", "index.rst", "jupyter_notebook.rst", "notebooks/01-get_started.ipynb", "notebooks/02-dpnp_numpy_fallback.ipynb", "parallelism.rst", "prerequisites_and_installation.rst", "programming_dpep.rst", "useful_links.rst"], "titles": ["Benchmarks", "Demos", "Examples", "Heterogeneous Computing", "Data Parallel Extensions for Python", "Tutorials", "Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python", "Jupyter Notebook 2: Falling back to NumPy", "Parallelism in Modern Data-Parallel Architectures", "Prerequisites and Installation", "Programming with Data Parallel Extensions for Python", "Useful links"], "terms": {"data": [0, 1, 2, 5, 7, 11], "parallel": [0, 1, 2, 3, 5, 7, 11], "extens": [0, 1, 2, 3, 5, 7, 11], "python": [0, 1, 2, 3, 5, 7, 8, 11], "provid": [0, 4, 6, 10, 11], "set": [0, 1, 6, 7, 8, 10], "illustr": [0, 1, 3, 5, 6], "differ": [0, 3, 6, 10, 11], "aspect": [0, 3, 6, 10], "implement": [0, 3, 4, 7, 10, 11], "perform": [0, 3, 4, 6, 7, 8, 10, 11], "code": [0, 2, 3, 4, 6, 7, 8, 11], "repres": [0, 10], "some": [0, 5, 6, 7, 10], "real": [0, 10], "life": [0, 1], "numer": [0, 4, 8, 9, 11], "problem": 0, "import": [0, 2, 6, 7, 10, 11], "part": [0, 10], "kernel": [0, 2, 3, 5, 7, 10], "applic": [0, 1, 5, 6, 10], "each": [0, 3, 10], "i": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "sever": [0, 1, 8, 10], "variant": 0, "necessarili": [0, 3], "all": [0, 1, 2, 3, 5, 6, 9, 10], "pure": 0, "typic": [0, 3, 7, 10], "slowest": 0, "us": [0, 1, 2, 3, 4, 5, 6, 7, 10], "just": [0, 10, 11], "refer": [0, 1, 5, 6, 7, 10], "numpi": [0, 2, 4, 5, 6, 11], "same": [0, 2, 3, 6, 8, 10], "librari": [0, 3, 4, 10, 11], "dpnp": [0, 2, 3, 4, 5, 6, 7, 9], "modifi": [0, 10], "run": [0, 2, 3, 5, 7, 10], "specif": [0, 6, 10], "devic": [0, 2, 4, 7, 10, 11], "you": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "can": [0, 2, 3, 4, 6, 8, 9, 10], "baselin": 0, "while": [0, 2, 10], "evalu": 0, "its": [0, 3, 6, 8, 9, 10], "numba": [0, 2, 3, 4, 6, 9, 11], "njit": [0, 2, 10], "arrai": [0, 2, 3, 4, 6, 7, 11], "style": 0, "compil": [0, 2, 3, 4, 6, 9, 10, 11], "when": [0, 3, 5, 6, 8, 10], "implementat": 0, "direct": [0, 3], "loop": [0, 10], "prang": 0, "sometim": [0, 6], "program": [0, 3, 4, 6, 9, 11], "cumbersom": 0, "ineffici": 0, "mai": [0, 3, 6, 7, 10], "lead": [0, 10], "more": [0, 1, 3, 5, 8, 10], "readabl": 0, "thu": 0, "compar": [0, 8], "dpex": [0, 2, 3, 4, 9], "dpjit": [0, 2, 10], "vanilla": 0, "detail": [0, 1, 3, 7, 10], "also": [0, 6, 10], "against": [0, 10], "see": [0, 5, 6, 7, 8, 10], "how": [0, 6, 8, 10, 11], "much": [0, 3], "extra": [0, 6, 10], "bring": 0, "given": [0, 6, 10], "which": [0, 3, 5, 6, 7, 8, 10], "close": [0, 3, 10], "cuda": [0, 10], "jit": [0, 10], "model": [0, 1, 3, 6], "mlir": 0, "experiment": 0, "base": [0, 3, 6, 9, 10], "backend": [0, 6, 10], "cupi": 0, "like": [0, 6, 7, 10, 11], "compat": 0, "nativ": [0, 11], "sycl": [0, 3, 10, 11], "most": [0, 3, 7, 9, 10], "have": [0, 3, 6, 7, 9, 10], "dpc": [0, 3, 11], "abov": [0, 3, 10], "These": [0, 2, 3, 9, 10], "ar": [0, 1, 2, 3, 5, 6, 7, 10], "dpbench": 0, "framework": [0, 11], "allow": [0, 3, 4, 6, 8, 10], "select": [0, 2, 4, 6, 10], "hardwar": [0, 3, 9, 10, 11], "For": [0, 1, 3, 5, 6, 7, 9, 10], "pleas": [0, 1, 5, 6, 7], "document": [0, 1, 3, 5, 7, 10], "There": [1, 3, 10], "power": [1, 10], "thei": [1, 3, 10], "mont": 1, "carlo": 1, "pi": 1, "The": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "method": [1, 3, 6], "estim": 1, "valu": 1, "mandelbrot": 1, "visual": 1, "breathtak": 1, "process": [1, 3, 6, 8, 10], "dive": 1, "famou": 1, "fractal": 1, "game": 1, "evolut": 1, "conwai": 1, "": [1, 6, 7, 10], "locat": [1, 2, 3, 5, 6, 7, 10], "github": [1, 2, 5], "repositori": [1, 2, 5], "individu": [1, 3], "directori": [1, 5, 10], "Their": [2, 10], "name": [2, 6], "start": [2, 4, 5, 9, 10], "2": [2, 3, 4, 6, 8, 10], "digit": [2, 10], "number": [2, 6, 10], "follow": [2, 4, 7, 8, 9, 10], "descript": [2, 11], "ani": [2, 4, 10], "order": [2, 7, 10], "howev": [2, 3, 7, 10], "new": [2, 3], "recommend": 2, "go": [2, 6, 10], "enumer": 2, "command": [2, 5, 9, 10], "veri": [2, 3], "first": [2, 10], "01": [2, 10], "hello_dpnp": 2, "py": [2, 7, 10], "list": [2, 5, 6, 10], "your": [2, 5, 6, 9, 10], "gpu": [2, 3, 4, 7, 10], "np": [2, 6, 7, 10], "x": [2, 6, 10], "asarrai": [2, 3, 10], "1": [2, 3, 4, 7, 10], "3": [2, 4, 6, 7, 10], "print": [2, 5, 6, 7, 10], "alloc": [2, 3, 4, 10], "y": [2, 6, 10], "sum": [2, 6, 10], "result": [2, 3, 6, 7, 10], "shape": [2, 6, 7, 10], "0": [2, 4, 5, 6, 7], "dimension": [2, 4], "expect": [2, 6, 7, 10], "6": [2, 6, 10], "02": [2, 10], "type": [2, 3, 4, 5, 6, 7, 8, 10], "creat": [2, 4, 6, 7, 10], "empti": [2, 10], "try": [2, 6, 10], "except": [2, 3, 6, 7, 10], "avail": [2, 6, 8, 10], "03": [2, 10], "from": [2, 3, 5, 6, 7, 9, 10, 11], "numba_dpex": [2, 4, 10], "def": [2, 10], "sum_it": [2, 10], "queue": [2, 4, 10], "infer": [2, 10], "submit": [2, 3, 10], "return": [2, 7, 10], "04": [2, 10], "get": [2, 4, 5, 10], "inform": [2, 3, 5, 6, 10], "about": [2, 3, 5, 6, 10, 11], "dpctl": [2, 3, 4, 9], "lsplatform": [2, 6, 10], "platform": [2, 6, 10], "get_devic": [2, 6, 10], "device_typ": [2, 6, 10], "get_num_devic": [2, 10], "ha": [2, 3, 6, 9, 10], "cpu": [2, 3, 4, 8, 9, 10, 11], "has_cpu_devic": [2, 10], "check": [2, 6, 10], "an": [3, 4, 6, 7, 9, 10], "interpret": [3, 4], "languag": 3, "impli": [3, 10], "script": [3, 7, 10], "onli": [3, 7, 10], "few": [3, 6, 10], "region": [3, 10], "execut": [3, 4, 6, 7, 8, 10], "That": [3, 10], "why": 3, "concept": [3, 6], "host": [3, 6, 7, 10], "help": [3, 10], "come": [3, 8, 10], "conceptu": 3, "diagram": [3, 8], "three": [3, 4, 10], "two": [3, 6, 7, 8, 10], "one": [3, 8, 9, 10], "attach": 3, "acceler": [3, 10], "offer": 3, "where": [3, 5, 6, 10], "user": [3, 4, 5, 10], "specifi": [3, 6, 10], "A": [3, 7], "multipl": [3, 6, 8], "henc": 3, "pre": [3, 10], "directli": 3, "opencl": [3, 6, 10, 11], "wai": [3, 6, 9, 10], "write": [3, 4, 11], "along": [3, 4, 9, 10], "One": [3, 10], "target": [3, 10, 11], "In": [3, 6, 7, 8, 9, 10, 11], "case": [3, 6, 7, 9], "do": [3, 4, 6, 7, 9, 10], "need": [3, 6, 9, 10], "work": [3, 9, 10], "necessari": [3, 9], "underli": [3, 10], "through": [3, 6, 10], "access": 3, "anoth": [3, 6, 7, 9, 10], "exampl": [3, 4, 6, 7, 8, 9, 10], "via": [3, 7], "expens": 3, "driver": [3, 4, 6, 10], "softwar": 3, "similarli": 3, "depend": [3, 8, 9, 10], "architectur": [3, 4], "exchang": [3, 10], "imposs": 3, "possibl": [3, 7], "must": [3, 7, 10], "taken": 3, "consider": 3, "On": 3, "logic": 3, "consist": [3, 4, 10], "sub": [3, 10], "singl": [3, 8], "former": 3, "programm": [3, 10], "latter": 3, "standard": [3, 4, 10, 11], "introduc": [3, 10], "usm": [3, 10], "requir": [3, 7, 9, 10], "support": [3, 4, 6, 7, 10, 11], "virtual": 3, "address": 3, "space": 3, "coher": 3, "pointer": 3, "distinct": 3, "thi": [3, 5, 6, 7, 9, 10], "situat": [3, 6, 10], "stream": 3, "read": 3, "onc": 3, "fastest": 3, "crunch": 3, "happen": [3, 6, 10], "both": [3, 10], "sinc": [3, 6, 7], "doe": [3, 6], "manag": [3, 10, 11], "migrat": 3, "explicitli": [3, 6, 10], "slower": 3, "than": [3, 6], "reason": 3, "essenti": [3, 9, 11], "premis": 3, "state": [3, 6], "resid": [3, 6, 10], "tensor": [3, 4, 10, 11], "carri": [3, 10], "input": [3, 6, 10], "argument": [3, 6, 7, 10], "deduc": 3, "pictur": 3, "b": [3, 8], "were": 3, "accord": [3, 10], "paradigm": 3, "c": [3, 5, 7, 8, 11], "associ": [3, 7, 10], "otherwis": 3, "thrown": 3, "usag": [3, 5, 10], "belong": 3, "canon": 3, "per": 3, "normal": 3, "to_devic": 3, "a_new": 3, "altern": [3, 7], "As": [3, 6, 10], "said": 3, "befor": [3, 6, 7, 9], "automat": 3, "implicitli": 3, "alwai": [3, 9], "mani": [3, 6], "them": 3, "profil": [3, 4, 11], "purpos": [3, 7, 10], "control": [3, 4, 5, 11], "extend": [4, 6, 10], "capabl": [4, 6, 10], "beyond": [4, 6, 9, 10], "even": [4, 10], "higher": 4, "gain": 4, "It": [4, 5, 6, 9, 10], "foundat": [4, 10, 11], "packag": [4, 7, 8, 9, 10], "subset": [4, 6], "drop": [4, 6], "replac": [4, 6, 10], "core": [4, 8, 10], "function": [4, 6, 7, 10, 11], "let": [4, 6, 7], "util": [4, 10], "structur": 4, "api": [4, 7, 10, 11], "creation": [4, 6, 10], "defin": [4, 7], "prerequisit": 4, "instal": [4, 6], "modern": [4, 10], "heterogen": [4, 11], "comput": [4, 8, 11], "offload": [4, 10], "unifi": 4, "share": [4, 10], "memori": [4, 6, 10], "copi": [4, 6, 7, 10], "between": [4, 6, 11], "addit": [4, 10], "scalar": [4, 6], "v": 4, "debug": [4, 7, 11], "robust": [4, 11], "tutori": 4, "fallback": [4, 5, 6], "benchmark": 4, "demo": 4, "link": 4, "To": [4, 5, 6, 7, 9], "jupyt": 5, "notebook": 5, "line": [5, 6, 7, 10], "prompt": 5, "server": [5, 10], "termin": 5, "includ": [5, 7, 9], "url": 5, "web": [5, 10], "default": [5, 6, 7, 10], "http": 5, "localhost": 5, "8888": 5, "08": 5, "58": 5, "24": [5, 6], "417": 5, "notebookapp": 5, "serv": 5, "local": [5, 7], "catherin": 5, "activ": [5, 7], "stop": 5, "shut": 5, "down": [5, 11], "twice": 5, "skip": [5, 9], "confirm": 5, "open": 5, "browser": 5, "dashboard": 5, "show": [5, 10], "file": [5, 7, 10], "subdirectori": 5, "wa": 5, "navig": 5, "interest": 5, "make": [6, 10], "minor": 6, "chang": [6, 10], "statement": 6, "we": [6, 7], "seri": 6, "short": 6, "assum": 6, "origin": [6, 10, 11], "written": [6, 10], "noth": 6, "matric": 6, "matrix": 6, "matmul": 6, "prine": 6, "re": [6, 10], "4": [6, 7], "trivial": 6, "modif": 6, "note": [6, 7], "rest": [6, 10], "lik": 6, "regular": [6, 8], "what": [6, 10, 11], "under": 6, "hood": 6, "level_zero": [6, 7, 10], "actual": 6, "obvious": 6, "now": [6, 7, 10], "No": 6, "know": [6, 10, 11], "becaus": [6, 7, 10], "system": [6, 9, 10], "mean": [6, 7, 8, 10], "determin": 6, "oper": [6, 8, 10, 11], "our": 6, "too": [6, 9, 10], "attribut": 6, "sure": 6, "inde": 6, "deivic": 6, "precis": 6, "level": [6, 8, 10, 11], "zero": [6, 7, 10], "want": [6, 7, 9, 10], "reli": [6, 10], "behavior": [6, 7, 10], "so": [6, 7, 10], "keyword": [6, 7, 10], "random": [6, 10], "gener": [6, 10], "arang": 6, "30": 6, "step": [6, 9], "option": [6, 7, 10], "filter": 6, "selector": 6, "string": 6, "proper": 6, "handl": [6, 10], "would": [6, 7], "reduct": [6, 10], "75": 6, "itself": 6, "among": 6, "other": [6, 9, 10], "thing": 6, "verbos": 6, "5": [6, 10], "intel": [6, 8, 9, 11], "r": [6, 10], "hd": 6, "graphic": [6, 9], "meta": 6, "verbocitz": 6, "highest": 6, "version": [6, 9], "vendor": [6, 9, 10, 11], "corpor": 6, "num": 6, "uhd": 6, "620": 6, "31": 6, "101": 6, "2111": 6, "ext_oneapi_level_zero": 6, "queri": [6, 10], "whether": [6, 10], "retriev": 6, "respect": [6, 8, 10], "object": 6, "7": [6, 7, 10], "has_gpu_devic": 6, "f": [6, 7, 10], "len": 6, "print_device_info": 6, "els": [6, 7], "snapshot": 6, "8": [6, 7, 9], "select_gpu_devic": 6, "87253657": 6, "87415047": 6, "61092713": 6, "1395424": 6, "95248436": 6, "Or": 6, "9": [6, 7, 9], "l0_gpu_0": 6, "sycldevic": 6, "cannot": [6, 8, 10], "certain": [6, 7, 10], "float64": [6, 7, 10], "doubl": 6, "amount": [6, 8], "global": 6, "etc": [6, 10], "10": [6, 7, 9, 10], "has_aspect_fp64": 6, "atom": [6, 10], "has_aspect_atomic64": 6, "size": [6, 8], "global_mem_s": 6, "1024": 6, "mb": 6, "cach": 6, "global_mem_cache_s": 6, "kb": 6, "maximum": [6, 10], "unit": 6, "max_compute_unit": 6, "true": 6, "6284": 6, "109375": 6, "512": 6, "class": 6, "still": [7, 10], "develop": [7, 10], "yet": [7, 9], "reach": 7, "product": [7, 8], "qualiti": 7, "particular": 7, "gap": 7, "exist": 7, "workaround": 7, "complet": [7, 9, 10], "comparison": 7, "tabl": 7, "limit": [7, 10], "dtype": [7, 10], "At": [7, 10], "present": [7, 10], "float32": [7, 10], "int32": 7, "int64": 7, "versatili": 7, "hint": [7, 10], "discourag": 7, "signific": [7, 10], "penalti": 7, "enabl": 7, "dpnp_raise_excepion_on_numpy_fallback": 7, "environ": 7, "variabl": 7, "take": [7, 10], "n": [7, 8], "200": 7, "100": 7, "dimenci": 7, "singular": 7, "element": [7, 8], "a_np": 7, "full": 7, "a_dp": 7, "notimplementederror": 7, "traceback": 7, "recent": 7, "call": [7, 8], "last": [7, 8, 10], "cell": 7, "gt": 7, "appdata": 7, "continuum": 7, "miniconda3": 7, "env": 7, "ndpex": 7, "lib": 7, "site": 7, "dpnp_iface_arraycr": 7, "747": 7, "fill_valu": 7, "usm_typ": [7, 10], "sycl_queu": 7, "738": 7, "739": 7, "dpnp_contain": 7, "740": 7, "741": 7, "744": 7, "745": 7, "call_origin": 7, "dpnp_util": 7, "dpnp_algo_util": 7, "pyx": 7, "132": 7, "request": 7, "funtion": 7, "arg": [7, 10], "20000": 7, "none": 7, "39": 7, "kwarg": 7, "isn": 7, "t": 7, "current": 7, "enviro": 7, "without": 7, "rase": 7, "attempt": 7, "unsupport": 7, "full_lik": 7, "time": [7, 8, 10, 11], "elaps": 7, "1000": 7, "2f": 7, "m": 7, "1494": 7, "33": 7, "restart": 7, "o": 7, "config": 7, "__dpnp_raise_excepion_on_numpy_fallback__": 7, "2231": 7, "62": 7, "love": 8, "interact": 8, "But": [8, 9], "deal": 8, "computation": 8, "heavi": 8, "compromis": 8, "commun": [8, 10], "numfocu": 8, "dedic": 8, "attent": 8, "optim": [8, 9, 10], "scienc": 8, "leverag": [8, 10], "concurr": 8, "either": [8, 10], "bigger": [8, 10], "fix": 8, "reduc": 8, "simd": [8, 10], "instruct": [8, 9, 10, 11], "special": [8, 10], "vector": 8, "width": 8, "If": [8, 9, 10], "k": 8, "simultan": 8, "wide": 8, "faster": 8, "cisc": 8, "x86": 8, "independ": 8, "d": 8, "appropri": [9, 10], "fine": 9, "laptop": 9, "integr": [9, 10], "major": [9, 10], "window": 9, "alreadi": [9, 10], "up": 9, "date": 9, "updat": 9, "latest": 9, "compon": 9, "easiest": 9, "distribut": 9, "machin": 9, "learn": [9, 10], "manual": 9, "shown": 9, "next": [9, 10], "section": [9, 10, 11], "conda": 9, "pip": 9, "runtim": 9, "strongli": 9, "advis": 9, "cross": 10, "abstract": 10, "layer": 10, "domain": 10, "primit": 10, "int": 10, "complex": 10, "storag": 10, "contrast": 10, "usm_ndarrai": 10, "ndarrai": 10, "produc": 10, "instead": 10, "math": 10, "bare": 10, "minimum": 10, "discret": 10, "deriv": 10, "routin": 10, "done": 10, "best": 10, "schedul": 10, "those": 10, "exploit": 10, "custom": 10, "By": 10, "dynam": 10, "exit": 10, "assign": 10, "enough": 10, "versatil": 10, "advanc": 10, "paramet": 10, "frequent": 10, "choos": 10, "out": 10, "good": 10, "choic": 10, "portabl": [10, 11], "accompani": 10, "becom": 10, "solut": 10, "scikit": 10, "establish": 10, "path": 10, "algorithm": [10, 11], "reliabl": 10, "project": 10, "back": 10, "forth": 10, "protocol": 10, "dlpack": 10, "Being": 10, "from_dlpack": 10, "view": 10, "oneapi": 10, "toolkit": 10, "tool": 10, "assist": 10, "analyz": [10, 11], "issu": 10, "examin": 10, "variou": 10, "consum": 10, "effici": 10, "impact": 10, "insight": 10, "peak": 10, "bandwidth": 10, "below": 10, "find": 10, "mechan": 10, "hotspot": 10, "analysi": [10, 11], "entir": 10, "identifi": 10, "bound": 10, "proport": 10, "spent": 10, "kei": 10, "goal": 10, "benefit": 10, "focus": 10, "latenc": 10, "regard": 10, "synchron": 10, "barrier": 10, "analys": 10, "collect": 10, "output_dir": 10, "binari": 10, "obtain": 10, "characterist": 10, "unmodifi": 10, "after": 10, "gui": 10, "report": 10, "setup": 10, "post": 10, "guid": 10, "primari": 10, "character": 10, "factor": 10, "roof": 10, "give": 10, "achiev": 10, "condit": 10, "further": 10, "capac": 10, "graph": 10, "rooflin": 10, "dir": 10, "search": 10, "src": 10, "search_dir": 10, "html": 10, "output": 10, "roofline_gpu": 10, "figur": 10, "axi": 10, "arithmet": [10, 11], "intens": 10, "gflop": 10, "horizont": 10, "diagon": 10, "hierarchi": 10, "red": 10, "color": 10, "dot": 10, "correspond": 10, "rel": 10, "especi": 10, "half": 10, "unlik": 10, "tradit": 10, "care": 10, "peculiar": 10, "keep": 10, "finit": 10, "tini": 10, "fraction": 10, "almost": 10, "everi": [10, 11], "induc": 10, "round": 10, "accur": 10, "ieee": [10, 11], "754": [10, 11], "2019": [10, 11], "upper": 10, "ulp": 10, "bit": 10, "mantissa": 10, "16": 10, "tend": 10, "accumul": 10, "slowli": 10, "calcul": 10, "five": 10, "decim": 10, "known": 10, "catastroph": 10, "cancel": 10, "small": 10, "loss": 10, "accuraci": 10, "subtract": 10, "amplifi": 10, "ident": 10, "green": 10, "trail": 10, "inaccur": 10, "due": 10, "remain": 10, "carefulli": 10, "natur": 10, "differenti": 10, "approxim": 10, "df": 10, "dx": 10, "approx": 10, "frac": 10, "delta": 10, "smaller": 10, "greater": 10, "book": [10, 11], "discuss": 10, "varieti": 10, "technic": 10, "articl": 10, "david": [10, 11], "goldberg": [10, 11], "scientist": [10, 11], "should": [10, 11], "easili": 10, "fashion": 10, "constant": 10, "observ": 10, "sign": 10, "mind": 10, "block": 10, "techniqu": 10, "interchang": 11, "vtune": 11, "bottleneck": 11, "leve": 11, "low": 11, "advisor": 11, "advic": 11, "better": 11, "composit": 11, "free": 11, "e": 11, "float": 11, "point": 11, "scientif": 11, "paper": 11, "understand": 11, "conjunct": 11, "entri": 11}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"benchmark": 0, "demo": 1, "exampl": 2, "heterogen": [3, 10], "comput": [3, 6, 10], "devic": [3, 6, 9], "offload": 3, "unifi": 3, "share": 3, "memori": 3, "follow": [3, 6], "data": [3, 4, 6, 8, 9, 10], "copi": 3, "between": [3, 10], "queue": 3, "creat": 3, "addit": 3, "parallel": [4, 6, 8, 9, 10], "extens": [4, 6, 9, 10], "python": [4, 6, 9, 10], "tabl": 4, "content": 4, "tutori": 5, "jupyt": [6, 7], "notebook": [6, 7], "1": [6, 9], "get": 6, "start": 6, "modifi": 6, "cpu": 6, "script": 6, "run": 6, "gpu": 6, "more": 6, "alloc": 6, "advanc": 6, "control": [6, 10], "librari": 6, "dpctl": [6, 10], "2": [7, 9], "fall": 7, "back": 7, "numpi": [7, 10], "modern": 8, "architectur": 8, "prerequisit": 9, "instal": 9, "driver": 9, "interpret": 9, "3": 9, "program": 10, "scalar": 10, "v": 10, "0": 10, "dimension": 10, "arrai": 10, "dpnp": 10, "numba": 10, "dpex": 10, "debug": 10, "profil": 10, "intel": 10, "vtune": 10, "advisor": 10, "todo": [10, 11], "write": 10, "robust": 10, "numer": 10, "code": 10, "sensit": 10, "float": 10, "point": 10, "error": 10, "switch": 10, "singl": 10, "doubl": 10, "precis": 10, "us": 11, "link": 11, "companion": 11, "document": 11, "To": 11, "do": 11}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.intersphinx": 1, "nbsphinx": 4, "sphinx": 57}, "alltitles": {"Benchmarks": [[0, "id1"]], "Demos": [[1, "id1"]], "Examples": [[2, "id1"]], "Heterogeneous Computing": [[3, "id1"]], "Device Offload": [[3, "device-offload"]], "Unified Shared Memory": [[3, "unified-shared-memory"]], "Compute-Follows-Data": [[3, "compute-follows-data"]], "Copying Data Between Devices and Queues": [[3, "copying-data-between-devices-and-queues"]], "Creating Additional Queues": [[3, "creating-additional-queues"]], "Data Parallel Extensions for Python": [[4, "data-parallel-extensions-for-python"]], "Table of Contents": [[4, "table-of-contents"]], "Tutorials": [[5, "tutorials"]], "Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python": [[6, "Jupyter-Notebook-1:-Getting-started-with-Data-Parallel-Extensions-for-Python"]], "Modifying CPU script to run on GPU": [[6, "Modifying-CPU-script-to-run-on-GPU"]], "More on data allocation and the Compute-Follows-Data": [[6, "More-on-data-allocation-and-the-Compute-Follows-Data"]], "Advanced data and device control with Data Parallel Control library dpctl": [[6, "Advanced-data-and-device-control-with-Data-Parallel-Control-library-dpctl"]], "Jupyter Notebook 2: Falling back to NumPy": [[7, "Jupyter-Notebook-2:-Falling-back-to-NumPy"]], "Parallelism in Modern Data-Parallel Architectures": [[8, "parallelism-in-modern-data-parallel-architectures"]], "Prerequisites and Installation": [[9, "id1"]], "1. Device Drivers": [[9, "device-drivers"]], "2. Python Interpreter": [[9, "python-interpreter"]], "3. Data Parallel Extensions for Python": [[9, "data-parallel-extensions-for-python"]], "Programming with Data Parallel Extensions for Python": [[10, "programming-with-data-parallel-extensions-for-python"]], "Scalars vs. 0-Dimensional Arrays": [[10, "scalars-vs-0-dimensional-arrays"]], "Data Parallel Extension for Numpy - dpnp": [[10, "data-parallel-extension-for-numpy-dpnp"]], "Data Parallel Extension for Numba - numba-dpex": [[10, "data-parallel-extension-for-numba-numba-dpex"]], "Data Parallel Control - dpctl": [[10, "data-parallel-control-dpctl"]], "Debugging and Profiling Data Parallel Extensions for Python": [[10, "debugging-and-profiling-data-parallel-extensions-for-python"]], "Profiling with Intel VTune Profiler": [[10, "profiling-with-intel-vtune-profiler"]], "Profiling with Intel Advisor": [[10, "profiling-with-intel-advisor"]], "Todo": [[10, "id1"], [11, null]], "Writing Robust Numerical Codes for Heterogeneous Computing": [[10, "writing-robust-numerical-codes-for-heterogeneous-computing"]], "Sensitivity to Floating-Point Errors": [[10, "sensitivity-to-floating-point-errors"]], "Switching Between Single and Double Precision": [[10, "switching-between-single-and-double-precision"]], "Useful links": [[11, "id1"]], "Companion documentation": [[11, "id2"]], "To-Do": [[11, "to-do"]]}, "indexentries": {}})
\ No newline at end of file
diff --git a/pull/44/useful_links.html b/pull/44/useful_links.html
new file mode 100644
index 0000000..bbb1c53
--- /dev/null
+++ b/pull/44/useful_links.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Useful links &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="prev" title="Demos" href="demos.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="demos.html" title="Demos">
+	  &laquo; previous
+	</a>
+	
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Useful links</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="useful-links"></span><section id="id1">
+<h1>Useful links<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<table class="docutils align-default" id="id2">
+<caption><span class="caption-text"><strong>Companion documentation</strong></span><a class="headerlink" href="#id2" title="Permalink to this table">¶</a></caption>
+<colgroup>
+<col style="width: 25.9%" />
+<col style="width: 74.1%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head"><p>Document</p></th>
+<th class="head"><p>Description</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p><a class="reference external" href="https://intelpython.github.io/dpnp/">Data Parallel Extension for Numpy*</a></p></td>
+<td><p>Documentation for programming NumPy-like codes on data-parallel devices</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a></p></td>
+<td><p>Documentation for programming Numba codes on data-parallel devices as you program Numba on CPU</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://intelpython.github.io/dpctl/latest/index.html">Data Parallel Control</a></p></td>
+<td><p>Documentation how to manage data and devices, how to interchange data between different tensor implementations,
+and how to write data parallel extensions</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html">Intel VTune Profiler</a></p></td>
+<td><p>Performance profiler supporting analysis of bottlenecks from function leve down to low level instructions.
+Supports Python and Numba</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/advisor.html">Intel Advisor</a></p></td>
+<td><p>Analyzes native and Python codes and provides the advice for better composition of heterogeneous algorithms</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a></p></td>
+<td><p>Standard for writing portable Numpy-like codes targeting different hardware vendors and frameworks
+operating with tensor data</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a></p></td>
+<td><p>Standard for writing C++-like codes for heterogeneous computing</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://www.apress.com/gp/book/9781484255735">DPC++</a></p></td>
+<td><p>Free e-book on how to program data-parallel devices using Data Parallel C++</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.khronos.org/opencl/">OpenCl*</a></p></td>
+<td><p>OpenCl* Standard for heterogeneous programming</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://standards.ieee.org/ieee/754/6210/">IEEE 754-2019 Standard for Floating-Point Arithmetic</a></p></td>
+<td><p>Standard for floating-point arithmetic, essential for writing robust numerical codes</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.itu.dk/~sestoft/bachelor/IEEE754_article.pdf&gt;">David Goldberg, What every computer scientist should know about floating-point arithmetic</a></p></td>
+<td><p>Scientific paper. Important for understanding how to write robust numerical code</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://numpy.org/">Numpy*</a></p></td>
+<td><p>Documentation for Numpy - foundational CPU library for array programming. Used in conjunction with
+<a class="reference external" href="https://intelpython.github.io/dpnp/">Data Parallel Extension for Numpy*</a>.</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://numba.pydata.org/">Numba*</a></p></td>
+<td><p>Documentation for Numba - Just-In-Time compiler for Numpy-like codes. Used in conjunction with
+<a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a>.</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="to-do">
+<h1>To-Do<a class="headerlink" href="#to-do" title="Permalink to this heading">¶</a></h1>
+<div class="admonition-todo admonition">
+<p class="admonition-title">Todo</p>
+<p>Document debugging section</p>
+</div>
+<p class="todo-source"><a class="reference internal" href="programming_dpep.html#id1"><em>original entry</em></a></p>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="demos.html"
+                          title="previous chapter">Demos</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/.buildinfo b/pull/45/.buildinfo
new file mode 100644
index 0000000..b00e2c1
--- /dev/null
+++ b/pull/45/.buildinfo
@@ -0,0 +1,4 @@
+# Sphinx build info version 1
+# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
+config: f6559a5f534fe3fb7c807cfbb435275b
+tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/demos/mandelbrot/mandelbrot_demo/tests/__init__.py b/pull/45/.nojekyll
similarity index 100%
rename from demos/mandelbrot/mandelbrot_demo/tests/__init__.py
rename to pull/45/.nojekyll
diff --git a/pull/45/_images/DPEP-large.png b/pull/45/_images/DPEP-large.png
new file mode 100644
index 0000000..0ccbb3d
Binary files /dev/null and b/pull/45/_images/DPEP-large.png differ
diff --git a/pull/45/_images/advisor_roofline_gen9.png b/pull/45/_images/advisor_roofline_gen9.png
new file mode 100644
index 0000000..93dfa6c
Binary files /dev/null and b/pull/45/_images/advisor_roofline_gen9.png differ
diff --git a/pull/45/_images/dpep-all.png b/pull/45/_images/dpep-all.png
new file mode 100644
index 0000000..ffa6a96
Binary files /dev/null and b/pull/45/_images/dpep-all.png differ
diff --git a/pull/45/_images/dpep-cores.png b/pull/45/_images/dpep-cores.png
new file mode 100644
index 0000000..4debbcb
Binary files /dev/null and b/pull/45/_images/dpep-cores.png differ
diff --git a/pull/45/_images/dpep-ilp.png b/pull/45/_images/dpep-ilp.png
new file mode 100644
index 0000000..ddf8725
Binary files /dev/null and b/pull/45/_images/dpep-ilp.png differ
diff --git a/pull/45/_images/dpep-simd.png b/pull/45/_images/dpep-simd.png
new file mode 100644
index 0000000..8f2e078
Binary files /dev/null and b/pull/45/_images/dpep-simd.png differ
diff --git a/pull/45/_images/fp-cancellation.png b/pull/45/_images/fp-cancellation.png
new file mode 100644
index 0000000..6163146
Binary files /dev/null and b/pull/45/_images/fp-cancellation.png differ
diff --git a/pull/45/_images/hetero-devices.png b/pull/45/_images/hetero-devices.png
new file mode 100644
index 0000000..4d9e491
Binary files /dev/null and b/pull/45/_images/hetero-devices.png differ
diff --git a/pull/45/_images/kernel-queue-device.png b/pull/45/_images/kernel-queue-device.png
new file mode 100644
index 0000000..15482f5
Binary files /dev/null and b/pull/45/_images/kernel-queue-device.png differ
diff --git a/pull/45/_images/notebooks_03-mandelbrot_perfomance_11_1.png b/pull/45/_images/notebooks_03-mandelbrot_perfomance_11_1.png
new file mode 100644
index 0000000..89f36bd
Binary files /dev/null and b/pull/45/_images/notebooks_03-mandelbrot_perfomance_11_1.png differ
diff --git a/pull/45/_images/notebooks_03-mandelbrot_perfomance_13_1.png b/pull/45/_images/notebooks_03-mandelbrot_perfomance_13_1.png
new file mode 100644
index 0000000..89f36bd
Binary files /dev/null and b/pull/45/_images/notebooks_03-mandelbrot_perfomance_13_1.png differ
diff --git a/pull/45/_images/notebooks_03-mandelbrot_perfomance_16_1.png b/pull/45/_images/notebooks_03-mandelbrot_perfomance_16_1.png
new file mode 100644
index 0000000..f802cea
Binary files /dev/null and b/pull/45/_images/notebooks_03-mandelbrot_perfomance_16_1.png differ
diff --git a/pull/45/_images/notebooks_03-mandelbrot_perfomance_5_1.png b/pull/45/_images/notebooks_03-mandelbrot_perfomance_5_1.png
new file mode 100644
index 0000000..2978b31
Binary files /dev/null and b/pull/45/_images/notebooks_03-mandelbrot_perfomance_5_1.png differ
diff --git a/pull/45/_images/notebooks_03-mandelbrot_perfomance_9_1.png b/pull/45/_images/notebooks_03-mandelbrot_perfomance_9_1.png
new file mode 100644
index 0000000..89f36bd
Binary files /dev/null and b/pull/45/_images/notebooks_03-mandelbrot_perfomance_9_1.png differ
diff --git a/pull/45/_images/queue-exception1.png b/pull/45/_images/queue-exception1.png
new file mode 100644
index 0000000..b707ab9
Binary files /dev/null and b/pull/45/_images/queue-exception1.png differ
diff --git a/pull/45/_images/queue-exception2.png b/pull/45/_images/queue-exception2.png
new file mode 100644
index 0000000..003b06b
Binary files /dev/null and b/pull/45/_images/queue-exception2.png differ
diff --git a/pull/45/_images/queue-exception3.png b/pull/45/_images/queue-exception3.png
new file mode 100644
index 0000000..630cd12
Binary files /dev/null and b/pull/45/_images/queue-exception3.png differ
diff --git a/pull/45/_sources/benchmarks.rst.txt b/pull/45/_sources/benchmarks.rst.txt
new file mode 100644
index 0000000..4942f25
--- /dev/null
+++ b/pull/45/_sources/benchmarks.rst.txt
@@ -0,0 +1,40 @@
+.. _benchmarks:
+.. include:: ./ext_links.txt
+
+Benchmarks
+==========
+
+**Data Parallel Extensions for Python** provide a set of
+`benchmarks <https://github.com/IntelPython/dpbench>`_ illustrating different aspects of
+implementing the performant code with Data Parallel Extensions for Python.
+Benchmarks represent some real life numerical problem or some important part (kernel) of real life application.
+Each application/kernel is implemented in several variants (not necessarily all variants):
+
+- Pure Python: Typically the slowest and used just as a reference implementation
+
+- ``numpy``: Same application/kernel implemented using NumPy library
+
+- ``dpnp``: Modified numpy implementation to run on a specific device. You can use numpy as a baseline while evaluating the dpnp implementation and its performance
+
+- ``numba @njit`` array-style: application/kernel implemented using NumPy and compiled with Numba. You can use numpy as a baseline when evaluate numba @njit array-style implementat and its performance
+
+- ``numba @njit`` direct loops (prange): Same application/kernel implemented using Numba compiler using direct loops. Sometimes array-style programming is cumbersome and performance inefficient. Using direct loop programming may lead to more readable and performance code. Thus, while evaluating the performance of direct loop implementation it is useful to compare array-style Numba implementation as a baseline
+
+- ``numba-dpex @dpjit`` array-style: Modified numba @njit array-style implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing numba-dpex implementation details and performance. You can also compare it against dpnp implementation to see how much extra performance numba-dpex can bring when you compile NumPy code for a given device
+
+- ``numba-dpex @dpjit`` direct loops (prange): Modified numba @njit direct loop implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing numba-dpex implementation details and performance. You can also compare it against dpnp implementation to see how much extra performance numba-dpex can bring when you compile NumPy code for a given device
+
+- ``numba-dpex @dpjit`` kernel: Kernel-style programming, which is close to @cuda.jit programming model used in vanilla Numba
+
+- ``numba-mlir``: Array-style, direct loops and kernel-style implementations for experimental MLIR-based backend for Numba
+
+- ``cupy``: NumPy-like implementation using CuPy to run on CUDA-compatible devices
+
+- ``@cuda.jit``: Kernel-style Numba implementation to run on CUDA-compatible devices
+
+- Native SYCL: Most applications/kernels also have DPC++ implementation, which can be used to compare performance of above implementations to DPC++ compiled code.
+
+These benchmarks are implemented in ``dpbench`` framework, which allows you to run all or select benchmarks and variants to evaluate their performance on different hardware.
+
+For more details please refer to ``dpbench``
+`documentation <https://github.com/IntelPython/dpbench/blob/main/README.md>`_.
diff --git a/pull/45/_sources/demos.rst.txt b/pull/45/_sources/demos.rst.txt
new file mode 100644
index 0000000..452d097
--- /dev/null
+++ b/pull/45/_sources/demos.rst.txt
@@ -0,0 +1,19 @@
+.. _demos:
+.. include:: ./ext_links.txt
+
+Demos
+=====
+
+There are several demo applications illustrating the power of the **Data Parallel Extensions for Python**. They are:
+
+- `Monte Carlo Pi <https://github.com/IntelPython/DPEP/tree/main/demos/mcpi>`_
+  The Monte Carlo method to estimate the value of :math:`\pi`.
+
+- `Mandelbrot Set <https://github.com/IntelPython/DPEP/tree/main/demos/mandelbrot>`_
+  Visualization of the breathtaking process of diving in the famous Mandelbrot fractal
+
+- `Game of Life <https://github.com/IntelPython/DPEP/tree/main/demos/game-of-life>`_
+  Visualization of the life evolution using famous Conway's model
+
+All demos are located in the `GitHub repository <https://github.com/IntelPython/DPEP/tree/main/demos>`_.
+For more details please refer to the documentation located in the individual demo directory.
diff --git a/pull/45/_sources/examples.rst.txt b/pull/45/_sources/examples.rst.txt
new file mode 100644
index 0000000..ab28d17
--- /dev/null
+++ b/pull/45/_sources/examples.rst.txt
@@ -0,0 +1,41 @@
+.. _examples:
+.. include:: ./ext_links.txt
+
+Examples
+========
+All examples are located in the `GitHub repository <https://github.com/IntelPython/DPEP/tree/main/examples>`_.
+Their names start with the 2-digit number followed by a descriptive name.
+You can run examples in any order, however, if
+you are new to the Data Parallel Extensions for Python, it is recommended to go in the order examples are enumerated.
+
+The following command will run the very first example of using Data Parallel Extensions for Python
+
+.. code-block:: console
+
+    python ./examples/01-hello_dpnp.py
+
+These are listings of these examples:
+
+.. literalinclude:: ../../examples/01-hello_dpnp.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 01:** Your first NumPy code running on GPU
+   :name: examples_01_hello_dpnp
+
+.. literalinclude:: ../../examples/02-dpnp_device.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 02:** Select device type while creating array
+   :name: examples_02_dpnp_device
+
+.. literalinclude:: ../../examples/03-dpnp2numba-dpex.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 03:** Compile dpnp code with numba-dpex
+   :name: examples_03_dpnp2numba_dpex
+
+.. literalinclude:: ../../examples/04-dpctl_device_query.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 04:** Get information about devices
+   :name: examples_04_dpctl_device_query
diff --git a/pull/45/_sources/heterogeneous_computing.rst.txt b/pull/45/_sources/heterogeneous_computing.rst.txt
new file mode 100644
index 0000000..afe5890
--- /dev/null
+++ b/pull/45/_sources/heterogeneous_computing.rst.txt
@@ -0,0 +1,148 @@
+.. _heterogeneous_computing:
+.. include:: ./ext_links.txt
+
+Heterogeneous Computing
+=======================
+
+Device Offload
+**************
+
+Python is an interpreted language, which implies that most of the Python script will run on CPU,
+and only a few data parallel regions will execute on data parallel devices.
+That is why the concept of the host and offload devices is helpful when it comes to conceptualizing
+a heterogeneous programming model in Python.
+
+.. image:: ./_images/hetero-devices.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+The above diagram illustrates the *host* (the CPU which runs Python interpreter) and three *devices*
+(two GPU devices and one attached accelerator device). **Data Parallel Extensions for Python**
+offer a programming model where a script executed by Python interpreter on the host can *offload* data-parallel
+kernels to a user-specified device. A *kernel* is the *data-parallel region* of a program submitted
+for execution on the device. There can be multiple data-parallel regions, and hence multiple *offload kernels*.
+
+Kernels can be pre-compiled into a library, such as ``dpnp``, or directly coded
+in a programming language for heterogeneous computing, such as `OpenCl*`_ or `DPC++`_ .
+**Data Parallel Extensions for Python** offer the way of writing kernels directly in Python
+using `Numba*`_ compiler along with ``numba-dpex``, the `Data Parallel Extension for Numba*`_.
+
+One or more kernels are submitted for execution into a *queue* targeting an *offload device*.
+For each device, you can create one or more queues. In most cases, you do not need to work
+with device queues directly. Data Parallel Extensions for Python will do necessary underlying
+work with queues for you through the :ref:`Compute-Follows-Data`.
+
+Unified Shared Memory
+*********************
+
+Each device has its memory, not necessarily accessible from another device.
+
+.. image:: ./_images/hetero-devices.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+For example, **Device 1** memory may not be directly accessible from the host but accessible
+via expensive copying by a driver software. Similarly, depending on the architecture, direct data
+exchange between **Device 2** and **Device 1** may be only impossible possible via expensive
+copying through the host memory. These aspects must be taken into consideration when programming
+data parallel devices.
+
+On the illustration above the **Device 2** logically consists of two sub-devices: **Sub-Device 1**
+and **Sub-Device 2**. The programming model allows accessing **Device 2** as a single logical device, or
+by working with each individual sub-devices. For the former case a programmer needs to create
+a queue for **Device 2**. For the latter case a programmer needs to create 2 queues, one for each sub-device.
+
+`SYCL*`_ standard introduces a concept of the *Unified Shared Memory* (USM). USM requires hardware support
+for unified virtual address space, which allows coherency between the host and the device
+pointers. The host allocates all memory, but offers three distinct allocation types:
+
+* **Host: located on the host, accessible by the host or device.** This type of memory is useful in a situation
+  when you need to stream read-only data from the host to the device once.
+
+* **Device: located on the device, accessible by device only.** The fastest type of memory.
+  Useful in a situation when most of the data crunching happens on the device.
+
+* **Shared: location is both host and device, accessible by the host and device**.
+  Shared allocations are useful when both host and device access data,
+  since a user does not need to manage data migration explicitly.
+  However, it is much slower than the USM Device memory type.
+
+Compute-Follows-Data
+********************
+Since data copying between devices is typically very expensive, for performance reasons it is essential
+to process data close to where it is allocated. This is the premise of the *Compute-Follows-Data* programming model,
+which states that the compute happens where the data resides. Tensors implemented in ``dpctl`` and ``dpnp``
+carry information about allocation queues, and hence, about the device on which an array is allocated.
+Based on tensor input arguments of the offload kernel, it deduces the queue on which the execution happens.
+
+.. image:: ./_images/kernel-queue-device.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+The picture above illustrates the *Compute-Follows-Data* concept. Arrays ``A`` and ``B`` are inputs to the
+**Offload Kernel**. These arrays carry information about their *allocation queue* (**Device Queue**) and the
+*device* (**Device 1**) where they were created. According to the Compute-Follows-Data paradigm
+the **Offload Kernel** will be submitted to this **Device Queue**, and the resulting array ``C`` will
+be created on the **Device Queue** associated with the **Device 1**.
+
+**Data Parallel Extensions for Python** require all input tensor arguments to have the **same** allocation queue.
+Otherwise, an exception is thrown. For example, the following usages will result in an exception.
+
+.. figure:: ./_images/queue-exception1.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+    Input tensors are on different devices and different queues. Exception is thrown.
+
+.. figure:: ./_images/queue-exception2.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+    Input tensors are on the same device, but queues are different. Exception is thrown.
+
+.. figure:: ./_images/queue-exception3.png
+    :width: 600px
+    :align: center
+    :alt: SIMD
+
+    Data belongs to the same device, but queues are different and associated with different sub-devices.
+
+Copying Data Between Devices and Queues
+***************************************
+
+**Data Parallel Extensions for Python** create **one** *canonical queue* per device. Normally,
+you do not need to directly manage queues. Having one canonical queue per device
+allows you to copy data between devices using the ``to_device()`` method:
+
+.. code-block:: python
+
+   a_new = a.to_device(b.device)
+
+Array ``a`` is copied to the device associated with array ``b`` into the new array ``a_new``.
+The same queue is associated with ``b`` and ``a_new``.
+
+Alternatively, you can do this as follows:
+
+.. code-block:: python
+    :caption: DPNP array
+
+    a_new = dpnp.asarray(a, device=b.device)
+
+.. code-block:: python
+    :caption: DPCtl array
+
+    a_new = dpctl.tensor.asarray(a, device=b.device)
+
+Creating Additional Queues
+**************************
+
+As said before, **Data Parallel Extensions for Python** automatically creates one canonical queue per device,
+and you normally work with this queue implicitly. However, you can always create as many additional queues per device
+as needed and work explicitly with them, for example, for profiling purposes.
+
+Read `Data Parallel Control`_ documentation for more details about queues.
diff --git a/pull/45/_sources/index.rst.txt b/pull/45/_sources/index.rst.txt
new file mode 100644
index 0000000..49fdf23
--- /dev/null
+++ b/pull/45/_sources/index.rst.txt
@@ -0,0 +1,36 @@
+.. _index:
+.. include:: ./ext_links.txt
+
+.. image:: ./_images/DPEP-large.png
+    :width: 400px
+    :align: center
+    :alt: Data Parallel Extensions for Python
+
+Data Parallel Extensions for Python
+===================================
+
+Data Parallel Extensions for Python* extend numerical Python capabilities beyond CPU and allow even higher performance
+gains on data parallel devices, such as GPUs. It consists of three foundational packages:
+
+* **dpnp** - Data Parallel Extensions for `Numpy*`_ - a library that implements a subset of
+  Numpy that can be executed on any data parallel device. The subset is a drop-in replacement
+  of core Numpy functions and numerical data types.
+* **numba_dpex** - Data Parallel Extensions for `Numba*`_ - an extension for Numba compiler
+  that lets you program data-parallel devices as you program CPU with Numba.
+* **dpctl - Data Parallel Control library** that provides utilities for device selection,
+  allocation of data on devices, tensor data structure along with `Python* Array API Standard`_ implementation, and support for creation of user-defined data-parallel extensions.
+
+Table of Contents
+*****************
+.. toctree::
+    :maxdepth: 2
+
+    prerequisites_and_installation
+    parallelism
+    heterogeneous_computing
+    programming_dpep
+    examples
+    jupyter_notebook
+    benchmarks
+    demos
+    useful_links
diff --git a/pull/45/_sources/jupyter_notebook.rst.txt b/pull/45/_sources/jupyter_notebook.rst.txt
new file mode 100644
index 0000000..882cc7d
--- /dev/null
+++ b/pull/45/_sources/jupyter_notebook.rst.txt
@@ -0,0 +1,41 @@
+.. _jupyter_notebook:
+.. include:: ./ext_links.txt
+
+Tutorials
+*********
+
+Getting started Jupyter* Notebooks illustrating the usage of **Data Parallel Extensions for Python** are located
+in the `GitHub repository <https://github.com/IntelPython/DPEP/tree/main/notebooks>`_
+
+To run the tutorial, in the command line prompt type:
+
+.. code-block:: console
+
+    jupyter notebook
+
+This will print some information about the notebook server in your terminal, including the URL of
+the web application (by default, ``http://localhost:8888``):
+
+
+.. code-block:: console
+
+    $ jupyter notebook
+    [I 08:58:24.417 NotebookApp] Serving notebooks from local directory: /Users/catherine
+    [I 08:58:24.417 NotebookApp] 0 active kernels
+    [I 08:58:24.417 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/
+    [I 08:58:24.417 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
+    It will then open your default web browser to this URL.
+
+When the notebook opens in your browser, you will see the Notebook Dashboard,
+which will show a list of the notebooks, files, and subdirectories
+in the directory where the notebook server was started.
+Navigate to the notebook of your interest and open it in the dashboard.
+
+For more information please refer to `Jupyter documentation <https://docs.jupyter.org/en/latest/running.html>`_
+
+.. toctree::
+   :maxdepth: 1
+
+   Getting Started <notebooks/01-get_started.ipynb>
+   Controlling `dpnp` fallback to `numpy` <notebooks/02-dpnp_numpy_fallback.ipynb>
+   Examples with performance using Mandelbrot calculation <notebooks/03-mandelbrot_perfomance.ipynb>
diff --git a/pull/45/_sources/notebooks/01-get_started.ipynb.txt b/pull/45/_sources/notebooks/01-get_started.ipynb.txt
new file mode 100644
index 0000000..e0a970a
--- /dev/null
+++ b/pull/45/_sources/notebooks/01-get_started.ipynb.txt
@@ -0,0 +1,490 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "a002ea61",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "# Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python\n",
+    "<img src=\"https://intelpython.github.io/DPEP/main/_images/DPEP-large.png\" width=\"300\"/>\n",
+    "\n",
+    "[Data Parallel Extensions for Python](https://intelpython.github.io/DPEP/main/) allow you to run NumPy-like code beyond CPU using **Data Parallel Extension for NumPy**. It will also allow you to compile the code using **Data Parallel Extension for Numba**. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0565bf88-a3e9-4ee3-a815-3efe977c2a8f",
+   "metadata": {
+    "jp-MarkdownHeadingCollapsed": true,
+    "tags": []
+   },
+   "source": [
+    "## Modifying CPU script to run on GPU\n",
+    "\n",
+    "In many cases the process of running Python on GPU is about making minor changes to your CPU script, which are:\n",
+    "1. Changing import statement(s)\n",
+    "2. Specifying on which device(s) the data is allocated\n",
+    "3. Explicitly copying data between devices and the host as needed\n",
+    "\n",
+    "We will illustrate these concepts on series of short examples. Let's assume we have the following NumPy script originally written to run on CPU, which is nothing more than creating two matrices `x` and `y` and performing matrix-matrix multiplication with `numpy.matmul()`, and prining the resulting matrix:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "d9e8711d",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[2 2]\n",
+      " [2 2]]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# CPU script for matrix-matrix multiplication using NumPy\n",
+    "\n",
+    "# 1. Import numpy\n",
+    "import numpy as np\n",
+    "\n",
+    "# 2. Create two matrices\n",
+    "x = np.array([[1, 1], [1, 1]])\n",
+    "y = np.array([[1, 1], [1, 1]])\n",
+    "\n",
+    "# 3. Perform matrix-matrix multiplication\n",
+    "res = np.matmul(x, y)\n",
+    "\n",
+    "# 4. Print resulting matrix\n",
+    "print(res)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "402c3d61",
+   "metadata": {},
+   "source": [
+    "As stated before in many cases to run the same code on GPU is a trivial modification of a few lines of the code, like this:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "c10b7d83",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[2 2]\n",
+      " [2 2]]\n",
+      "Array x is allocated on the device: Device(level_zero:gpu:0)\n",
+      "Array y is allocated on the device: Device(level_zero:gpu:0)\n",
+      "res is allocated on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Modified script to run the same code on GPU using dpnp\n",
+    "\n",
+    "# 1. Import dpnp\n",
+    "import dpnp as np  # Note, we changed the import statement. Since dpnp is a drop-in replacement of numpy the rest of the code will run lik regular numpy\n",
+    "\n",
+    "# 2. Create two matrices\n",
+    "x = np.array([[1, 1], [1, 1]])\n",
+    "y = np.array([[1, 1], [1, 1]])\n",
+    "\n",
+    "# 3. Perform matrix-matrix multiplication\n",
+    "res = np.matmul(x, y)\n",
+    "\n",
+    "# 4. Print what's going on under the hood\n",
+    "print(res)\n",
+    "print(\"Array x is allocated on the device:\", x.device)\n",
+    "print(\"Array y is allocated on the device:\", y.device)\n",
+    "print(\"res is allocated on the device:\", res.device)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d6a58f17",
+   "metadata": {},
+   "source": [
+    "Let's see what we actually changed.\n",
+    "\n",
+    "1. Obviously we changed the import statement. Now we import `dpnp`, which is a drop-in replacement for a subset of `numpy` that extends numpy-like codes beyond CPU\n",
+    "2. No change in matrix creation code. How does `dpnp` know that matrices `x` and `y` need to be allocated on GPU? This is because, if we do not specify the device explicitly, the driver will use the default device, which is GPU on systems with installed GPU drivers.\n",
+    "3. No change in matrix multiplication code. This is because `dpnp` programming model is the Compute-Follows-Data. It means that `dpnp.matmul()` determines which device will execute an operation based on where array inputs are allocated. Since our inputs `x` and `y` are allocated on the default device (GPU) the matrix-matrix multiplication will follow data allocation and execute on GPU too.\n",
+    "4. Note, arrays `x`, `y`, `res` all have the `device` attribute by printing which we make sure that all inputs are indeed on the GPU device, and the result is also on the GPU deivice. To be precise the data allocation (and execution) happened on GPU device 0 through Level-Zero driver."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "be340585",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "## More on data allocation and the Compute-Follows-Data\n",
+    "\n",
+    "Sometimes you may want to be specific about the device type, not relying on the default behavior. You can do so by specifying the device in a keyword arguments for `dpnp` array creation functions and random number generators."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "0435d7f0",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import dpnp as np\n",
+    "\n",
+    "a = np.arange(3, 30, step = 6, device=\"gpu\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a6765095",
+   "metadata": {},
+   "source": [
+    "`dpnp.arange()` is the array creation function that has optional keyword argument `device`, using which you can specify the device you want data to be allocated on with filter selector string. In our case the string specifies device type `\"gpu\"`. The proper way of handling situations when the specified device is not available would be as follows:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "e613398f",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "The a is allocated on the device: Device(level_zero:gpu:0)\n",
+      "Reduction sum y:  75\n",
+      "Result y is located on the device: Device(level_zero:gpu:0)\n",
+      "y.shape= ()\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpnp as np\n",
+    "\n",
+    "try:\n",
+    "    a = np.arange(3, 30, step = 6, device=\"gpu\")\n",
+    "    print(\"The a is allocated on the device:\", a.device)\n",
+    "except:\n",
+    "    print(\"GPU device is not available\")\n",
+    "    # Do some fallback code\n",
+    "\n",
+    "# Do reduction on the selected device\n",
+    "y = np.sum(a)\n",
+    "\n",
+    "print(\"Reduction sum y: \", y)  # Expect 75\n",
+    "print(\"Result y is located on the device:\", y.device)\n",
+    "print(\"y.shape=\", y.shape)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "88b4915e",
+   "metadata": {},
+   "source": [
+    "Note that `y` is itself a device array (not a scalar!), its data resides on the same device as input array `a`."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "94cb3b9b",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "### Advanced data and device control with Data Parallel Control library `dpctl`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9fb4b1b5",
+   "metadata": {},
+   "source": [
+    "Data Parallel Control library, `dpctl`, among other things provide advanced capabilities for controling devices and data. Among its useful functions is `dpctl.lsplatform(verbosity)`, printing information about the list of available devices on the system with different levels of verbosity:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "b890ae71",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Intel(R) OpenCL HD Graphics OpenCL 3.0 \n",
+      "Intel(R) Level-Zero 1.3\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "dpctl.lsplatform()  # Print platform information"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "db5e8db4",
+   "metadata": {},
+   "source": [
+    "Using a different verbosity setting to print extra meta-data:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "ffcf0cfb",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Platform  0 ::\n",
+      "    Name        Intel(R) OpenCL HD Graphics\n",
+      "    Version     OpenCL 3.0 \n",
+      "    Vendor      Intel(R) Corporation\n",
+      "    Backend     opencl\n",
+      "    Num Devices 1\n",
+      "      # 0\n",
+      "        Name                Intel(R) UHD Graphics 620\n",
+      "        Version             31.0.101.2111\n",
+      "        Filter string       opencl:gpu:0\n",
+      "Platform  1 ::\n",
+      "    Name        Intel(R) Level-Zero\n",
+      "    Version     1.3\n",
+      "    Vendor      Intel(R) Corporation\n",
+      "    Backend     ext_oneapi_level_zero\n",
+      "    Num Devices 1\n",
+      "      # 0\n",
+      "        Name                Intel(R) UHD Graphics 620\n",
+      "        Version             1.3.0\n",
+      "        Filter string       level_zero:gpu:0\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "dpctl.lsplatform(2)  # Print platform information with verbocitz level 2 (highest level)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f63525d3",
+   "metadata": {},
+   "source": [
+    "You can also query whether system has GPU devices and retrieve respective device objects:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "84ff47e9",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "This system has 2 GPUs\n",
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  31.0.101.2111\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   opencl:gpu:0\n",
+      "\n",
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Array x is on the device: Device(opencl:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "import dpnp as np\n",
+    "\n",
+    "if dpctl.has_gpu_devices():\n",
+    "    devices = dpctl.get_devices(device_type='gpu')\n",
+    "    print(f\"This system has {len(devices)} GPUs\")\n",
+    "    for device in devices:\n",
+    "        device.print_device_info()\n",
+    "        \n",
+    "    x = np.array([1, 2, 3], device=devices[0])  # Another way of selecting on which device to allocate the data\n",
+    "    print(\"Array x is on the device:\", x.device)\n",
+    "else:\n",
+    "    print(\"GPU devices are not available on this system\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e0918733-0992-41e8-bfa5-228a080bc165",
+   "metadata": {},
+   "source": [
+    "The following snapshot illustrates how to select the default GPU device using `dpctl` and generate an array of random numbers on this device:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "1c068447",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Array x: [0.87253657 0.87415047 0.61092713 0.1395424  0.95248436]\n",
+      "Array x.device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "try:\n",
+    "    gpu = dpctl.select_gpu_device()\n",
+    "    gpu.print_device_info() # print GPU device information\n",
+    "    x = np.random.random(5, device=gpu)  # Create array of random numbers on the default GPU device\n",
+    "    print(\"Array x:\", x)\n",
+    "    print(\"Array x.device:\", x.device)\n",
+    "except:\n",
+    "    print (\"No GPU devices available\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c378b79d",
+   "metadata": {},
+   "source": [
+    "Or by creating GPU device object from the filter selector string:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "ad83abb5",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "try:\n",
+    "    l0_gpu_0 = dpctl.SyclDevice(\"level_zero:gpu:0\")\n",
+    "    l0_gpu_0.print_device_info()\n",
+    "except:\n",
+    "    print(\"Cannot create the device object from a given filter selector string\")    "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "eadefe0b",
+   "metadata": {},
+   "source": [
+    "The following snapshot checks whether a given device supports certain aspects, which may be important for the application, such as support for float64 (double precision) or the amount of available global memory on the device, etc."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "a94756d7",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Has double precision: True\n",
+      "Has atomic operations support: True\n",
+      "Global memory size: 6284.109375 MB\n",
+      "Global memory cache size: 512.0 KB\n",
+      "Maximum compute units: 24\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "try:\n",
+    "    gpu = dpctl.select_gpu_device()\n",
+    "    gpu.print_device_info()\n",
+    "    print(\"Has double precision:\", gpu.has_aspect_fp64)\n",
+    "    print(\"Has atomic operations support:\", gpu.has_aspect_atomic64)\n",
+    "    print(f\"Global memory size: {gpu.global_mem_size/1024/1024} MB\")\n",
+    "    print(f\"Global memory cache size: {gpu.global_mem_cache_size/1024} KB\")\n",
+    "    print(f\"Maximum compute units: {gpu.max_compute_units}\")\n",
+    "except:\n",
+    "    print(\"The GPU device is not available\")   "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "97b53113-8264-4f7e-9a9d-a997e70ed3bc",
+   "metadata": {},
+   "source": [
+    "For more information about `dpctl` device selection please refer to [Data Parallel Control: Device Selection](https://intelpython.github.io/dpctl/latest/docfiles/user_guides/manual/dpctl/device_selection.html)\n",
+    "\n",
+    "For more information about `dpctl.SyclDevice` class methods and attributes please refer to [Data Parallel Control: dpctl.SyclDevice](https://intelpython.github.io/dpctl/latest/docfiles/dpctl/SyclDevice.html)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pull/45/_sources/notebooks/02-dpnp_numpy_fallback.ipynb.txt b/pull/45/_sources/notebooks/02-dpnp_numpy_fallback.ipynb.txt
new file mode 100644
index 0000000..ca03c12
--- /dev/null
+++ b/pull/45/_sources/notebooks/02-dpnp_numpy_fallback.ipynb.txt
@@ -0,0 +1,196 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "be340585",
+   "metadata": {},
+   "source": [
+    "# Jupyter Notebook 2: Falling back to NumPy"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9008dbe5",
+   "metadata": {},
+   "source": [
+    "**Data Parallel Extensions for Python** are still in active development and have not yet reached production quality. This in particular means that some functional and performance gaps may exist in certain `dpnp` functions that require workarounds. The functional gaps include:\n",
+    "\n",
+    "* Certain NumPy APIs are not supported. For complete reference please see the [comparison table](https://intelpython.github.io/dpnp/reference/comparison.html) for **Data Parallel Extension for NumPy**.\n",
+    "* Limited support of `dtypes`. At present the **Data Parallel Extension for NumPy** supports `float32`, `float64`, `int32`, and `int64` types.\n",
+    "* Certain keyword arguments are supported for default settings only. Please refer to the [Data Parallel Extension for NumPy API Reference](https://intelpython.github.io/dpnp/reference/index.html) for details.\n",
+    "\n",
+    "Since NumPy API is versatily there are typically some workaround options exist. Please refer to [Data Parallel Extension for NumPy API Reference](https://intelpython.github.io/dpnp/reference/index.html) and [NumPy documentation](https://numpy.org/doc/stable/) for hints for possible alternatives.\n",
+    "\n",
+    "Another possible workaround is to fall back to the host and execute the script via NumPy. This is a discouraged use because it typically results in significant performance penalties associated with copying data from the device to the host and back. However, for debugging purposes you may still want to enable this behavior.\n",
+    "\n",
+    "To do so you must set the `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` environment variable to `0`.\n",
+    "\n",
+    "Let's take the following example:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "c78511cd",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n"
+     ]
+    },
+    {
+     "ename": "NotImplementedError",
+     "evalue": "Requested funtion=full with args=((20000, 20000), 3.0, None, 'C') and kwargs={'like': array([])} isn't currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception.",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mNotImplementedError\u001b[0m                       Traceback (most recent call last)",
+      "Cell \u001b[1;32mIn[3], line 9\u001b[0m\n\u001b[0;32m      7\u001b[0m a_np \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39mfull((N, N), \u001b[38;5;241m3.\u001b[39m, like \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39mzeros((N, \u001b[38;5;241m0\u001b[39m)))\n\u001b[0;32m      8\u001b[0m \u001b[38;5;28mprint\u001b[39m(a_np)\n\u001b[1;32m----> 9\u001b[0m a_dp \u001b[38;5;241m=\u001b[39m \u001b[43mdpnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfull\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mN\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mN\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m3.\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlike\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mdpnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mzeros\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mN\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     10\u001b[0m \u001b[38;5;28mprint\u001b[39m(a_dp)\n",
+      "File \u001b[1;32m~\\AppData\\Local\\Continuum\\miniconda3\\envs\\ndpex-examples\\lib\\site-packages\\dpnp\\dpnp_iface_arraycreation.py:747\u001b[0m, in \u001b[0;36mfull\u001b[1;34m(shape, fill_value, dtype, order, like, device, usm_type, sycl_queue)\u001b[0m\n\u001b[0;32m    738\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m    739\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m dpnp_container\u001b[38;5;241m.\u001b[39mfull(shape,\n\u001b[0;32m    740\u001b[0m                                fill_value,\n\u001b[0;32m    741\u001b[0m                                dtype\u001b[38;5;241m=\u001b[39mdtype,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    744\u001b[0m                                usm_type\u001b[38;5;241m=\u001b[39musm_type,\n\u001b[0;32m    745\u001b[0m                                sycl_queue\u001b[38;5;241m=\u001b[39msycl_queue)\n\u001b[1;32m--> 747\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcall_origin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnumpy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfull\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshape\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlike\u001b[49m\u001b[43m)\u001b[49m\n",
+      "File \u001b[1;32mdpnp\\dpnp_utils\\dpnp_algo_utils.pyx:132\u001b[0m, in \u001b[0;36mdpnp.dpnp_utils.dpnp_algo_utils.call_origin\u001b[1;34m()\u001b[0m\n",
+      "\u001b[1;31mNotImplementedError\u001b[0m: Requested funtion=full with args=((20000, 20000), 3.0, None, 'C') and kwargs={'like': array([])} isn't currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception."
+     ]
+    }
+   ],
+   "source": [
+    "import dpnp\n",
+    "import numpy\n",
+    "\n",
+    "N = 200*100\n",
+    "\n",
+    "# Create an two dimencial array with singular element and array like option\n",
+    "a_np = numpy.full((N, N), 3., like = numpy.zeros((N, 0)))\n",
+    "print(a_np)\n",
+    "a_dp = dpnp.full((N, N), 3., like = dpnp.zeros((N, 0)))\n",
+    "print(a_dp)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ae026021",
+   "metadata": {},
+   "source": [
+    "We are attempting to call `dpnp.full()` function with the keyword argument `like` set to another `dpnp` array, which is currently unsupported. A possible alternative would be to use `dpnp.full_like` function:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "5e588080-484a-44f4-a168-7d07f760c7a0",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Elapsed 1494.33 ms\n",
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n",
+      "Array a is located on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "from time import time\n",
+    "\n",
+    "t = time()\n",
+    "a = dpnp.full_like(dpnp.zeros((N, 0)), 3., shape=(N, N))\n",
+    "print(f\"Elapsed {(time()-t)*1000:.2f} ms\")\n",
+    "print(a)\n",
+    "print(\"Array a is located on the device:\", a.device)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "210440c3",
+   "metadata": {},
+   "source": [
+    "Now we enable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to fall back to NumPy in case of `NotImplementedError`."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bca7490d",
+   "metadata": {},
+   "source": [
+    "**Note: Restart Jupyter Notebook kernel before running the following code** "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "05ad1565",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK = 0\n",
+      "Elapsed 2231.62 ms\n",
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n",
+      "Array a is located on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "import os\n",
+    "os.environ[\"DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK\"] = \"0\" \n",
+    "\n",
+    "import dpnp as np\n",
+    "print (\"DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK =\", np.config.__DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK__)  # Expect 0\n",
+    "\n",
+    "from time import time\n",
+    "\n",
+    "N = 200*100\n",
+    "\n",
+    "t = time()\n",
+    "a = np.full((N, N), 3., like = np.zeros((N, 0)))\n",
+    "print(f\"Elapsed {(time()-t)*1000:.2f} ms\")\n",
+    "print(a)\n",
+    "print(\"Array a is located on the device:\", a.device)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pull/45/_sources/notebooks/03-mandelbrot_perfomance.ipynb.txt b/pull/45/_sources/notebooks/03-mandelbrot_perfomance.ipynb.txt
new file mode 100644
index 0000000..edafb84
--- /dev/null
+++ b/pull/45/_sources/notebooks/03-mandelbrot_perfomance.ipynb.txt
@@ -0,0 +1,872 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "24d4cab0",
+   "metadata": {},
+   "source": [
+    "# Examples with performance using Mandelbrot calculation"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e62a1f43",
+   "metadata": {},
+   "source": [
+    "[Data Parallel Extensions for Python](https://intelpython.github.io/DPEP/main/) makes calculations on the gpu faster than on the cpu. \n",
+    "Let's look at performance using the example of the Mandelbrot set computation. \n",
+    "The Mandelbrot set is the set of points `c` on the complex plane for which the recurrence relation $ z_{n+1} = z_n^2+c $ at \n",
+    "$ z_0=0 $ defines a bounded sequence. In other words, it is the set of such `c` for which there exists a real `R` such that the inequality \n",
+    "$ |z_n|<R $\n",
+    "holds for all natural `n`. \n",
+    "The definition and the name belong to the French mathematician Adrien Duadi, after the mathematician Benoit Mandelbrot."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7a476f4e",
+   "metadata": {},
+   "source": [
+    "**Prerequisits:** please be sure that Matplotlib library is installed"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d8d45aaa",
+   "metadata": {},
+   "source": [
+    "### The Mandelbrot set based on the NumPy* library"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "382d368a",
+   "metadata": {},
+   "source": [
+    "Let's build the Mandelbrot set based on the NumPy* library and measure its performance. We will use these values for a baseline."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "9a26bc85",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "497 ms ± 35.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on CPU using NumPy* library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#import NumPy* library\n",
+    "import numpy as np\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "#create arrays\n",
+    "c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "#perform calculations\n",
+    "def color_by_intensity(intensity):\n",
+    "    intensity = np.broadcast_to(intensity[:, :, np.newaxis], intensity.shape + (3,))\n",
+    "    return np.where(\n",
+    "        intensity < 0.5,\n",
+    "        c3 * intensity + c2 * (1.0 - intensity),\n",
+    "        c1 * intensity + c2 * (1.0 - intensity),\n",
+    "    )\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    x = np.linspace(0, w, num=w, dtype=np.float32)\n",
+    "    y = np.linspace(0, h, num=h, dtype=np.float32)\n",
+    "    xx = (x - offset[0]) * zoom\n",
+    "    yy = (y - offset[1]) * zoom\n",
+    "    c = xx + 1j * yy[:, np.newaxis]\n",
+    "\n",
+    "    n_iter = np.full(c.shape, 0)  # 2d array\n",
+    "    z = np.zeros(c.shape, np.csingle)  # 2d array too\n",
+    "    mask = n_iter < MAX_ITER  # Initialize with True\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z[mask] = z[mask] ** 2 + c[mask]\n",
+    "        mask = mask & (np.abs(z) <= 2.0)\n",
+    "        n_iter[mask] = i\n",
+    "\n",
+    "    intensity = n_iter.T / MAX_ITER\n",
+    "    #values = (color_by_intensity(intensity) * 255).astype(np.uint8)\n",
+    "    values = (color_by_intensity(intensity) * 255).astype(np.int32)\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "    #return np.full((w, h, 3), 0, dtype=np.uint8)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        plt.imshow(self.values)\n",
+    "            \n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "    main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8dd3214d",
+   "metadata": {},
+   "source": [
+    "Now we have the results of code execution on the CPU using the NumPy* library"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4db6b1f0",
+   "metadata": {},
+   "source": [
+    "### The Mandelbrot set based on the Data Parallel Extension for NumPy"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "2f48cd68",
+   "metadata": {},
+   "source": [
+    "To run Python on the GPU, we have to make minor changes to our CPU script, namely:\n",
+    "1. Changing import statement(s) (call the Data Parallel Extension for NumPy)\n",
+    "2. Specifying on which device(s) the data is allocated\n",
+    "3. Explicitly copying data between devices and the host as needed"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "e4c3536a",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "level_zero:gpu\n",
+      "947 ms ± 19.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on GPU using dpnp library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#specify the device type\n",
+    "import os\n",
+    "os.environ[\"SYCL_DEVICE_FILTER\"] = \"level_zero:gpu\"\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"opencl:gpu\"\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"cpu\"\n",
+    "print (os.environ[\"SYCL_DEVICE_FILTER\"])\n",
+    "\n",
+    "#import dpnp library\n",
+    "import dpnp as np\n",
+    "\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "#create arrays\n",
+    "c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "#perform calculations\n",
+    "def color_by_intensity(intensity):\n",
+    "    intensity = np.broadcast_to(intensity[:, :, np.newaxis], intensity.shape + (3,))\n",
+    "    return np.where(\n",
+    "        intensity < 0.5,\n",
+    "        c3 * intensity + c2 * (1.0 - intensity),\n",
+    "        c1 * intensity + c2 * (1.0 - intensity),\n",
+    "    )\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    x = np.linspace(0, w, num=w, dtype=np.float32)\n",
+    "    y = np.linspace(0, h, num=h, dtype=np.float32)\n",
+    "    xx = (x - offset[0]) * zoom\n",
+    "    yy = (y - offset[1]) * zoom\n",
+    "    c = xx + 1j * yy[:, np.newaxis]\n",
+    "\n",
+    "    \n",
+    "    n_iter = np.full(c.shape, 0)  # 2d array\n",
+    "    z = np.zeros(c.shape, dtype=np.csingle)  # 2d array too\n",
+    "\n",
+    "    mask = n_iter < MAX_ITER  # Initialize with True\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z[mask] = z[mask] ** 2 + c[mask]\n",
+    "        mask = mask & (np.abs(z) <= 2.0)\n",
+    "        n_iter[mask] = i\n",
+    "\n",
+    "    intensity = n_iter.T / MAX_ITER\n",
+    "    values = (color_by_intensity(intensity) * 255).astype(np.int32)\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        #return the NumPy* array with input data\n",
+    "        cpu_values = np.asnumpy(self.values)\n",
+    "        plt.imshow(cpu_values)\n",
+    "            \n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "    main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a0a3b406",
+   "metadata": {},
+   "source": [
+    "You can compare the performance of the gpu calculations with the dpnp library using the OpenCL (Open Computing Language) driver. For both type of GPU drivers performance will be 2 times faster than on cpu."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "f702fa13",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "opencl:gpu\n",
+      "967 ms ± 15.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on OpenCL GPU device using dpnp library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#specify the device type\n",
+    "import os\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"level_zero:gpu\"\n",
+    "os.environ[\"SYCL_DEVICE_FILTER\"] = \"opencl:gpu\"\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"cpu\"\n",
+    "print (os.environ[\"SYCL_DEVICE_FILTER\"])\n",
+    "\n",
+    "#import dpnp library\n",
+    "import dpnp as np\n",
+    "\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "#create arrays\n",
+    "c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "#perform calculations\n",
+    "def color_by_intensity(intensity):\n",
+    "    intensity = np.broadcast_to(intensity[:, :, np.newaxis], intensity.shape + (3,))\n",
+    "    return np.where(\n",
+    "        intensity < 0.5,\n",
+    "        c3 * intensity + c2 * (1.0 - intensity),\n",
+    "        c1 * intensity + c2 * (1.0 - intensity),\n",
+    "    )\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    x = np.linspace(0, w, num=w, dtype=np.float32)\n",
+    "    y = np.linspace(0, h, num=h, dtype=np.float32)\n",
+    "    xx = (x - offset[0]) * zoom\n",
+    "    yy = (y - offset[1]) * zoom\n",
+    "    c = xx + 1j * yy[:, np.newaxis]\n",
+    "\n",
+    "    \n",
+    "    n_iter = np.full(c.shape, 0)  # 2d array\n",
+    "    z = np.zeros(c.shape, dtype=np.csingle)  # 2d array too\n",
+    "\n",
+    "    mask = n_iter < MAX_ITER  # Initialize with True\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z[mask] = z[mask] ** 2 + c[mask]\n",
+    "        mask = mask & (np.abs(z) <= 2.0)\n",
+    "        n_iter[mask] = i\n",
+    "\n",
+    "    intensity = n_iter.T / MAX_ITER\n",
+    "    values = (color_by_intensity(intensity) * 255).astype(np.int32)\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        #return the NumPy* array with input data\n",
+    "        cpu_values = np.asnumpy(self.values)\n",
+    "        plt.imshow(cpu_values)\n",
+    "            \n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "    main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ac61f656",
+   "metadata": {},
+   "source": [
+    "Calculations using the Data Parallel Extension for NumPy on the GPU will be faster than the same calculations using the same library on the CPU. Lets compare this."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "0c2a4f2d",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "cpu\n",
+      "908 ms ± 9.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on CPU device using dpnp library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#specify the device type\n",
+    "import os\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"level_zero:gpu\"\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"opencl:gpu\"\n",
+    "os.environ[\"SYCL_DEVICE_FILTER\"] = \"cpu\"\n",
+    "print (os.environ[\"SYCL_DEVICE_FILTER\"])\n",
+    "\n",
+    "#import dpnp library\n",
+    "import dpnp as np\n",
+    "\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "#create arrays\n",
+    "c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "#perform calculations\n",
+    "def color_by_intensity(intensity):\n",
+    "    intensity = np.broadcast_to(intensity[:, :, np.newaxis], intensity.shape + (3,))\n",
+    "    return np.where(\n",
+    "        intensity < 0.5,\n",
+    "        c3 * intensity + c2 * (1.0 - intensity),\n",
+    "        c1 * intensity + c2 * (1.0 - intensity),\n",
+    "    )\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    x = np.linspace(0, w, num=w, dtype=np.float32)\n",
+    "    y = np.linspace(0, h, num=h, dtype=np.float32)\n",
+    "    xx = (x - offset[0]) * zoom\n",
+    "    yy = (y - offset[1]) * zoom\n",
+    "    c = xx + 1j * yy[:, np.newaxis]\n",
+    "\n",
+    "    \n",
+    "    n_iter = np.full(c.shape, 0)  # 2d array\n",
+    "    z = np.zeros(c.shape, dtype=np.csingle)  # 2d array too\n",
+    "\n",
+    "    mask = n_iter < MAX_ITER  # Initialize with True\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z[mask] = z[mask] ** 2 + c[mask]\n",
+    "        mask = mask & (np.abs(z) <= 2.0)\n",
+    "        n_iter[mask] = i\n",
+    "\n",
+    "    intensity = n_iter.T / MAX_ITER\n",
+    "    values = (color_by_intensity(intensity) * 255).astype(np.int32)\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        #return the NumPy* array with input data\n",
+    "        cpu_values = np.asnumpy(self.values)\n",
+    "        plt.imshow(cpu_values)\n",
+    "            \n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "    main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ba97cbfd",
+   "metadata": {},
+   "source": [
+    "### The Mandelbrot set on the Numba"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0a314c05",
+   "metadata": {},
+   "source": [
+    "If we run the Mandelbrot set on Numba, the high-performance Python compiler, we see that the computation on it is faster than on the Numpy library."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "f1e11ebc",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "7.23 ms ± 875 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on CPU device using dpnp library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#import libraries\n",
+    "import numpy as np\n",
+    "import numba as nb\n",
+    "\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "nb.config.THREADING_LAYER = \"omp\"\n",
+    "\n",
+    "#perform calculations\n",
+    "@nb.jit(fastmath=True, nopython=True)\n",
+    "def color_by_intensity(intensity, c1, c2, c3):\n",
+    "    if intensity < 0.5:\n",
+    "        return c3 * intensity + c2 * (1.0 - intensity)\n",
+    "    else:\n",
+    "        return c1 * intensity + c2 * (1.0 - intensity)\n",
+    "\n",
+    "@nb.jit(fastmath=True, nopython=True)\n",
+    "def mandel(x, y):\n",
+    "    c = complex(x, y)\n",
+    "    z = 0.0j\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z = z * z + c\n",
+    "        if (z.real * z.real + z.imag * z.imag) > 4.0:\n",
+    "            return i\n",
+    "    return MAX_ITER\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "@nb.jit(fastmath=True, nopython=True, parallel=True)\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "    c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "    c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "    for x in nb.prange(w):\n",
+    "        for y in range(h):\n",
+    "            xx = (x - offset[0]) * zoom\n",
+    "            yy = (y - offset[1]) * zoom\n",
+    "            intensity = mandel(xx, yy) / MAX_ITER\n",
+    "            for c in range(3):\n",
+    "                color = color_by_intensity(intensity, c1[c], c2[c], c3[c])\n",
+    "                color = int(color * 255.0)\n",
+    "                values[x, y, c] = color\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        plt.imshow(self.values)\n",
+    "\n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "     main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9d5d93ef",
+   "metadata": {},
+   "source": [
+    "### The Mandelbrot set on the Data Parallel Extension for Numba"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6c03c2c9",
+   "metadata": {},
+   "source": [
+    "The calculation on the Data Parallel Extension for Numba go faster than on the Numba or on the Data Parallel Extension for NumPy."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "1c45197f",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "C:\\Users\\mvyasank\\Anaconda3\\envs\\my_env\\lib\\site-packages\\numba_dpex\\decorators.py:154: RuntimeWarning: nopython is set for dpjit and is ignored\n",
+      "  warnings.warn(\n"
+     ]
+    },
+    {
+     "ename": "TypingError",
+     "evalue": "Failed in dpex_dpjit_nopython mode pipeline (step: nopython frontend)\n\u001b[1m\u001b[1mUnknown attribute 'asarray' of type Module(<module 'dpnp' from 'C:\\\\Users\\\\mvyasank\\\\Anaconda3\\\\envs\\\\my_env\\\\lib\\\\site-packages\\\\dpnp\\\\__init__.py'>)\n\u001b[1m\nFile \"AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py\", line 41:\u001b[0m\n\u001b[1m<source missing, REPL/exec in use?>\u001b[0m\n\u001b[0m\n\u001b[0m\u001b[1mDuring: typing of get attribute at C:\\Users\\mvyasank\\AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py (41)\u001b[0m\n\u001b[1m\nFile \"AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py\", line 41:\u001b[0m\n\u001b[1m<source missing, REPL/exec in use?>\u001b[0m\n",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mTypingError\u001b[0m                               Traceback (most recent call last)",
+      "Cell \u001b[1;32mIn[4], line 89\u001b[0m\n\u001b[0;32m     86\u001b[0m     fractal\u001b[38;5;241m.\u001b[39mdraw()\n\u001b[0;32m     88\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;18m__name__\u001b[39m \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__main__\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m---> 89\u001b[0m      \u001b[43mmain\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
+      "Cell \u001b[1;32mIn[4], line 84\u001b[0m, in \u001b[0;36mmain\u001b[1;34m()\u001b[0m\n\u001b[0;32m     82\u001b[0m fractal \u001b[38;5;241m=\u001b[39m Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n\u001b[0;32m     83\u001b[0m \u001b[38;5;66;03m#calculating the Mandelbrot set and measuring performance\u001b[39;00m\n\u001b[1;32m---> 84\u001b[0m \u001b[43mget_ipython\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_line_magic\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtimeit\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mfractal.calculate()\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m     85\u001b[0m \u001b[38;5;66;03m#draw results\u001b[39;00m\n\u001b[0;32m     86\u001b[0m fractal\u001b[38;5;241m.\u001b[39mdraw()\n",
+      "File \u001b[1;32m~\\Anaconda3\\envs\\my_env\\lib\\site-packages\\IPython\\core\\interactiveshell.py:2414\u001b[0m, in \u001b[0;36mInteractiveShell.run_line_magic\u001b[1;34m(self, magic_name, line, _stack_depth)\u001b[0m\n\u001b[0;32m   2412\u001b[0m     kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlocal_ns\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_local_scope(stack_depth)\n\u001b[0;32m   2413\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuiltin_trap:\n\u001b[1;32m-> 2414\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m   2416\u001b[0m \u001b[38;5;66;03m# The code below prevents the output from being displayed\u001b[39;00m\n\u001b[0;32m   2417\u001b[0m \u001b[38;5;66;03m# when using magics with decodator @output_can_be_silenced\u001b[39;00m\n\u001b[0;32m   2418\u001b[0m \u001b[38;5;66;03m# when the last Python token in the expression is a ';'.\u001b[39;00m\n\u001b[0;32m   2419\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(fn, magic\u001b[38;5;241m.\u001b[39mMAGIC_OUTPUT_CAN_BE_SILENCED, \u001b[38;5;28;01mFalse\u001b[39;00m):\n",
+      "File \u001b[1;32m~\\Anaconda3\\envs\\my_env\\lib\\site-packages\\IPython\\core\\magics\\execution.py:1170\u001b[0m, in \u001b[0;36mExecutionMagics.timeit\u001b[1;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[0;32m   1168\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m index \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m10\u001b[39m):\n\u001b[0;32m   1169\u001b[0m     number \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m10\u001b[39m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m index\n\u001b[1;32m-> 1170\u001b[0m     time_number \u001b[38;5;241m=\u001b[39m \u001b[43mtimer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimeit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnumber\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m   1171\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m time_number \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.2\u001b[39m:\n\u001b[0;32m   1172\u001b[0m         \u001b[38;5;28;01mbreak\u001b[39;00m\n",
+      "File \u001b[1;32m~\\Anaconda3\\envs\\my_env\\lib\\site-packages\\IPython\\core\\magics\\execution.py:158\u001b[0m, in \u001b[0;36mTimer.timeit\u001b[1;34m(self, number)\u001b[0m\n\u001b[0;32m    156\u001b[0m gc\u001b[38;5;241m.\u001b[39mdisable()\n\u001b[0;32m    157\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 158\u001b[0m     timing \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minner\u001b[49m\u001b[43m(\u001b[49m\u001b[43mit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    159\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m    160\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m gcold:\n",
+      "File \u001b[1;32m<magic-timeit>:1\u001b[0m, in \u001b[0;36minner\u001b[1;34m(_it, _timer)\u001b[0m\n",
+      "Cell \u001b[1;32mIn[4], line 74\u001b[0m, in \u001b[0;36mFractal.calculate\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m     73\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcalculate\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m---> 74\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvalues \u001b[38;5;241m=\u001b[39m \u001b[43mmandelbrot\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mw\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mh\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mzoom\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moffset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalues\u001b[49m\u001b[43m)\u001b[49m\n",
+      "File \u001b[1;32m~\\Anaconda3\\envs\\my_env\\lib\\site-packages\\numba\\core\\dispatcher.py:468\u001b[0m, in \u001b[0;36m_DispatcherBase._compile_for_args\u001b[1;34m(self, *args, **kws)\u001b[0m\n\u001b[0;32m    464\u001b[0m         msg \u001b[38;5;241m=\u001b[39m (\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mstr\u001b[39m(e)\u001b[38;5;241m.\u001b[39mrstrip()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mThis error may have been caused \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m    465\u001b[0m                \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mby the following argument(s):\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00margs_str\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m    466\u001b[0m         e\u001b[38;5;241m.\u001b[39mpatch_message(msg)\n\u001b[1;32m--> 468\u001b[0m     \u001b[43merror_rewrite\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtyping\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m    469\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m errors\u001b[38;5;241m.\u001b[39mUnsupportedError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m    470\u001b[0m     \u001b[38;5;66;03m# Something unsupported is present in the user code, add help info\u001b[39;00m\n\u001b[0;32m    471\u001b[0m     error_rewrite(e, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124munsupported_error\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
+      "File \u001b[1;32m~\\Anaconda3\\envs\\my_env\\lib\\site-packages\\numba\\core\\dispatcher.py:409\u001b[0m, in \u001b[0;36m_DispatcherBase._compile_for_args.<locals>.error_rewrite\u001b[1;34m(e, issue_type)\u001b[0m\n\u001b[0;32m    407\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[0;32m    408\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 409\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(\u001b[38;5;28;01mNone\u001b[39;00m)\n",
+      "\u001b[1;31mTypingError\u001b[0m: Failed in dpex_dpjit_nopython mode pipeline (step: nopython frontend)\n\u001b[1m\u001b[1mUnknown attribute 'asarray' of type Module(<module 'dpnp' from 'C:\\\\Users\\\\mvyasank\\\\Anaconda3\\\\envs\\\\my_env\\\\lib\\\\site-packages\\\\dpnp\\\\__init__.py'>)\n\u001b[1m\nFile \"AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py\", line 41:\u001b[0m\n\u001b[1m<source missing, REPL/exec in use?>\u001b[0m\n\u001b[0m\n\u001b[0m\u001b[1mDuring: typing of get attribute at C:\\Users\\mvyasank\\AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py (41)\u001b[0m\n\u001b[1m\nFile \"AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py\", line 41:\u001b[0m\n\u001b[1m<source missing, REPL/exec in use?>\u001b[0m\n"
+     ]
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on CPU device using dpnp library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#import libraries\n",
+    "import dpnp as np\n",
+    "import numba_dpex as nb\n",
+    "\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "nb.config.THREADING_LAYER = \"omp\"\n",
+    "\n",
+    "#perform calculations\n",
+    "@nb.dpjit(fastmath=True, nopython=True)\n",
+    "def color_by_intensity(intensity, c1, c2, c3):\n",
+    "    if intensity < 0.5:\n",
+    "        return c3 * intensity + c2 * (1.0 - intensity)\n",
+    "    else:\n",
+    "        return c1 * intensity + c2 * (1.0 - intensity)\n",
+    "\n",
+    "@nb.dpjit(fastmath=True, nopython=True)\n",
+    "def mandel(x, y):\n",
+    "    c = complex(x, y)\n",
+    "    z = 0.0j\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z = z * z + c\n",
+    "        if (z.real * z.real + z.imag * z.imag) > 4.0:\n",
+    "            return i\n",
+    "    return MAX_ITER\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "@nb.dpjit(fastmath=True, nopython=True, parallel=True)\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "    c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "    c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "    for x in nb.prange(w):\n",
+    "        for y in range(h):\n",
+    "            xx = (x - offset[0]) * zoom\n",
+    "            yy = (y - offset[1]) * zoom\n",
+    "            intensity = mandel(xx, yy) / MAX_ITER\n",
+    "            for c in range(3):\n",
+    "                color = color_by_intensity(intensity, c1[c], c2[c], c3[c])\n",
+    "                color = int(color * 255.0)\n",
+    "                values[x, y, c] = color\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        #return the NumPy* array with input data\n",
+    "        cpu_values = np.asnumpy(self.values)\n",
+    "        plt.imshow(cpu_values)\n",
+    "         \n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "     main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e9c275ff",
+   "metadata": {},
+   "source": [
+    "### The conclusion"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e5fe4a54",
+   "metadata": {},
+   "source": [
+    "The Data Parallel Extension for Python libraries follow the \"compute follows data\" approach, with all data being created on the same device where all the computation takes place.\n",
+    "\n",
+    "Based on the experiment with Mandelbrot calculation we see the folliwng:\n",
+    "\n",
+    "| Results        |\n",
+    "| :------------- |\n",
+    "| The NumPy* library shows the slowest results |\n",
+    "| The Data Parallel Extension for NumPy is faster than the NumPy* library |\n",
+    "| The Data Parallel Extension for NumPy on the GPU = the NumPy* library * 0,8 |\n",
+    "| The Data Parallel Extension for NumPy on the GPU = The Data Parallel Extension for NumPy on the CPU * 0,5 |\n",
+    "| The Numba is faster than the NumPy* library |\n",
+    "| The Data Parallel Extension for Numba is faster than the Numba and The Data Parallel Extension for NumPy |\n",
+    "\n"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.8.16"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pull/45/_sources/parallelism.rst.txt b/pull/45/_sources/parallelism.rst.txt
new file mode 100644
index 0000000..e1078e2
--- /dev/null
+++ b/pull/45/_sources/parallelism.rst.txt
@@ -0,0 +1,43 @@
+.. _parallelism:
+.. include:: ./ext_links.txt
+
+Parallelism in Modern Data-Parallel Architectures
+=================================================
+
+Python is loved for its productivity and interactivity. But when it comes to dealing with
+computationally heavy codes, Python performance cannot be compromised. Intel and Python numerical
+computing communities, such as `NumFOCUS <https://numfocus.org/>`_, dedicate attention to
+optimizing core numerical and data science packages for leveraging parallelism available in modern CPUs:
+
+* **Multiple computational cores:** Several computational cores allow to process the data concurrently.
+  Compared to a single-core CPU, *N* cores can process either *N* times bigger data in a fixed time, or
+  reduce a computation time *N* times for a set amount of data.
+
+.. image:: ./_images/dpep-cores.png
+    :width: 600px
+    :align: center
+    :alt: Multiple CPU Cores
+
+* **SIMD parallelism:** SIMD (Single Instruction Multiple Data) is a special type of instructions
+  that perform operations on vectors of data elements at the same time. The size of vectors is called the SIMD width.
+  If a SIMD width is *K* then a SIMD instruction can process *K* data elements in parallel.
+
+  In the following diagram, the SIMD width is 2, which means that a single instruction processes two elements simultaneously.
+  Compared to regular instructions that process one element at a time, 2-wide SIMD instruction performs
+  two times more data in fixed time, or, respectively, process a fixed amount of data two times faster.
+
+.. image:: ./_images/dpep-simd.png
+    :width: 150px
+    :align: center
+    :alt: SIMD
+
+* **Instruction-Level Parallelism:** Modern CISC architectures, such as x86, allow performing data independent
+  instructions in parallel. In the following example, see how to compute :math:`a * b + (c - d)`.
+  Operations :math:`*` and :math:`-` can be executed in parallel, the last instruction
+  :math:`+` depends on availability of :math:`a * b` and :math:`c - d` and cannot be executed in parallel
+  with :math:`*` and :math:`-`.
+
+.. image:: ./_images/dpep-ilp.png
+    :width: 150px
+    :align: center
+    :alt: SIMD
diff --git a/pull/45/_sources/prerequisites_and_installation.rst.txt b/pull/45/_sources/prerequisites_and_installation.rst.txt
new file mode 100644
index 0000000..37d64ea
--- /dev/null
+++ b/pull/45/_sources/prerequisites_and_installation.rst.txt
@@ -0,0 +1,50 @@
+.. _prerequisites_and_installation:
+.. include:: ./ext_links.txt
+
+.. |copy| unicode:: U+000A9
+
+.. |trade| unicode:: U+2122
+
+Prerequisites and Installation
+==============================
+
+1. Device Drivers
+******************
+
+To start programming data parallel devices beyond CPU, you will need an appropriate hardware.
+For example, Data Parallel Extensions for Python work fine on Intel |copy| laptops with integrated graphics.
+In majority of cases, your Windows*-based laptop already has all necessary device drivers installed. But if you want the most
+up-to-date driver, you can always
+`update it to the latest one <https://www.intel.com/content/www/us/en/download-center/home.html>`_.
+Follow device driver installation instructions
+to complete this step.
+
+All other necessary components for programming data parallel devices will be installed with
+Data Parallel Extensions for Python.
+
+2. Python Interpreter
+**********************
+
+You will need Python 3.8, 3.9, or 3.10 installed on your system. If you do not have one yet the easiest way to do
+that is to install `Intel Distribution for Python*`_.
+It installs all essential Python numerical and machine
+learning packages optimized for the Intel hardware, including Data Parallel Extensions for Python*.
+If you have Python installation from another vendor, it is fine too. All you need is to install Data Parallel
+Extensions for Python manually as shown in the next section.
+
+3. Data Parallel Extensions for Python
+***************************************
+
+Skip this step if you already installed Intel |copy| Distribution for Python.
+
+The easiest way to install Data Parallel Extensions for Python is to install numba-dpex:
+
+* Conda: ``conda install numba-dpex``
+
+* Pip: ``pip install numba-dpex``
+
+These commands install ``numba-dpex`` along with its dependencies, including ``dpnp``, ``dpctl``,
+and required compiler runtimes.
+
+.. WARNING::
+   Before installing with conda or pip it is strongly advised to update ``conda`` and ``pip`` to latest versions
diff --git a/pull/45/_sources/programming_dpep.rst.txt b/pull/45/_sources/programming_dpep.rst.txt
new file mode 100644
index 0000000..4205ce3
--- /dev/null
+++ b/pull/45/_sources/programming_dpep.rst.txt
@@ -0,0 +1,305 @@
+.. _programming_dpep:
+.. include:: ./ext_links.txt
+
+
+.. |copy| unicode:: U+000A9
+.. |trade| unicode:: U+2122
+
+
+Programming with Data Parallel Extensions for Python
+====================================================
+
+.. image:: ./_images/dpep-all.png
+   :width: 600px
+   :align: center
+   :alt: Data Parallel Extensions for Python
+
+**Data Parallel Extensions for Python** consist of three foundational packages:
+
+* The `Numpy*`_-like library, ``dpnp``;
+* The compiler extension for `Numba*`_, ``numba-dpex``
+* The library for managing devices, queues, and heterogeneous data, ``dpctl``.
+
+Their underlying implementation is based on `SYCL*`_ standard, which is a cross-platform abstraction layer
+for heterogeneous computing on data parallel devices, such as CPU, GPU, or domain-specific accelerators.
+
+Scalars vs. 0-Dimensional Arrays
+********************************
+
+Primitive types, such as Python’s and Numpy’s ``float``, ``int``, or ``complex``, used to represent scalars,
+have the host storage. In contrast, ``dpctl.tensor.usm_ndarray`` and ``dpnp.ndarray`` have the USM storage
+and carry associated allocation queue. For the :ref:`Compute-Follows-Data` consistent behavior
+all ``dpnp`` operations that produce scalars will instead produce respective 0-dimensional arrays.
+
+That implies, that some code changes may be needed to replace scalar math operations with respective
+``dpnp`` array operations. See `Data Parallel Extension for Numpy*`_ - **API Reference** section for details.
+
+Data Parallel Extension for Numpy - dpnp
+****************************************
+
+The ``dpnp`` library is a bare minimum to start programming numerical codes for data-parallel devices.
+If you already have a Python script written in `Numpy*`_, then running it on a GPU will typically require
+changing just a few lines of the code:
+
+.. literalinclude:: ../../examples/01-hello_dpnp.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 01:** Your first NumPy code running on GPU
+   :name: ex_01_hello_dpnp
+
+
+In this example, ``np.asarray()`` creates an array on the default `SYCL*`_ device, which is a ``"gpu"`` on systems
+with integrated or discrete GPU (it is the ``"host"`` on systems that do not have GPU).
+The queue associated with this array is now carried with ``x``, and ``np.sum(x)`` derives it from ``x``,
+and respective pre-compiled kernel implementing ``np.sum()`` is submitted to that queue.
+The result ``y`` is allocated on the device 0-dimensional array associated with that queue too.
+
+All ``dpnp`` array creation routines and random number generators have additional optional keyword arguments:
+``device``, ``queue``, and ``usm_type``, using which you can explicitly specify on which device or queue you want
+the tensor data to be created along with the USM memory type to be used (``"host"``, ``"device"``, or ``"shared"``).
+In the following example, the array ``x`` is created on the GPU device, and reduction sum is done on it:
+
+.. literalinclude:: ../../examples/02-dpnp_device.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 02:** Select device type while creating array
+   :name: ex_02_dpnp_device
+
+
+Data Parallel Extension for Numba - numba-dpex
+**********************************************
+
+`Numba*`_ is a powerful Just-In-Time (JIT) compiler that works best on `Numpy*`_ arrays, `Numpy*`_ functions, and loops.
+Data-parallel loops is where the data parallelism resides. It allows leveraging all available CPU cores,
+SIMD instructions, and schedules those in a way that exploits maximum instruction-level parallelism.
+The ``numba-dpex`` extension allows to compile and offload data-parallel regions to any data parallel device.
+It takes just a few lines to modify your CPU `Numba*`_ script to run on GPU:
+
+.. literalinclude:: ../../examples/03-dpnp2numba-dpex.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 03:** Compile dpnp code with numba-dpex
+   :name: ex_03_dpnp2numba_dpex
+
+In this example, you can see a custom function ``sum_it()`` that takes an array input. By compiling it with
+`Data Parallel Extension for Numba*`_, the queue information is derived from input argument ``x``,
+which is associated with the default device (``"gpu"`` on systems with integrated or discrete GPU) and
+dynamically compiles the kernel submitted to that queue. The result resides as a 0-dimensional array on the device
+associated with the queue, and on exit from the offload kernel it will be assigned to the tensor ``y``.
+
+Data Parallel Control - dpctl
+*****************************
+
+Both ``dpnp`` and ``numba-dpex`` provide enough API versatility for programming data parallel devices but
+there are some situations when you need to use ``dpctl`` advanced capabilities:
+
+1. **Advanced device management.** Both ``dpnp`` and ``numba-dpex`` support Numpy array creation routines
+   with additional parameters that specify the device on which the data is allocated and the type of memory to be used
+   (``"device"``, ``"host"``, or ``"shared"``). However, if you need some more advanced device and data management
+   capabilities, you need to import ``dpctl`` in addition to ``dpnp`` and/or ``numba-dpex``.
+
+   One of frequent usages of ``dpctl`` is to query the list devices present on the system, available driver backend
+   (such as ``"opencl"``, ``"level_zero"``, ``"cuda"``, etc.)
+
+   Another frequent usage is the creation of additional queues for the purpose of profiling or choosing an out-of-order
+   execution of offload kernels.
+
+.. literalinclude:: ../../examples/04-dpctl_device_query.py
+   :language: python
+   :lines: 27-
+   :caption: **EXAMPLE 04:** Get information about devices
+   :name: ex_04_dpctl_device_query
+
+2. **Cross-platform development using Python Array API standard.** If you
+   program Numpy-like codes and target different hardware vendors and different tensor implementations,
+   then going with `Python* Array API Standard`_ is a good choice for writing a portable Numpy-like code.
+   The ``dpctl.tensor`` implements `Python* Array API Standard`_ for `SYCL*`_ devices. Accompanied with
+   respective SYCL device, driver from different vendors, ``dpctl.tensor`` becomes a portable solution
+   for writing numerical codes for any SYCL device.
+
+   For example, some Python communities, such as
+   `Scikit-Learn* community <https://github.com/scikit-learn/scikit-learn/issues/22352>`_, are already establishing
+   a path for having algorithms (re-)implemented using `Python* Array API Standard`_ .
+   This is a reliable path for extending their capabilities beyond CPU only, or beyond certain GPU vendor only.
+
+3. **Zero-copy data exchange between tensor implementations.** Certain Python projects may have their tensor
+   implementations not relying on ``dpctl.tensor`` or ``dpnp.ndarray`` tensors. However, you can still exchange data
+   between these tensors not copying it back and forth through the host.
+   `Python* Array API Standard`_ specifies the data exchange protocol for zero-copy exchange
+   between tensors through ``dlpack``. Being the `Python* Array API Standard`_ implementation
+   ``dpctl`` provides ``dpctl.tensor.from_dlpack()`` function used for zero-copy view of another tensor input.
+
+
+Debugging and Profiling Data Parallel Extensions for Python
+***********************************************************
+`Intel oneAPI Base Toolkit`_ provides two tools to assist programmers to analyze performance issues in programs
+that use **Data Parallel Extensions for Python**. They are `Intel VTune Profiler`_ and
+`Intel Advisor`_.
+
+Intel |copy| VTune |trade| Profiler examines various performance aspects of a program like, the most time-consuming parts,
+efficiency of offloaded code, impact of memory sub-systems, etc.
+
+Intel |copy| Advisor |trade| provides insights on the performance of offloaded code with respect to the peak performance and
+memory bandwidth.
+
+Below you can find how to use Intel VTune Profiler and Intel Advisor with
+heterogenous programs that use **Data Parallel Extensions for Python**.
+
+Profiling with Intel VTune Profiler
+-----------------------------------
+
+Intel |copy| VTune |trade| Profiler provides two mechanisms to profile heterogeneous programs
+targeted to GPUs.
+
+* GPU offload
+* GPU hotspots
+
+The *GPU offload* analysis profiles the entire application (both GPU and host code) and helps to identify
+if the application is CPU- or GPU-bound. It provides information on the proportion of the execution time spent
+in GPU execution. It also provides information about various hotspots in the program. The key goal of the *GPU offload*
+analysis is to identify the parts of the program that can benefit from offloading to GPUs.
+
+The *GPU hotspots* analysis focuses on providing insights into the performance of GPU-offloaded code.
+It provides insights about the parallelism in the GPU kernel, the efficiency of the kernel, SIMD utilization,
+and memory latency. It also provides performance data regarding synchronization operations like GPU barriers and
+atomic operations.
+
+The following instructions are used to execute the two Intel VTune Profiler analyses on programs written
+using **Data Parallel Extensions for Python**:
+
+.. code-block:: console
+    :caption: **GPU Offload**
+
+    > vtune -collect gpu-offload -r <output_dir> -- python <script>.py <args>
+
+.. code-block:: console
+    :caption: **GPU Hotspots**
+
+    > vtune -collect gpu-hotspots -r <output_dir> -- python <script>.py <args>
+
+Intel VTune Profiler performs dynamic binary analysis on a given program to obtain insights on various
+performance characteristics. It can run on unmodified binaries with no extra requirements for program compilation.
+After collecting the data using the above commands, the Intel VTune Profiler GUI can be used to view various
+performance characteristics. In addition to the GUI, it provides mechanisms to generate reports through
+the command line and setup a web server for post processing the data.
+
+See `Intel VTune Profiler User Guide <https://www.intel.com/content/www/us/en/develop/documentation/vtune-help/top.html>`_
+for more details.
+
+Profiling with Intel Advisor
+----------------------------
+
+The primary goal of Intel |copy| Advisor is to help you make targeted optimizations by identifying
+appropriate kernels and characterizing the performance limiting factors. It provides mechanisms
+to analyze the performance of GPU kernels against the hardware roof-line performance. Intel Advisor gives you information
+about the maximum achievable performance with the given hardware conditions and helps identify the best
+kernels for optimization. Further, it helps you to characterize if a GPU kernel is bound by
+compute capacity or by memory bandwidth.
+
+The following instructions are used to generate GPU roof-line performance graphs using Intel Advisor.
+
+.. code-block:: console
+    :caption: **Collect Roofline**
+
+    > advisor --collect=roofline --profile-gpu --project-dir=<output_dir> --search-dir src:r=<search_dir> -- <executable> <args>
+
+This command collects the GPU roof-line data from executing the application written using
+**Data Parallel Extensions for Python**.
+
+The next command generates the roof-line graph as a HTML file in the output directory:
+
+.. code-block:: console
+    :caption: **Generate Roofline HTML-File**
+
+    > advisor --report=roofline --gpu --project-dir=<output_dir> --report-output=<output_dir>/roofline_gpu.html
+
+.. image:: ./_images/advisor_roofline_gen9.png
+    :width: 800px
+    :align: center
+    :alt: Advisor roofline analysis example on Gen9 integrated GPU
+
+The figure above shows the example of roof-line graph generated using Intel Advisor.
+The X-axis in the graph represents arithmetic intensity and the Y-axis represents performance in GFLOPS.
+The horizontal lines parallel to the X-axis represent the roof-line compute capacity for the given hardware.
+The cross-diagonal lines represent the peak memory bandwidth of different layers of the memory hierarchy.
+The red colored dot corresponds to the executed GPU kernel. The graph shows the performance of the kernel relative
+to the peak compute capacity and memory bandwidth. It also shows whether the GPU kernel is memory or compute
+bound depending on the roof-line that is limiting the GPU kernel.
+
+For further details on Intel Advisor and its extended capabilities, refer to the
+`Intel |copy| Advisor User Guide <https://www.intel.com/content/www/us/en/develop/documentation/advisor-user-guide/top.html>`_.
+
+
+.. todo::
+   Document debugging section
+
+Writing Robust Numerical Codes for Heterogeneous Computing
+**********************************************************
+
+Default primitive type (``dtype``) in `Numpy*`_ is the double precision (``float64``), which is supported by
+majority of modern CPUs. When it comes to program GPUs and especially specialized accelerators,
+the set of supported primitive data types may be limited. For example, certain GPUs may not support
+double precision or half-precision. **Data Parallel Extensions for Python** select default ``dtype`` depending on
+device’s default type in accordance with Python Array API Standard. It can be either ``float64`` or ``float32``.
+It means that unlike traditional `Numpy*`_ programming on a CPU, the heterogeneous computing requires
+careful management of hardware peculiarities to keep the Python script portable and robust on any device.
+
+There are several hints how to make the numerical code portable and robust.
+
+Sensitivity to Floating-Point Errors
+------------------------------------
+
+Floating-point arithmetic has a finite precision, which implies that only a tiny fraction of real numbers can be
+represented in floating-point arithmetic. It is almost certain that every floating-point operation
+induces a rounding error because the result cannot be accurately represented as a floating-point number.
+The `IEEE 754-2019 Standard for Floating-Point Arithmetic`_ sets the upper bound for rounding errors in each
+arithmetic operation to 0.5 *ulp*, meaning that each arithmetic operation must be accurate to the last bit of
+floating-point mantissa, which is an order of :math:`10^-16` in double precision and :math:`10^-7`
+in single precision.
+
+In robust numerical codes, these errors tend to accumulate slowly so that single precision is enough to
+calculate the result accurate to three-five decimal digits.
+
+However, there is a situation known as a *catastrophic cancellation*, when small accumulated errors
+result in a significant, or even complete, loss of accuracy. The catastrophic cancellation happens
+when two close floating-point numbers with small rounding errors are subtracted. As a result the original
+rounding errors amplify by the number of identical leading digits:
+
+.. image:: ./_images/fp-cancellation.png
+    :scale: 50%
+    :align: center
+    :alt: Floating-Point Cancellation
+
+In the example above, green digits are accurate digits, a few trailing digits in red are inaccurate due to
+induced errors. As a result of subtraction, only one accurate digit remains.
+
+Situations with catastrophic cancellations must be carefully handled. An example where catastrophic
+cancellation happens naturally is the numeric differentiation, where two close numbers are subtracted
+to approximate the derivative:
+
+.. math::
+
+   df/dx \approx \frac{f(x+\delta) - f(x-\delta)}{2\delta}
+
+Smaller you take :math:`\delta` is greater the catastrophic cancellation. At the same time, bigger :math:`\delta`
+results in bigger approximation error. Books on numerical computing and floating-point arithmetic discuss
+variety of technics to make catastrophic cancellations controllable. For more details about floating-point
+arithmetic, refer to `IEEE 754-2019 Standard for Floating-Point Arithmetic`_ and the article by
+`David Goldberg, What every computer scientist should know about floating-point arithmetic`_.
+
+
+Switching Between Single and Double Precision
+---------------------------------------------
+
+1. Implement your code to switch easily between single and double precision in a controlled fashion.
+   For example, implement a utility function or introduce a constant that selects ``dtype`` for
+   the rest of the `Numpy*`_ code.
+
+2. Run your code on a representative set of inputs in single and double precisions.
+   Observe sensitivity of computed results to the switching between single and double precisions.
+   If results remain identical to three-five digits for different inputs, it is a good sign that your code
+   is not sensitive to floating-point errors.
+
+3. Write your code with catastrophic cancellations in mind. These blocks of code will require special
+   care such as the use of extended precision or other techniques to control cancellations.
+   It is likely that this part of the code requires a hardware specific implementation.
diff --git a/pull/45/_sources/useful_links.rst.txt b/pull/45/_sources/useful_links.rst.txt
new file mode 100644
index 0000000..5ebb865
--- /dev/null
+++ b/pull/45/_sources/useful_links.rst.txt
@@ -0,0 +1,48 @@
+.. _useful_links:
+.. include:: ./ext_links.txt
+
+Useful links
+============
+
+.. list-table:: **Companion documentation**
+   :widths: 70 200
+   :header-rows: 1
+
+   * - Document
+     - Description
+   * - `Data Parallel Extension for Numpy*`_
+     - Documentation for programming NumPy-like codes on data-parallel devices
+   * - `Data Parallel Extension for Numba*`_
+     - Documentation for programming Numba codes on data-parallel devices as you program Numba on CPU
+   * - `Data Parallel Control`_
+     - Documentation how to manage data and devices, how to interchange data between different tensor implementations,
+       and how to write data parallel extensions
+   * - `Intel VTune Profiler`_
+     - Performance profiler supporting analysis of bottlenecks from function leve down to low level instructions.
+       Supports Python and Numba
+   * - `Intel Advisor`_
+     - Analyzes native and Python codes and provides the advice for better composition of heterogeneous algorithms
+   * - `Python* Array API Standard`_
+     - Standard for writing portable Numpy-like codes targeting different hardware vendors and frameworks
+       operating with tensor data
+   * - `SYCL*`_
+     - Standard for writing C++-like codes for heterogeneous computing
+   * - `DPC++`_
+     - Free e-book on how to program data-parallel devices using Data Parallel C++
+   * - `OpenCl*`_
+     - OpenCl* Standard for heterogeneous programming
+   * - `IEEE 754-2019 Standard for Floating-Point Arithmetic`_
+     - Standard for floating-point arithmetic, essential for writing robust numerical codes
+   * - `David Goldberg, What every computer scientist should know about floating-point arithmetic`_
+     - Scientific paper. Important for understanding how to write robust numerical code
+   * - `Numpy*`_
+     - Documentation for Numpy - foundational CPU library for array programming. Used in conjunction with
+       `Data Parallel Extension for Numpy*`_.
+   * - `Numba*`_
+     - Documentation for Numba - Just-In-Time compiler for Numpy-like codes. Used in conjunction with
+       `Data Parallel Extension for Numba*`_.
+
+
+To-Do
+=====
+.. todolist::
diff --git a/pull/45/_static/DPEP.png b/pull/45/_static/DPEP.png
new file mode 100644
index 0000000..a6e2610
Binary files /dev/null and b/pull/45/_static/DPEP.png differ
diff --git a/pull/45/_static/basic.css b/pull/45/_static/basic.css
new file mode 100644
index 0000000..7577acb
--- /dev/null
+++ b/pull/45/_static/basic.css
@@ -0,0 +1,903 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+    clear: both;
+}
+
+div.section::after {
+    display: block;
+    content: '';
+    clear: left;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+    width: 100%;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+    word-wrap: break-word;
+    overflow-wrap : break-word;
+}
+
+div.sphinxsidebar ul {
+    list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox form.search {
+    overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+    float: left;
+    width: 80%;
+    padding: 0.25em;
+    box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+    float: left;
+    width: 20%;
+    border-left: none;
+    padding: 0.25em;
+    box-sizing: border-box;
+}
+
+
+img {
+    border: 0;
+    max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li p.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+    width: 90%;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+    width: 100%;
+}
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable ul {
+    margin-top: 0;
+    margin-bottom: 0;
+    list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+    padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+div.modindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+    padding: 2px;
+    border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+    min-width: 360px;
+    max-width: 800px;
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+    -moz-hyphens: auto;
+    -ms-hyphens: auto;
+    -webkit-hyphens: auto;
+    hyphens: auto;
+}
+
+a.headerlink {
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+    clear: left;
+    float: left;
+    margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+    clear: right;
+    float: right;
+    margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+    text-align: left;
+}
+
+.align-center {
+    text-align: center;
+}
+
+.align-default {
+    text-align: center;
+}
+
+.align-right {
+    text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar,
+aside.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+    clear: right;
+    overflow-x: auto;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+nav.contents,
+aside.topic,
+div.admonition, div.topic, blockquote {
+    clear: left;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+    border: 1px solid #ccc;
+    padding: 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+nav.contents > :last-child,
+aside.topic > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+    margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+nav.contents::after,
+aside.topic::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+    display: block;
+    content: '';
+    clear: both;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    border: 0;
+    border-collapse: collapse;
+}
+
+table.align-center {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table.align-default {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table caption span.caption-number {
+    font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 5px;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+table.citation {
+    border-left: solid 1px gray;
+    margin-left: 1px;
+}
+
+table.citation td {
+    border-bottom: none;
+}
+
+th > :first-child,
+td > :first-child {
+    margin-top: 0px;
+}
+
+th > :last-child,
+td > :last-child {
+    margin-bottom: 0px;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure, figure {
+    margin: 0.5em;
+    padding: 0.5em;
+}
+
+div.figure p.caption, figcaption {
+    padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+    font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.field-name {
+    -moz-hyphens: manual;
+    -ms-hyphens: manual;
+    -webkit-hyphens: manual;
+    hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist {
+    margin: 1em 0;
+}
+
+table.hlist td {
+    vertical-align: top;
+}
+
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+	font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.sig-name {
+	font-size: 1.1em;
+}
+
+code.descname {
+    font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.sig-paren {
+    font-size: larger;
+}
+
+.sig-param.n {
+	font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+	font-family: unset;
+}
+
+.sig.c   .k, .sig.c   .kt,
+.sig.cpp .k, .sig.cpp .kt {
+	color: #0033B3;
+}
+
+.sig.c   .m,
+.sig.cpp .m {
+	color: #1750EB;
+}
+
+.sig.c   .s, .sig.c   .sc,
+.sig.cpp .s, .sig.cpp .sc {
+	color: #067D17;
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+    list-style: decimal;
+}
+
+ol.loweralpha {
+    list-style: lower-alpha;
+}
+
+ol.upperalpha {
+    list-style: upper-alpha;
+}
+
+ol.lowerroman {
+    list-style: lower-roman;
+}
+
+ol.upperroman {
+    list-style: upper-roman;
+}
+
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
+    margin-top: 0px;
+}
+
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+    margin-bottom: 0px;
+}
+
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+    margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+    margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+    margin-bottom: 0;
+}
+
+aside.footnote > span,
+div.citation > span {
+    float: left;
+}
+aside.footnote > span:last-of-type,
+div.citation > span:last-of-type {
+  padding-right: 0.5em;
+}
+aside.footnote > p {
+  margin-left: 2em;
+}
+div.citation > p {
+  margin-left: 4em;
+}
+aside.footnote > p:last-of-type,
+div.citation > p:last-of-type {
+    margin-bottom: 0em;
+}
+aside.footnote > p:last-of-type:after,
+div.citation > p:last-of-type:after {
+    content: "";
+    clear: both;
+}
+
+dl.field-list {
+    display: grid;
+    grid-template-columns: fit-content(30%) auto;
+}
+
+dl.field-list > dt {
+    font-weight: bold;
+    word-break: break-word;
+    padding-left: 0.5em;
+    padding-right: 5px;
+}
+
+dl.field-list > dd {
+    padding-left: 0.5em;
+    margin-top: 0em;
+    margin-left: 0em;
+    margin-bottom: 0em;
+}
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd > :first-child {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+    margin-bottom: 0;
+}
+
+dt:target, span.highlighted {
+    background-color: #fbe54e;
+}
+
+rect.highlighted {
+    fill: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+.footnote:target  {
+    background-color: #ffa;
+}
+
+.line-block {
+    display: block;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.line-block .line-block {
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+    font-family: sans-serif;
+}
+
+.accelerator {
+    text-decoration: underline;
+}
+
+.classifier {
+    font-style: oblique;
+}
+
+.classifier:before {
+    font-style: normal;
+    margin: 0 0.5em;
+    content: ":";
+    display: inline-block;
+}
+
+abbr, acronym {
+    border-bottom: dotted 1px;
+    cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+    overflow: auto;
+    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
+}
+
+pre, div[class*="highlight-"] {
+    clear: both;
+}
+
+span.pre {
+    -moz-hyphens: none;
+    -ms-hyphens: none;
+    -webkit-hyphens: none;
+    hyphens: none;
+    white-space: nowrap;
+}
+
+div[class*="highlight-"] {
+    margin: 1em 0;
+}
+
+td.linenos pre {
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    display: block;
+}
+
+table.highlighttable tbody {
+    display: block;
+}
+
+table.highlighttable tr {
+    display: flex;
+}
+
+table.highlighttable td {
+    margin: 0;
+    padding: 0;
+}
+
+table.highlighttable td.linenos {
+    padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+    flex: 1;
+    overflow: hidden;
+}
+
+.highlight .hll {
+    display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+    margin: 0;
+}
+
+div.code-block-caption + div {
+    margin-top: 0;
+}
+
+div.code-block-caption {
+    margin-top: 1em;
+    padding: 2px 5px;
+    font-size: small;
+}
+
+div.code-block-caption code {
+    background-color: transparent;
+}
+
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp {  /* gp: Generic.Prompt */
+  user-select: none;
+  -webkit-user-select: text; /* Safari fallback only */
+  -webkit-user-select: none; /* Chrome/Safari */
+  -moz-user-select: none; /* Firefox */
+  -ms-user-select: none; /* IE10+ */
+}
+
+div.code-block-caption span.caption-number {
+    padding: 0.1em 0.3em;
+    font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+    margin: 1em 0;
+}
+
+code.xref, a code {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+    background-color: transparent;
+}
+
+.viewcode-link {
+    float: right;
+}
+
+.viewcode-back {
+    float: right;
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    margin: -1px -10px;
+    padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+    vertical-align: middle;
+}
+
+div.body div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+span.eqno a.headerlink {
+    position: absolute;
+    z-index: 1;
+}
+
+div.math:hover a.headerlink {
+    visibility: visible;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0 !important;
+        width: 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    #top-link {
+        display: none;
+    }
+}
\ No newline at end of file
diff --git a/pull/45/_static/copybutton.js b/pull/45/_static/copybutton.js
new file mode 100644
index 0000000..8f12e23
--- /dev/null
+++ b/pull/45/_static/copybutton.js
@@ -0,0 +1,62 @@
+$(document).ready(function() {
+    /* Add a [>>>] button on the top-right corner of code samples to hide
+     * the >>> and ... prompts and the output and thus make the code
+     * copyable. */
+    var div = $('.highlight-python .highlight,' +
+                '.highlight-python3 .highlight,' +
+                '.highlight-default .highlight')
+    var pre = div.find('pre');
+
+    // get the styles from the current theme
+    pre.parent().parent().css('position', 'relative');
+    var hide_text = 'Hide the prompts and output';
+    var show_text = 'Show the prompts and output';
+    var border_width = pre.css('border-top-width');
+    var border_style = pre.css('border-top-style');
+    var border_color = pre.css('border-top-color');
+    var button_styles = {
+        'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0',
+        'border-color': border_color, 'border-style': border_style,
+        'border-width': border_width, 'color': border_color, 'text-size': '75%',
+        'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em',
+        'border-radius': '0 3px 0 0'
+    }
+
+    // create and add the button to all the code blocks that contain >>>
+    div.each(function(index) {
+        var jthis = $(this);
+        if (jthis.find('.gp').length > 0) {
+            var button = $('<span class="copybutton">&gt;&gt;&gt;</span>');
+            button.css(button_styles)
+            button.attr('title', hide_text);
+            button.data('hidden', 'false');
+            jthis.prepend(button);
+        }
+        // tracebacks (.gt) contain bare text elements that need to be
+        // wrapped in a span to work with .nextUntil() (see later)
+        jthis.find('pre:has(.gt)').contents().filter(function() {
+            return ((this.nodeType == 3) && (this.data.trim().length > 0));
+        }).wrap('<span>');
+    });
+
+    // define the behavior of the button when it's clicked
+    $('.copybutton').click(function(e){
+        e.preventDefault();
+        var button = $(this);
+        if (button.data('hidden') === 'false') {
+            // hide the code output
+            button.parent().find('.go, .gp, .gt').hide();
+            button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden');
+            button.css('text-decoration', 'line-through');
+            button.attr('title', show_text);
+            button.data('hidden', 'true');
+        } else {
+            // show the code output
+            button.parent().find('.go, .gp, .gt').show();
+            button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible');
+            button.css('text-decoration', 'none');
+            button.attr('title', hide_text);
+            button.data('hidden', 'false');
+        }
+    });
+});
diff --git a/pull/45/_static/doctools.js b/pull/45/_static/doctools.js
new file mode 100644
index 0000000..d06a71d
--- /dev/null
+++ b/pull/45/_static/doctools.js
@@ -0,0 +1,156 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Base JavaScript utilities for all Sphinx HTML documentation.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
+  "TEXTAREA",
+  "INPUT",
+  "SELECT",
+  "BUTTON",
+]);
+
+const _ready = (callback) => {
+  if (document.readyState !== "loading") {
+    callback();
+  } else {
+    document.addEventListener("DOMContentLoaded", callback);
+  }
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const Documentation = {
+  init: () => {
+    Documentation.initDomainIndexTable();
+    Documentation.initOnKeyListeners();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS: {},
+  PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
+  LOCALE: "unknown",
+
+  // gettext and ngettext don't access this so that the functions
+  // can safely bound to a different name (_ = Documentation.gettext)
+  gettext: (string) => {
+    const translated = Documentation.TRANSLATIONS[string];
+    switch (typeof translated) {
+      case "undefined":
+        return string; // no translation
+      case "string":
+        return translated; // translation exists
+      default:
+        return translated[0]; // (singular, plural) translation tuple exists
+    }
+  },
+
+  ngettext: (singular, plural, n) => {
+    const translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated !== "undefined")
+      return translated[Documentation.PLURAL_EXPR(n)];
+    return n === 1 ? singular : plural;
+  },
+
+  addTranslations: (catalog) => {
+    Object.assign(Documentation.TRANSLATIONS, catalog.messages);
+    Documentation.PLURAL_EXPR = new Function(
+      "n",
+      `return (${catalog.plural_expr})`
+    );
+    Documentation.LOCALE = catalog.locale;
+  },
+
+  /**
+   * helper function to focus on search bar
+   */
+  focusSearchBar: () => {
+    document.querySelectorAll("input[name=q]")[0]?.focus();
+  },
+
+  /**
+   * Initialise the domain index toggle buttons
+   */
+  initDomainIndexTable: () => {
+    const toggler = (el) => {
+      const idNumber = el.id.substr(7);
+      const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
+      if (el.src.substr(-9) === "minus.png") {
+        el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
+        toggledRows.forEach((el) => (el.style.display = "none"));
+      } else {
+        el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
+        toggledRows.forEach((el) => (el.style.display = ""));
+      }
+    };
+
+    const togglerElements = document.querySelectorAll("img.toggler");
+    togglerElements.forEach((el) =>
+      el.addEventListener("click", (event) => toggler(event.currentTarget))
+    );
+    togglerElements.forEach((el) => (el.style.display = ""));
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
+  },
+
+  initOnKeyListeners: () => {
+    // only install a listener if it is really needed
+    if (
+      !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
+      !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
+    )
+      return;
+
+    document.addEventListener("keydown", (event) => {
+      // bail for input elements
+      if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+      // bail with special keys
+      if (event.altKey || event.ctrlKey || event.metaKey) return;
+
+      if (!event.shiftKey) {
+        switch (event.key) {
+          case "ArrowLeft":
+            if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+            const prevLink = document.querySelector('link[rel="prev"]');
+            if (prevLink && prevLink.href) {
+              window.location.href = prevLink.href;
+              event.preventDefault();
+            }
+            break;
+          case "ArrowRight":
+            if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+            const nextLink = document.querySelector('link[rel="next"]');
+            if (nextLink && nextLink.href) {
+              window.location.href = nextLink.href;
+              event.preventDefault();
+            }
+            break;
+        }
+      }
+
+      // some keyboard layouts may need Shift to get /
+      switch (event.key) {
+        case "/":
+          if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
+          Documentation.focusSearchBar();
+          event.preventDefault();
+      }
+    });
+  },
+};
+
+// quick alias for translations
+const _ = Documentation.gettext;
+
+_ready(Documentation.init);
diff --git a/pull/45/_static/documentation_options.js b/pull/45/_static/documentation_options.js
new file mode 100644
index 0000000..cf359c0
--- /dev/null
+++ b/pull/45/_static/documentation_options.js
@@ -0,0 +1,14 @@
+var DOCUMENTATION_OPTIONS = {
+    URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
+    VERSION: '0.1',
+    LANGUAGE: 'en',
+    COLLAPSE_INDEX: false,
+    BUILDER: 'html',
+    FILE_SUFFIX: '.html',
+    LINK_SUFFIX: '.html',
+    HAS_SOURCE: true,
+    SOURCELINK_SUFFIX: '.txt',
+    NAVIGATION_WITH_KEYS: false,
+    SHOW_SEARCH_SUMMARY: true,
+    ENABLE_SEARCH_SHORTCUTS: true,
+};
\ No newline at end of file
diff --git a/pull/45/_static/file.png b/pull/45/_static/file.png
new file mode 100644
index 0000000..a858a41
Binary files /dev/null and b/pull/45/_static/file.png differ
diff --git a/pull/45/_static/intel_logo.png b/pull/45/_static/intel_logo.png
new file mode 100644
index 0000000..08a8ca1
Binary files /dev/null and b/pull/45/_static/intel_logo.png differ
diff --git a/pull/45/_static/language_data.js b/pull/45/_static/language_data.js
new file mode 100644
index 0000000..250f566
--- /dev/null
+++ b/pull/45/_static/language_data.js
@@ -0,0 +1,199 @@
+/*
+ * language_data.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * This script contains the language-specific data used by searchtools.js,
+ * namely the list of stopwords, stemmer, scorer and splitter.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
+
+
+/* Non-minified version is copied as a separate JS file, is available */
+
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
diff --git a/pull/45/_static/minus.png b/pull/45/_static/minus.png
new file mode 100644
index 0000000..d96755f
Binary files /dev/null and b/pull/45/_static/minus.png differ
diff --git a/pull/45/_static/nbsphinx-broken-thumbnail.svg b/pull/45/_static/nbsphinx-broken-thumbnail.svg
new file mode 100644
index 0000000..4919ca8
--- /dev/null
+++ b/pull/45/_static/nbsphinx-broken-thumbnail.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+  <style>
+    svg { fill: lightcoral; }
+    @media (prefers-color-scheme: dark) {
+      svg { fill: crimson; }
+    }
+  </style>
+  <path d="m 80.856887,38.34474 h 2.903414 l 7.066397,13.332221 V 38.34474 h 2.092166 V 54.281494 H 90.01545 L 82.949053,40.949273 v 13.332221 h -2.092166 z m -13.812565,0 h 10.076555 v 1.814633 h -7.920343 v 4.718048 h 7.589439 v 1.814634 h -7.589439 v 5.774805 h 8.11248 v 1.814634 H 67.044322 Z m -14.335606,0 h 2.156212 v 6.735493 L 62.01672,38.34474 h 2.775323 l -7.909669,7.429324 8.475407,8.50743 h -2.839368 l -7.653485,-7.674833 v 7.674833 h -2.156212 z m -10.738365,1.462381 q -2.348349,0 -3.73601,1.750588 -1.376987,1.750588 -1.376987,4.771419 0,3.010158 1.376987,4.760746 1.387661,1.750587 3.73601,1.750587 2.34835,0 3.714663,-1.750587 1.376986,-1.750588 1.376986,-4.760746 0,-3.020831 -1.376986,-4.771419 -1.366313,-1.750588 -3.714663,-1.750588 z m 0,-1.750588 q 3.351736,0 5.358507,2.252281 2.006772,2.241606 2.006772,6.020314 0,3.768034 -2.006772,6.020315 -2.006771,2.241606 -5.358507,2.241606 -3.362409,0 -5.379855,-2.241606 -2.006772,-2.241607 -2.006772,-6.020315 0,-3.778708 2.006772,-6.020314 2.017446,-2.252281 5.379855,-2.252281 z m -14.100771,8.75294 q 0.693831,0.234835 1.344964,1.003385 0.661808,0.768551 1.323615,2.113515 l 2.188235,4.355121 H 30.410068 L 28.371273,50.193231 Q 27.581374,48.592083 26.834172,48.069042 26.097644,47.546 24.816726,47.546 h -2.34835 v 6.735494 H 20.312164 V 38.34474 h 4.867489 q 2.732625,0 4.077588,1.142152 1.344964,1.142151 1.344964,3.447804 0,1.505078 -0.704505,2.49779 -0.69383,0.992711 -2.02812,1.376987 z m -5.401204,-6.692797 v 5.657388 h 2.711277 q 1.55845,0 2.348349,-0.715179 0.800574,-0.725854 0.800574,-2.124189 0,-1.398336 -0.800574,-2.102841 -0.789899,-0.715179 -2.348349,-0.715179 z M 7.4709616,46.670707 v 5.838851 H 10.92944 q 1.739914,0 2.57251,-0.71518 0.843271,-0.725853 0.843271,-2.209583 0,-1.494404 -0.843271,-2.198909 -0.832596,-0.715179 -2.57251,-0.715179 z m 0,-6.554031 v 4.803443 h 3.1916204 q 1.579799,0 2.34835,-0.587088 0.779225,-0.597761 0.779225,-1.814634 0,-1.206197 -0.779225,-1.803959 -0.768551,-0.597762 -2.34835,-0.597762 z M 5.3147497,38.34474 h 5.5079473 q 2.465767,0 3.800057,1.024734 1.334289,1.024734 1.334289,2.914088 0,1.462382 -0.683156,2.327001 -0.683156,0.86462 -2.006772,1.078106 1.590474,0.341579 2.465768,1.430359 0.885968,1.078106 0.885968,2.700602 0,2.134863 -1.451707,3.298364 -1.451707,1.1635 -4.130961,1.1635 H 5.3147497 Z M 65.365328,74.550032 H 67.52154 V 88.67217 h 7.760238 v 1.814634 h -9.91645 z m -6.447298,0 h 2.156214 V 90.486804 H 58.91803 Z m -9.955303,2.124192 -2.924765,7.931025 h 5.860208 z m -1.216872,-2.124192 h 2.444423 l 6.073692,15.936772 h -2.241606 l -1.451709,-4.088268 h -7.183824 l -1.451707,4.088268 H 41.66149 Z m -21.264514,0 h 2.903417 L 36.45116,87.882271 V 74.550032 h 2.092171 V 90.486804 H 35.639914 L 28.573506,77.154569 v 13.332235 h -2.092165 z m 53.454813,-9.781663 v 5.838858 h 3.458479 q 1.739919,0 2.572513,-0.71518 0.843272,-0.725854 0.843272,-2.209586 0,-1.494406 -0.843272,-2.198912 -0.832594,-0.71518 -2.572513,-0.71518 z m 0,-6.554037 v 4.803447 h 3.191622 q 1.579803,0 2.348355,-0.587087 0.779225,-0.597763 0.779225,-1.814636 0,-1.206199 -0.779225,-1.803962 -0.768552,-0.597762 -2.348355,-0.597762 z m -2.156212,-1.771939 h 5.507949 q 2.465772,0 3.800065,1.024736 1.334288,1.024735 1.334288,2.914092 0,1.462383 -0.683157,2.327003 -0.683157,0.864621 -2.006771,1.078107 1.590471,0.341579 2.46577,1.43036 0.885967,1.078107 0.885967,2.700605 0,2.134866 -1.451708,3.298368 -1.451709,1.163502 -4.130963,1.163502 h -5.72144 z m -18.86154,0 h 3.212969 l 4.066921,10.845118 4.088269,-10.845118 H 73.49953 V 72.379166 H 71.396692 V 58.385121 L 67.287075,69.315634 H 65.120183 L 61.010567,58.385121 v 13.994045 h -2.092165 z m -16.246333,0 h 2.166892 v 9.681616 q 0,2.561839 0.928668,3.693318 0.928667,1.120804 3.010159,1.120804 2.070819,0 2.999486,-1.120804 0.928667,-1.131479 0.928667,-3.693318 v -9.681616 h 2.166886 v 9.948474 q 0,3.116904 -1.547776,4.70738 -1.537104,1.590474 -4.547263,1.590474 -3.020833,0 -4.568615,-1.590474 -1.537104,-1.590476 -1.537104,-4.70738 z m -16.192953,0 h 2.156213 v 6.532689 h 7.83496 v -6.532689 h 2.156213 v 15.936773 h -2.156213 v -7.589448 h -7.83496 v 7.589448 h -2.156213 z m -15.563168,0 h 13.481671 v 1.814636 H 18.740226 V 72.379166 H 16.573339 V 58.257029 h -5.657391 z" />
+</svg>
diff --git a/pull/45/_static/nbsphinx-code-cells.css b/pull/45/_static/nbsphinx-code-cells.css
new file mode 100644
index 0000000..a3fb27c
--- /dev/null
+++ b/pull/45/_static/nbsphinx-code-cells.css
@@ -0,0 +1,259 @@
+/* remove conflicting styling from Sphinx themes */
+div.nbinput.container div.prompt *,
+div.nboutput.container div.prompt *,
+div.nbinput.container div.input_area pre,
+div.nboutput.container div.output_area pre,
+div.nbinput.container div.input_area .highlight,
+div.nboutput.container div.output_area .highlight {
+    border: none;
+    padding: 0;
+    margin: 0;
+    box-shadow: none;
+}
+
+div.nbinput.container > div[class*=highlight],
+div.nboutput.container > div[class*=highlight] {
+    margin: 0;
+}
+
+div.nbinput.container div.prompt *,
+div.nboutput.container div.prompt * {
+    background: none;
+}
+
+div.nboutput.container div.output_area .highlight,
+div.nboutput.container div.output_area pre {
+    background: unset;
+}
+
+div.nboutput.container div.output_area div.highlight {
+    color: unset;  /* override Pygments text color */
+}
+
+/* avoid gaps between output lines */
+div.nboutput.container div[class*=highlight] pre {
+    line-height: normal;
+}
+
+/* input/output containers */
+div.nbinput.container,
+div.nboutput.container {
+    display: -webkit-flex;
+    display: flex;
+    align-items: flex-start;
+    margin: 0;
+    width: 100%;
+}
+@media (max-width: 540px) {
+    div.nbinput.container,
+    div.nboutput.container {
+        flex-direction: column;
+    }
+}
+
+/* input container */
+div.nbinput.container {
+    padding-top: 5px;
+}
+
+/* last container */
+div.nblast.container {
+    padding-bottom: 5px;
+}
+
+/* input prompt */
+div.nbinput.container div.prompt pre,
+/* for sphinx_immaterial theme: */
+div.nbinput.container div.prompt pre > code {
+    color: #307FC1;
+}
+
+/* output prompt */
+div.nboutput.container div.prompt pre,
+/* for sphinx_immaterial theme: */
+div.nboutput.container div.prompt pre > code {
+    color: #BF5B3D;
+}
+
+/* all prompts */
+div.nbinput.container div.prompt,
+div.nboutput.container div.prompt {
+    width: 4.5ex;
+    padding-top: 5px;
+    position: relative;
+    user-select: none;
+}
+
+div.nbinput.container div.prompt > div,
+div.nboutput.container div.prompt > div {
+    position: absolute;
+    right: 0;
+    margin-right: 0.3ex;
+}
+
+@media (max-width: 540px) {
+    div.nbinput.container div.prompt,
+    div.nboutput.container div.prompt {
+        width: unset;
+        text-align: left;
+        padding: 0.4em;
+    }
+    div.nboutput.container div.prompt.empty {
+        padding: 0;
+    }
+
+    div.nbinput.container div.prompt > div,
+    div.nboutput.container div.prompt > div {
+        position: unset;
+    }
+}
+
+/* disable scrollbars and line breaks on prompts */
+div.nbinput.container div.prompt pre,
+div.nboutput.container div.prompt pre {
+    overflow: hidden;
+    white-space: pre;
+}
+
+/* input/output area */
+div.nbinput.container div.input_area,
+div.nboutput.container div.output_area {
+    -webkit-flex: 1;
+    flex: 1;
+    overflow: auto;
+}
+@media (max-width: 540px) {
+    div.nbinput.container div.input_area,
+    div.nboutput.container div.output_area {
+        width: 100%;
+    }
+}
+
+/* input area */
+div.nbinput.container div.input_area {
+    border: 1px solid #e0e0e0;
+    border-radius: 2px;
+    /*background: #f5f5f5;*/
+}
+
+/* override MathJax center alignment in output cells */
+div.nboutput.container div[class*=MathJax] {
+    text-align: left !important;
+}
+
+/* override sphinx.ext.imgmath center alignment in output cells */
+div.nboutput.container div.math p {
+    text-align: left;
+}
+
+/* standard error */
+div.nboutput.container div.output_area.stderr {
+    background: #fdd;
+}
+
+/* ANSI colors */
+.ansi-black-fg { color: #3E424D; }
+.ansi-black-bg { background-color: #3E424D; }
+.ansi-black-intense-fg { color: #282C36; }
+.ansi-black-intense-bg { background-color: #282C36; }
+.ansi-red-fg { color: #E75C58; }
+.ansi-red-bg { background-color: #E75C58; }
+.ansi-red-intense-fg { color: #B22B31; }
+.ansi-red-intense-bg { background-color: #B22B31; }
+.ansi-green-fg { color: #00A250; }
+.ansi-green-bg { background-color: #00A250; }
+.ansi-green-intense-fg { color: #007427; }
+.ansi-green-intense-bg { background-color: #007427; }
+.ansi-yellow-fg { color: #DDB62B; }
+.ansi-yellow-bg { background-color: #DDB62B; }
+.ansi-yellow-intense-fg { color: #B27D12; }
+.ansi-yellow-intense-bg { background-color: #B27D12; }
+.ansi-blue-fg { color: #208FFB; }
+.ansi-blue-bg { background-color: #208FFB; }
+.ansi-blue-intense-fg { color: #0065CA; }
+.ansi-blue-intense-bg { background-color: #0065CA; }
+.ansi-magenta-fg { color: #D160C4; }
+.ansi-magenta-bg { background-color: #D160C4; }
+.ansi-magenta-intense-fg { color: #A03196; }
+.ansi-magenta-intense-bg { background-color: #A03196; }
+.ansi-cyan-fg { color: #60C6C8; }
+.ansi-cyan-bg { background-color: #60C6C8; }
+.ansi-cyan-intense-fg { color: #258F8F; }
+.ansi-cyan-intense-bg { background-color: #258F8F; }
+.ansi-white-fg { color: #C5C1B4; }
+.ansi-white-bg { background-color: #C5C1B4; }
+.ansi-white-intense-fg { color: #A1A6B2; }
+.ansi-white-intense-bg { background-color: #A1A6B2; }
+
+.ansi-default-inverse-fg { color: #FFFFFF; }
+.ansi-default-inverse-bg { background-color: #000000; }
+
+.ansi-bold { font-weight: bold; }
+.ansi-underline { text-decoration: underline; }
+
+
+div.nbinput.container div.input_area div[class*=highlight] > pre,
+div.nboutput.container div.output_area div[class*=highlight] > pre,
+div.nboutput.container div.output_area div[class*=highlight].math,
+div.nboutput.container div.output_area.rendered_html,
+div.nboutput.container div.output_area > div.output_javascript,
+div.nboutput.container div.output_area:not(.rendered_html) > img{
+    padding: 5px;
+    margin: 0;
+}
+
+/* fix copybtn overflow problem in chromium (needed for 'sphinx_copybutton') */
+div.nbinput.container div.input_area > div[class^='highlight'],
+div.nboutput.container div.output_area > div[class^='highlight']{
+    overflow-y: hidden;
+}
+
+/* hide copy button on prompts for 'sphinx_copybutton' extension ... */
+.prompt .copybtn,
+/* ... and 'sphinx_immaterial' theme */
+.prompt .md-clipboard.md-icon {
+    display: none;
+}
+
+/* Some additional styling taken form the Jupyter notebook CSS */
+.jp-RenderedHTMLCommon table,
+div.rendered_html table {
+  border: none;
+  border-collapse: collapse;
+  border-spacing: 0;
+  color: black;
+  font-size: 12px;
+  table-layout: fixed;
+}
+.jp-RenderedHTMLCommon thead,
+div.rendered_html thead {
+  border-bottom: 1px solid black;
+  vertical-align: bottom;
+}
+.jp-RenderedHTMLCommon tr,
+.jp-RenderedHTMLCommon th,
+.jp-RenderedHTMLCommon td,
+div.rendered_html tr,
+div.rendered_html th,
+div.rendered_html td {
+  text-align: right;
+  vertical-align: middle;
+  padding: 0.5em 0.5em;
+  line-height: normal;
+  white-space: normal;
+  max-width: none;
+  border: none;
+}
+.jp-RenderedHTMLCommon th,
+div.rendered_html th {
+  font-weight: bold;
+}
+.jp-RenderedHTMLCommon tbody tr:nth-child(odd),
+div.rendered_html tbody tr:nth-child(odd) {
+  background: #f5f5f5;
+}
+.jp-RenderedHTMLCommon tbody tr:hover,
+div.rendered_html tbody tr:hover {
+  background: rgba(66, 165, 245, 0.2);
+}
+
diff --git a/pull/45/_static/nbsphinx-gallery.css b/pull/45/_static/nbsphinx-gallery.css
new file mode 100644
index 0000000..365c27a
--- /dev/null
+++ b/pull/45/_static/nbsphinx-gallery.css
@@ -0,0 +1,31 @@
+.nbsphinx-gallery {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
+    gap: 5px;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.nbsphinx-gallery > a {
+    padding: 5px;
+    border: 1px dotted currentColor;
+    border-radius: 2px;
+    text-align: center;
+}
+
+.nbsphinx-gallery > a:hover {
+    border-style: solid;
+}
+
+.nbsphinx-gallery img {
+    max-width: 100%;
+    max-height: 100%;
+}
+
+.nbsphinx-gallery > a > div:first-child {
+    display: flex;
+    align-items: start;
+    justify-content: center;
+    height: 120px;
+    margin-bottom: 5px;
+}
diff --git a/pull/45/_static/nbsphinx-no-thumbnail.svg b/pull/45/_static/nbsphinx-no-thumbnail.svg
new file mode 100644
index 0000000..9dca758
--- /dev/null
+++ b/pull/45/_static/nbsphinx-no-thumbnail.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+  <style>
+    svg { fill: #ccc; }
+    @media (prefers-color-scheme: dark) {
+      svg { fill: #999; }
+    }
+  </style>
+  <path d="M 65.365328,74.550032 H 67.52154 V 88.67217 h 7.760238 v 1.814634 h -9.91645 z m -6.447298,0 h 2.156214 V 90.486804 H 58.91803 Z m -9.955303,2.124192 -2.924765,7.931025 h 5.860208 z m -1.216872,-2.124192 h 2.444423 l 6.073692,15.936772 h -2.241606 l -1.451709,-4.088268 h -7.183824 l -1.451707,4.088268 H 41.66149 Z m -21.264514,0 h 2.903417 L 36.45116,87.882271 V 74.550032 h 2.092171 V 90.486804 H 35.639914 L 28.573506,77.154569 v 13.332235 h -2.092165 z m 53.454813,-9.781663 v 5.838858 h 3.458479 q 1.739919,0 2.572513,-0.71518 0.843272,-0.725854 0.843272,-2.209586 0,-1.494406 -0.843272,-2.198912 -0.832594,-0.71518 -2.572513,-0.71518 z m 0,-6.554037 v 4.803447 h 3.191622 q 1.579803,0 2.348355,-0.587087 0.779225,-0.597763 0.779225,-1.814636 0,-1.206199 -0.779225,-1.803962 -0.768552,-0.597762 -2.348355,-0.597762 z m -2.156212,-1.771939 h 5.507949 q 2.465772,0 3.800065,1.024736 1.334288,1.024735 1.334288,2.914092 0,1.462383 -0.683157,2.327003 -0.683157,0.864621 -2.006771,1.078107 1.590471,0.341579 2.46577,1.43036 0.885967,1.078107 0.885967,2.700605 0,2.134866 -1.451708,3.298368 -1.451709,1.163502 -4.130963,1.163502 h -5.72144 z m -18.86154,0 h 3.212969 l 4.066921,10.845118 4.088269,-10.845118 H 73.49953 V 72.379166 H 71.396692 V 58.385121 L 67.287075,69.315634 H 65.120183 L 61.010567,58.385121 v 13.994045 h -2.092165 z m -16.246333,0 h 2.166892 v 9.681616 q 0,2.561839 0.928668,3.693318 0.928667,1.120804 3.010159,1.120804 2.070819,0 2.999486,-1.120804 0.928667,-1.131479 0.928667,-3.693318 v -9.681616 h 2.166886 v 9.948474 q 0,3.116904 -1.547776,4.70738 -1.537104,1.590474 -4.547263,1.590474 -3.020833,0 -4.568615,-1.590474 -1.537104,-1.590476 -1.537104,-4.70738 z m -16.192953,0 h 2.156213 v 6.532689 h 7.83496 v -6.532689 h 2.156213 v 15.936773 h -2.156213 v -7.589448 h -7.83496 v 7.589448 h -2.156213 z m -15.563168,0 h 13.481671 v 1.814636 H 18.740226 V 72.379166 H 16.573339 V 58.257029 H 10.915948 Z M 65.497127,39.809967 q -2.34835,0 -3.736011,1.750588 -1.376987,1.750588 -1.376987,4.771419 0,3.010157 1.376987,4.760745 1.387661,1.750588 3.736011,1.750588 2.348349,0 3.714662,-1.750588 1.376986,-1.750588 1.376986,-4.760745 0,-3.020831 -1.376986,-4.771419 -1.366313,-1.750588 -3.714662,-1.750588 z m 0,-1.750588 q 3.351735,0 5.358506,2.252281 2.006772,2.241606 2.006772,6.020314 0,3.768034 -2.006772,6.020315 -2.006771,2.241606 -5.358506,2.241606 -3.36241,0 -5.379856,-2.241606 -2.006771,-2.241607 -2.006771,-6.020315 0,-3.778708 2.006771,-6.020314 2.017446,-2.252281 5.379856,-2.252281 z m -22.821688,0.288206 h 2.903414 L 52.64525,51.679807 V 38.347585 h 2.092166 V 54.28434 H 51.834001 L 44.767605,40.952119 V 54.28434 h -2.092166 z" />
+</svg>
diff --git a/pull/45/_static/plus.png b/pull/45/_static/plus.png
new file mode 100644
index 0000000..7107cec
Binary files /dev/null and b/pull/45/_static/plus.png differ
diff --git a/pull/45/_static/pygments.css b/pull/45/_static/pygments.css
new file mode 100644
index 0000000..691aeb8
--- /dev/null
+++ b/pull/45/_static/pygments.css
@@ -0,0 +1,74 @@
+pre { line-height: 125%; }
+td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+.highlight .hll { background-color: #ffffcc }
+.highlight { background: #eeffcc; }
+.highlight .c { color: #408090; font-style: italic } /* Comment */
+.highlight .err { border: 1px solid #FF0000 } /* Error */
+.highlight .k { color: #007020; font-weight: bold } /* Keyword */
+.highlight .o { color: #666666 } /* Operator */
+.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #007020 } /* Comment.Preproc */
+.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
+.highlight .gd { color: #A00000 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #FF0000 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #00A000 } /* Generic.Inserted */
+.highlight .go { color: #333333 } /* Generic.Output */
+.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #0044DD } /* Generic.Traceback */
+.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #007020 } /* Keyword.Pseudo */
+.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #902000 } /* Keyword.Type */
+.highlight .m { color: #208050 } /* Literal.Number */
+.highlight .s { color: #4070a0 } /* Literal.String */
+.highlight .na { color: #4070a0 } /* Name.Attribute */
+.highlight .nb { color: #007020 } /* Name.Builtin */
+.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.highlight .no { color: #60add5 } /* Name.Constant */
+.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.highlight .ne { color: #007020 } /* Name.Exception */
+.highlight .nf { color: #06287e } /* Name.Function */
+.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
+.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #bb60d5 } /* Name.Variable */
+.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mb { color: #208050 } /* Literal.Number.Bin */
+.highlight .mf { color: #208050 } /* Literal.Number.Float */
+.highlight .mh { color: #208050 } /* Literal.Number.Hex */
+.highlight .mi { color: #208050 } /* Literal.Number.Integer */
+.highlight .mo { color: #208050 } /* Literal.Number.Oct */
+.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
+.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
+.highlight .sc { color: #4070a0 } /* Literal.String.Char */
+.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
+.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
+.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
+.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.highlight .sx { color: #c65d09 } /* Literal.String.Other */
+.highlight .sr { color: #235388 } /* Literal.String.Regex */
+.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
+.highlight .ss { color: #517918 } /* Literal.String.Symbol */
+.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #06287e } /* Name.Function.Magic */
+.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
+.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
+.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
+.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
+.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/pull/45/_static/sdc.css b/pull/45/_static/sdc.css
new file mode 100644
index 0000000..e777ebd
--- /dev/null
+++ b/pull/45/_static/sdc.css
@@ -0,0 +1,694 @@
+/*!
+ * Bootstrap v1.4.0
+ *
+ * Copyright 2011 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Heavily modified by Kyle Barbary for the AstroPy Project for use with Sphinx.
+ * Modified by Intel Corporation for Intel(R) Scalable Dataframe Compiler
+ */
+
+@import url("basic.css");
+
+/* Caption text --------------------------------------------------------------*/
+span-caption-text {
+  font-weight: bold;
+}
+
+/* Body text -----------------------------------------------------------------*/
+body {
+  background-color: #ffffff;
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 18px;
+  color: #001d33;
+}
+
+/* Hyperlinks ----------------------------------------------------------------*/
+
+a {
+  color: #0069d6;
+  text-decoration: none;
+  line-height: inherit;
+  font-weight: inherit;
+}
+
+a:hover {
+  color: #00438a;
+  text-decoration: underline;
+}
+
+/* Typography ----------------------------------------------------------------*/
+
+h1,h2,h3,h4,h5,h6 {
+  color: #003a66;
+  margin: 0.7em 0 0 0;
+  line-height: 1.5em;
+}
+h1 {
+  font-size: 26px;
+  margin: 0;
+}
+h2 {
+  font-size: 20px;
+  line-height: 1.2em;
+  margin: 1em 0 0.5em 0;
+  border-bottom: 1px solid #0070c5;
+}
+h3 {
+  font-size: 18px;
+}
+h4 {
+  font-size: 16px;
+}
+h5 {
+  font-size: 14px;
+}
+h6 {
+  font-size: 13px;
+  text-transform: uppercase;
+}
+
+p {
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 18px;
+  margin-top: 0px;
+  margin-bottom: 9px;
+}
+
+ul, ol {
+  margin-left: 0;
+  padding: 0 0 0 25px;
+}
+ul ul, ul ol, ol ol, ol ul {
+  margin-bottom: 0;
+}
+ul {
+  list-style: disc;
+}
+ol {
+  list-style: decimal;
+}
+li {
+  line-height: 18px;
+  color: #000010;
+}
+ul.unstyled {
+  list-style: none;
+  margin-left: 0;
+}
+dl {
+  margin-bottom: 18px;
+}
+dl dt, dl dd {
+  line-height: 18px;
+}
+dl dd {
+  margin-left: 9px;
+}
+hr {
+  margin: 20px 0 19px;
+  border: 0;
+  border-bottom: 1px solid #eee;
+}
+strong {
+  font-style: inherit;
+  font-weight: bold;
+}
+em {
+  font-style: italic;
+  font-weight: inherit;
+  line-height: inherit;
+}
+.muted {
+  color: #bfbfbf;
+}
+
+address {
+  display: block;
+  line-height: 18px;
+  margin-bottom: 18px;
+}
+code, pre {
+  padding: 0 3px 2px;
+  font-family: monospace;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+tt {
+  font-family: monospace;
+}
+code {
+  padding: 1px 3px;
+}
+pre {
+  display: block;
+  padding: 8.5px;
+  margin: 0 0 18px;
+  line-height: 18px;
+  border: 1px solid #ddd;
+  border: 1px solid rgba(0, 0, 0, 0.12);
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  white-space: pre;
+  word-wrap: break-word;
+}
+
+img {
+  margin: 9px 0;
+}
+
+/* format inline code with a rounded box */
+tt, code {
+    margin: 0 2px;
+    padding: 0 5px;
+    border: 1px solid #ddd;
+    border: 1px solid rgba(0, 0, 0, 0.12);
+    border-radius: 3px;
+}
+
+code.xref, a code {
+    margin: 0;
+    padding: 0 1px 0 1px;
+    background-color: transparent;
+    border: none;
+}
+
+/* all code has same box background color, even in headers */
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt,
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code,
+pre, code, tt {
+  background-color: #f8f8f8;
+}
+
+/* override box for links & other sphinx-specifc stuff */
+tt.xref, a tt, tt.descname, tt.descclassname {
+  padding: 0 1px 0 1px;
+  border: none;
+}
+
+/* override box for related bar at the top of the page */
+.related tt {
+  border: none;
+  padding: 0 1px 0 1px;
+  background-color: transparent;
+  font-weight: bold;
+}
+
+th {
+    background-color: #dddddd;
+}
+
+.viewcode-back {
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    background-color: #f4debf;
+    border-top: 1px solid #ac9;
+    border-bottom: 1px solid #ac9;
+}
+
+table.docutils {
+    border-spacing: 5px;
+    border-collapse: separate;
+}
+
+/* Topbar --------------------------------------------------------------------*/
+
+/* Horizontal bar */
+div.topbar {
+  height: 70px;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  z-index: 10000;
+  padding: 0px 10px;
+  background-color: #0070c5;
+  background-repeat: repeat-x;
+  background-image: -khtml-gradient(linear, left top, left bottom, from(#0070c5), to(#0091ff));
+  background-image: -moz-linear-gradient(top, #0070c5, #0091ff);
+  background-image: -ms-linear-gradient(top, #0070c5, #0091ff);
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #0070c5), color-stop(100%, #0091ff));
+  background-image: -webkit-linear-gradient(top, #0070c5, #0091ff);
+  background-image: -o-linear-gradient(top, #0070c5, #0091ff);
+  background-image: linear-gradient(to top, #0070c5, #0091ff);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0070c5', endColorstr='#0091ff', GradientType=0);
+  overflow-x: hidden;
+  overflow-y: hidden;
+  width: 100%;
+}
+
+/* Scalable Dataframe Compiler png */
+div.topbar a.brand_sdc {
+  width: 200px;
+  float: left;
+  display: block;
+  height: 60px;
+  padding: 8px 12px 0px 45px;
+  margin-left: -10px;
+  background: transparent url("DPEP.png") no-repeat 10px 4px;
+  background-size: 200px 50px;
+}
+
+
+div.topbar .brand:hover, div.topbar .brand_sdc:hover, div.topbar ul li a.homelink:hover {
+  background-color: #333;
+  background-color: rgba(255, 255, 255, 0.05);
+}
+
+div.topbar ul {
+    font-size: 120%;
+    list-style-type: none;
+    margin: 20px;
+    padding: 0 0 0 10px;
+    float: right;
+    color: #eeeeee;
+    text-align: center;
+    text-decoration: none;
+    height: 100%;
+    vertical-align: middle;
+}
+div.topbar ul li {
+    float: left;
+    display: inline-block;
+    height: 60px;
+    margin: 5px;
+    padding: 0px;
+    vertical-align: middle;
+}
+
+div.topbar ul li a {
+  color: #eeeeee;
+  text-decoration: none;
+  padding: 5px;
+  display: block;
+  height: auto;
+  text-align: center;
+  vertical-align: middle;
+  border-radius: 4px;
+}
+
+div.topbar ul li a:hover {
+  color: #ffffff;
+  text-decoration: none;
+}
+
+
+div.dropdown {
+    position: relative; /* Fixed this to relative */
+    display: inline-block;
+    z-index: 999999;
+}
+
+div.dropdown-content {
+    display: none; /* Fix this at none */
+    background-color: DimGray;
+    color: White;
+    width: 235px;
+    height: 155px;
+    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+    padding-top: 3px;
+    padding-right: 15px;
+    position: fixed;
+}
+
+div.dropdown:hover .dropdown-content {
+    display: block;
+}
+
+div.dropdown-content a {
+    display: block;
+}
+
+div.dropdown-content a:hover {
+    color: white;
+}
+
+div.dropdown a:hover {
+    color: #FF5000;
+}
+
+div.dropdown z:hover {
+    color: #FF5000;
+    width: 10px;
+    display: none;
+}
+
+div.dropdown z {
+    color: white;
+}
+
+div.dropdown:after {
+    content: "";
+    position: absolute;
+    right: -13px;
+    top: 9px;
+    width: 0;
+    height: 0;
+    border-left: 5px solid transparent;
+    border-right: 5px solid transparent;
+    border-top: 5px solid white;
+    z-index: 999999;
+}
+
+div.dropdown:hover {
+  cursor: pointer;
+}
+
+/* Intel(R) SDC Github page */
+div.topbar ul li a.homelink {
+  margin: -20px;
+  width: 90px;
+  display: block;
+  height: 60px;
+  padding: 5px 0px;
+  background: transparent url("sdc_github.png") no-repeat 5px 0px;
+  background-size: 60px 60px;
+}
+
+/* Intel(R) SDC Examples & Tutorials */
+div.topbar ul li a.exampleslink {
+  margin: -20px;
+  width: 90px;
+  display: block;
+  height: 60px;
+  padding: 5px 0px;
+  background: transparent url("sdc_examples.png") no-repeat 5px 0px;
+  background-size: 60px 60px;
+}
+
+/* Intel(R) SDC Email */
+div.topbar ul li a.emaillink {
+  margin: -20px;
+  width: 90px;
+  display: block;
+  height: 60px;
+  padding: 5px 0px;
+  background: transparent url("sdc_email.png") no-repeat 5px 0px;
+  background-size: 60px 60px;
+}
+
+/* Intel(R) SDC Issues */
+div.topbar ul li a.issueslink {
+  margin: -20px;
+  width: 90px;
+  display: block;
+  height: 60px;
+  padding: 5px 0px;
+  background: transparent url("sdc_issues.png") no-repeat 5px 0px;
+  background-size: 60px 60px;
+}
+
+
+div.topbar form {
+  text-align: left;
+  margin: 0 0 0 5px;
+  position: relative;
+  filter: alpha(opacity=100);
+  -khtml-opacity: 1;
+  -moz-opacity: 1;
+  opacity: 1;
+}
+
+div.topbar input {
+  background-color: #444;
+  background-color: rgba(255, 255, 255, 0.3);
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: medium;
+  font-weight: 200;
+  line-height: 1;
+  padding: 4px 9px;
+  color: #ffffff;
+  color: rgba(255, 255, 255, 0.75);
+  border: 1px solid #111;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
+  -webkit-transition: none;
+  -moz-transition: none;
+  -ms-transition: none;
+  -o-transition: none;
+  transition: none;
+}
+div.topbar input:-moz-placeholder {
+  color: #e6e6e6;
+}
+div.topbar input::-webkit-input-placeholder {
+  color: #e6e6e6;
+}
+div.topbar input:hover {
+  background-color: #bfbfbf;
+  background-color: rgba(255, 255, 255, 0.5);
+  color: #ffffff;
+}
+div.topbar input:focus, div.topbar input.focused {
+  outline: 0;
+  background-color: #ffffff;
+  color: #0070c5;
+  text-shadow: 0 1px 0 #ffffff;
+  border: 0;
+  padding: 5px 10px;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+
+/* Relation bar (breadcrumbs, prev, next) ------------------------------------*/
+
+div.related {
+    height: 21px;
+    width: auto;
+    margin: 0 10px;
+    position: relative;
+    top: 42px;
+    clear: both;
+    left: 0;
+    right: 0;
+    z-index: 999;
+    font-size: 100%;
+    vertical-align: middle;
+    background-color: #fff;
+    border-bottom: 1px solid #bbb;
+}
+div.related ul {
+    padding: 0;
+    margin: 0;
+}
+
+
+/* Footer --------------------------------------------------------------------*/
+
+footer {
+  display: block;
+  margin: 10px 10px 0px;
+  padding: 10px 0 0 0;
+  border-top: 1px solid #bbb;
+}
+.pull-right {
+  float: right;
+  width: 30em;
+  text-align: right;
+}
+
+
+/* Sphinx sidebar ------------------------------------------------------------*/
+div.sphinxsidebar {
+    font-size: inherit;
+    border-radius: 3px;
+    background-color: #eee;
+    border: 1px solid #bbb;
+    word-wrap: break-word;
+    /* overflow-wrap is the canonical name for word-wrap in the CSS3 text draft.
+    We include it here mainly for future-proofing. */
+    overflow-wrap: break-word;
+}
+
+div.sphinxsidebarwrapper {
+    padding: 0px 0px 0px 5px;
+}
+
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 5px 0px 0px 5px;
+    padding: 0;
+    line-height: 1.6em;
+}
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+div.sphinxsidebar p {
+}
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+div.sphinxsidebar ul {
+    margin: 0px 0px 0px 5px;
+    padding: 0;
+}
+
+div.sphinxsidebar ul ul {
+    margin-left: 15px;
+    list-style-type: disc;
+}
+
+/* If showing the global TOC (toctree),
+   color the current page differently */
+div.sphinxsidebar a.current {
+    color: #0070c5;
+}
+div.sphinxsidebar a.current:hover {
+    color: #0070c5;
+}
+
+
+/* document, documentwrapper, body, bodywrapper ----------------------------- */
+
+div.document {
+    margin-top: 72px;
+    margin-left: 10px;
+    margin-right: 10px;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.body {
+    background-color: #ffffff;
+    padding: 0 0 0px 20px;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+    max-width: 55em;
+}
+
+
+/* Header links ------------------------------------------------------------- */
+
+a.headerlink {
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+
+a.headerlink:hover {
+    background-color: #0069d6;
+    color: white;
+    text-decoration: none;
+}
+
+
+/* Admonitions and warnings ------------------------------------------------- */
+
+/* Shared by admonitions and warnings */
+div.admonition,
+div.warning {
+    padding: 0px;
+    border-radius: 3px;
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+}
+div.admonition p,
+div.warning p {
+    margin: 0.5em 1em 0.5em 1em;
+    padding: 0;
+}
+div.admonition pre,
+div.warning pre {
+    margin: 0.4em 1em 0.4em 1em;
+}
+div.admonition p.admonition-title,
+div.warning p.admonition-title {
+    margin: 0;
+    padding: 0.1em 0 0.1em 0.5em;
+    color: white;
+    font-weight: bold;
+    font-size: 1.1em;
+}
+div.admonition ul, div.admonition ol,
+div.warning ul, div.warning ol {
+    margin: 0.1em 0.5em 0.5em 3em;
+    padding: 0;
+}
+
+/* Admonitions only */
+div.admonition {
+    border: 1px solid  #0066cc;
+    background-color: #b3d9ff;
+}
+div.admonition p.admonition-title {
+    background-color: #1a8cff;
+}
+
+/* Warnings only */
+div.warning {
+    border: 1px solid #805500;
+    background-color: #ffe6b3;
+}
+div.warning p.admonition-title {
+    background-color: #ffc34d;
+}
+
+
+/* Figures ------------------------------------------------------------------ */
+
+.figure.align-center {
+    clear: none;
+}
+
+/* This is a div for containing multiple figures side-by-side, for use with
+ * .. container:: figures */
+div.figures {
+    border: 1px solid #CCCCCC;
+    background-color: #F8F8F8;
+    margin: 1em;
+    text-align: center;
+}
+
+div.figures .figure {
+    clear: none;
+    float: none;
+    display: inline-block;
+    border: none;
+    margin-left: 0.5em;
+    margin-right: 0.5em;
+}
+
+.field-list th {
+    white-space: nowrap;
+}
+
+table.field-list {
+    border-spacing: 0px;
+    margin-left: 1px;
+    border-left: 5px solid rgb(238, 238, 238) !important;
+}
+
+table.field-list th.field-name {
+    display: inline-block;
+    padding: 1px 8px 1px 5px;
+    white-space: nowrap;
+    background-color: rgb(238, 238, 238);
+    border-radius: 0 3px 3px 0;
+    -webkit-border-radius: 0 3px 3px 0;
+}
diff --git a/pull/45/_static/sdc_email.png b/pull/45/_static/sdc_email.png
new file mode 100644
index 0000000..9fde617
Binary files /dev/null and b/pull/45/_static/sdc_email.png differ
diff --git a/pull/45/_static/sdc_examples.png b/pull/45/_static/sdc_examples.png
new file mode 100644
index 0000000..dd7095b
Binary files /dev/null and b/pull/45/_static/sdc_examples.png differ
diff --git a/pull/45/_static/sdc_github.png b/pull/45/_static/sdc_github.png
new file mode 100644
index 0000000..89467c5
Binary files /dev/null and b/pull/45/_static/sdc_github.png differ
diff --git a/pull/45/_static/sdc_issues.png b/pull/45/_static/sdc_issues.png
new file mode 100644
index 0000000..13d5974
Binary files /dev/null and b/pull/45/_static/sdc_issues.png differ
diff --git a/pull/45/_static/searchtools.js b/pull/45/_static/searchtools.js
new file mode 100644
index 0000000..97d56a7
--- /dev/null
+++ b/pull/45/_static/searchtools.js
@@ -0,0 +1,566 @@
+/*
+ * searchtools.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for the full-text search.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+/**
+ * Simple result scoring code.
+ */
+if (typeof Scorer === "undefined") {
+  var Scorer = {
+    // Implement the following function to further tweak the score for each result
+    // The function takes a result array [docname, title, anchor, descr, score, filename]
+    // and returns the new score.
+    /*
+    score: result => {
+      const [docname, title, anchor, descr, score, filename] = result
+      return score
+    },
+    */
+
+    // query matches the full name of an object
+    objNameMatch: 11,
+    // or matches in the last dotted part of the object name
+    objPartialMatch: 6,
+    // Additive scores depending on the priority of the object
+    objPrio: {
+      0: 15, // used to be importantResults
+      1: 5, // used to be objectResults
+      2: -5, // used to be unimportantResults
+    },
+    //  Used when the priority is not in the mapping.
+    objPrioDefault: 0,
+
+    // query found in title
+    title: 15,
+    partialTitle: 7,
+    // query found in terms
+    term: 5,
+    partialTerm: 2,
+  };
+}
+
+const _removeChildren = (element) => {
+  while (element && element.lastChild) element.removeChild(element.lastChild);
+};
+
+/**
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
+ */
+const _escapeRegExp = (string) =>
+  string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
+
+const _displayItem = (item, searchTerms) => {
+  const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
+  const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT;
+  const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
+  const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
+  const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
+
+  const [docName, title, anchor, descr, score, _filename] = item;
+
+  let listItem = document.createElement("li");
+  let requestUrl;
+  let linkUrl;
+  if (docBuilder === "dirhtml") {
+    // dirhtml builder
+    let dirname = docName + "/";
+    if (dirname.match(/\/index\/$/))
+      dirname = dirname.substring(0, dirname.length - 6);
+    else if (dirname === "index/") dirname = "";
+    requestUrl = docUrlRoot + dirname;
+    linkUrl = requestUrl;
+  } else {
+    // normal html builders
+    requestUrl = docUrlRoot + docName + docFileSuffix;
+    linkUrl = docName + docLinkSuffix;
+  }
+  let linkEl = listItem.appendChild(document.createElement("a"));
+  linkEl.href = linkUrl + anchor;
+  linkEl.dataset.score = score;
+  linkEl.innerHTML = title;
+  if (descr)
+    listItem.appendChild(document.createElement("span")).innerHTML =
+      " (" + descr + ")";
+  else if (showSearchSummary)
+    fetch(requestUrl)
+      .then((responseData) => responseData.text())
+      .then((data) => {
+        if (data)
+          listItem.appendChild(
+            Search.makeSearchSummary(data, searchTerms)
+          );
+      });
+  Search.output.appendChild(listItem);
+};
+const _finishSearch = (resultCount) => {
+  Search.stopPulse();
+  Search.title.innerText = _("Search Results");
+  if (!resultCount)
+    Search.status.innerText = Documentation.gettext(
+      "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
+    );
+  else
+    Search.status.innerText = _(
+      `Search finished, found ${resultCount} page(s) matching the search query.`
+    );
+};
+const _displayNextItem = (
+  results,
+  resultCount,
+  searchTerms
+) => {
+  // results left, load the summary and display it
+  // this is intended to be dynamic (don't sub resultsCount)
+  if (results.length) {
+    _displayItem(results.pop(), searchTerms);
+    setTimeout(
+      () => _displayNextItem(results, resultCount, searchTerms),
+      5
+    );
+  }
+  // search finished, update title and status message
+  else _finishSearch(resultCount);
+};
+
+/**
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
+ * custom function per language.
+ *
+ * The regular expression works by splitting the string on consecutive characters
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
+ */
+if (typeof splitQuery === "undefined") {
+  var splitQuery = (query) => query
+      .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
+      .filter(term => term)  // remove remaining empty strings
+}
+
+/**
+ * Search Module
+ */
+const Search = {
+  _index: null,
+  _queued_query: null,
+  _pulse_status: -1,
+
+  htmlToText: (htmlString) => {
+    const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
+    htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
+    const docContent = htmlElement.querySelector('[role="main"]');
+    if (docContent !== undefined) return docContent.textContent;
+    console.warn(
+      "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
+    );
+    return "";
+  },
+
+  init: () => {
+    const query = new URLSearchParams(window.location.search).get("q");
+    document
+      .querySelectorAll('input[name="q"]')
+      .forEach((el) => (el.value = query));
+    if (query) Search.performSearch(query);
+  },
+
+  loadIndex: (url) =>
+    (document.body.appendChild(document.createElement("script")).src = url),
+
+  setIndex: (index) => {
+    Search._index = index;
+    if (Search._queued_query !== null) {
+      const query = Search._queued_query;
+      Search._queued_query = null;
+      Search.query(query);
+    }
+  },
+
+  hasIndex: () => Search._index !== null,
+
+  deferQuery: (query) => (Search._queued_query = query),
+
+  stopPulse: () => (Search._pulse_status = -1),
+
+  startPulse: () => {
+    if (Search._pulse_status >= 0) return;
+
+    const pulse = () => {
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      Search.dots.innerText = ".".repeat(Search._pulse_status);
+      if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
+    };
+    pulse();
+  },
+
+  /**
+   * perform a search for something (or wait until index is loaded)
+   */
+  performSearch: (query) => {
+    // create the required interface elements
+    const searchText = document.createElement("h2");
+    searchText.textContent = _("Searching");
+    const searchSummary = document.createElement("p");
+    searchSummary.classList.add("search-summary");
+    searchSummary.innerText = "";
+    const searchList = document.createElement("ul");
+    searchList.classList.add("search");
+
+    const out = document.getElementById("search-results");
+    Search.title = out.appendChild(searchText);
+    Search.dots = Search.title.appendChild(document.createElement("span"));
+    Search.status = out.appendChild(searchSummary);
+    Search.output = out.appendChild(searchList);
+
+    const searchProgress = document.getElementById("search-progress");
+    // Some themes don't use the search progress node
+    if (searchProgress) {
+      searchProgress.innerText = _("Preparing search...");
+    }
+    Search.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (Search.hasIndex()) Search.query(query);
+    else Search.deferQuery(query);
+  },
+
+  /**
+   * execute search (requires search index to be loaded)
+   */
+  query: (query) => {
+    const filenames = Search._index.filenames;
+    const docNames = Search._index.docnames;
+    const titles = Search._index.titles;
+    const allTitles = Search._index.alltitles;
+    const indexEntries = Search._index.indexentries;
+
+    // stem the search terms and add them to the correct list
+    const stemmer = new Stemmer();
+    const searchTerms = new Set();
+    const excludedTerms = new Set();
+    const highlightTerms = new Set();
+    const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
+    splitQuery(query.trim()).forEach((queryTerm) => {
+      const queryTermLower = queryTerm.toLowerCase();
+
+      // maybe skip this "word"
+      // stopwords array is from language_data.js
+      if (
+        stopwords.indexOf(queryTermLower) !== -1 ||
+        queryTerm.match(/^\d+$/)
+      )
+        return;
+
+      // stem the word
+      let word = stemmer.stemWord(queryTermLower);
+      // select the correct list
+      if (word[0] === "-") excludedTerms.add(word.substr(1));
+      else {
+        searchTerms.add(word);
+        highlightTerms.add(queryTermLower);
+      }
+    });
+
+    if (SPHINX_HIGHLIGHT_ENABLED) {  // set in sphinx_highlight.js
+      localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
+    }
+
+    // console.debug("SEARCH: searching for:");
+    // console.info("required: ", [...searchTerms]);
+    // console.info("excluded: ", [...excludedTerms]);
+
+    // array of [docname, title, anchor, descr, score, filename]
+    let results = [];
+    _removeChildren(document.getElementById("search-progress"));
+
+    const queryLower = query.toLowerCase();
+    for (const [title, foundTitles] of Object.entries(allTitles)) {
+      if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
+        for (const [file, id] of foundTitles) {
+          let score = Math.round(100 * queryLower.length / title.length)
+          results.push([
+            docNames[file],
+            titles[file] !== title ? `${titles[file]} > ${title}` : title,
+            id !== null ? "#" + id : "",
+            null,
+            score,
+            filenames[file],
+          ]);
+        }
+      }
+    }
+
+    // search for explicit entries in index directives
+    for (const [entry, foundEntries] of Object.entries(indexEntries)) {
+      if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
+        for (const [file, id] of foundEntries) {
+          let score = Math.round(100 * queryLower.length / entry.length)
+          results.push([
+            docNames[file],
+            titles[file],
+            id ? "#" + id : "",
+            null,
+            score,
+            filenames[file],
+          ]);
+        }
+      }
+    }
+
+    // lookup as object
+    objectTerms.forEach((term) =>
+      results.push(...Search.performObjectSearch(term, objectTerms))
+    );
+
+    // lookup as search terms in fulltext
+    results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
+
+    // let the scorer override scores with a custom scoring function
+    if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
+
+    // now sort the results by score (in opposite order of appearance, since the
+    // display function below uses pop() to retrieve items) and then
+    // alphabetically
+    results.sort((a, b) => {
+      const leftScore = a[4];
+      const rightScore = b[4];
+      if (leftScore === rightScore) {
+        // same score: sort alphabetically
+        const leftTitle = a[1].toLowerCase();
+        const rightTitle = b[1].toLowerCase();
+        if (leftTitle === rightTitle) return 0;
+        return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+      }
+      return leftScore > rightScore ? 1 : -1;
+    });
+
+    // remove duplicate search results
+    // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
+    let seen = new Set();
+    results = results.reverse().reduce((acc, result) => {
+      let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
+      if (!seen.has(resultStr)) {
+        acc.push(result);
+        seen.add(resultStr);
+      }
+      return acc;
+    }, []);
+
+    results = results.reverse();
+
+    // for debugging
+    //Search.lastresults = results.slice();  // a copy
+    // console.info("search results:", Search.lastresults);
+
+    // print the results
+    _displayNextItem(results, results.length, searchTerms);
+  },
+
+  /**
+   * search for object names
+   */
+  performObjectSearch: (object, objectTerms) => {
+    const filenames = Search._index.filenames;
+    const docNames = Search._index.docnames;
+    const objects = Search._index.objects;
+    const objNames = Search._index.objnames;
+    const titles = Search._index.titles;
+
+    const results = [];
+
+    const objectSearchCallback = (prefix, match) => {
+      const name = match[4]
+      const fullname = (prefix ? prefix + "." : "") + name;
+      const fullnameLower = fullname.toLowerCase();
+      if (fullnameLower.indexOf(object) < 0) return;
+
+      let score = 0;
+      const parts = fullnameLower.split(".");
+
+      // check for different match types: exact matches of full name or
+      // "last name" (i.e. last dotted part)
+      if (fullnameLower === object || parts.slice(-1)[0] === object)
+        score += Scorer.objNameMatch;
+      else if (parts.slice(-1)[0].indexOf(object) > -1)
+        score += Scorer.objPartialMatch; // matches in last name
+
+      const objName = objNames[match[1]][2];
+      const title = titles[match[0]];
+
+      // If more than one term searched for, we require other words to be
+      // found in the name/title/description
+      const otherTerms = new Set(objectTerms);
+      otherTerms.delete(object);
+      if (otherTerms.size > 0) {
+        const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
+        if (
+          [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
+        )
+          return;
+      }
+
+      let anchor = match[3];
+      if (anchor === "") anchor = fullname;
+      else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
+
+      const descr = objName + _(", in ") + title;
+
+      // add custom score for some objects according to scorer
+      if (Scorer.objPrio.hasOwnProperty(match[2]))
+        score += Scorer.objPrio[match[2]];
+      else score += Scorer.objPrioDefault;
+
+      results.push([
+        docNames[match[0]],
+        fullname,
+        "#" + anchor,
+        descr,
+        score,
+        filenames[match[0]],
+      ]);
+    };
+    Object.keys(objects).forEach((prefix) =>
+      objects[prefix].forEach((array) =>
+        objectSearchCallback(prefix, array)
+      )
+    );
+    return results;
+  },
+
+  /**
+   * search for full-text terms in the index
+   */
+  performTermsSearch: (searchTerms, excludedTerms) => {
+    // prepare search
+    const terms = Search._index.terms;
+    const titleTerms = Search._index.titleterms;
+    const filenames = Search._index.filenames;
+    const docNames = Search._index.docnames;
+    const titles = Search._index.titles;
+
+    const scoreMap = new Map();
+    const fileMap = new Map();
+
+    // perform the search on the required terms
+    searchTerms.forEach((word) => {
+      const files = [];
+      const arr = [
+        { files: terms[word], score: Scorer.term },
+        { files: titleTerms[word], score: Scorer.title },
+      ];
+      // add support for partial matches
+      if (word.length > 2) {
+        const escapedWord = _escapeRegExp(word);
+        Object.keys(terms).forEach((term) => {
+          if (term.match(escapedWord) && !terms[word])
+            arr.push({ files: terms[term], score: Scorer.partialTerm });
+        });
+        Object.keys(titleTerms).forEach((term) => {
+          if (term.match(escapedWord) && !titleTerms[word])
+            arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
+        });
+      }
+
+      // no match but word was a required one
+      if (arr.every((record) => record.files === undefined)) return;
+
+      // found search word in contents
+      arr.forEach((record) => {
+        if (record.files === undefined) return;
+
+        let recordFiles = record.files;
+        if (recordFiles.length === undefined) recordFiles = [recordFiles];
+        files.push(...recordFiles);
+
+        // set score for the word in each file
+        recordFiles.forEach((file) => {
+          if (!scoreMap.has(file)) scoreMap.set(file, {});
+          scoreMap.get(file)[word] = record.score;
+        });
+      });
+
+      // create the mapping
+      files.forEach((file) => {
+        if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
+          fileMap.get(file).push(word);
+        else fileMap.set(file, [word]);
+      });
+    });
+
+    // now check if the files don't contain excluded terms
+    const results = [];
+    for (const [file, wordList] of fileMap) {
+      // check if all requirements are matched
+
+      // as search terms with length < 3 are discarded
+      const filteredTermCount = [...searchTerms].filter(
+        (term) => term.length > 2
+      ).length;
+      if (
+        wordList.length !== searchTerms.size &&
+        wordList.length !== filteredTermCount
+      )
+        continue;
+
+      // ensure that none of the excluded terms is in the search result
+      if (
+        [...excludedTerms].some(
+          (term) =>
+            terms[term] === file ||
+            titleTerms[term] === file ||
+            (terms[term] || []).includes(file) ||
+            (titleTerms[term] || []).includes(file)
+        )
+      )
+        break;
+
+      // select one (max) score for the file.
+      const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
+      // add result to the result list
+      results.push([
+        docNames[file],
+        titles[file],
+        "",
+        null,
+        score,
+        filenames[file],
+      ]);
+    }
+    return results;
+  },
+
+  /**
+   * helper function to return a node containing the
+   * search summary for a given text. keywords is a list
+   * of stemmed words.
+   */
+  makeSearchSummary: (htmlText, keywords) => {
+    const text = Search.htmlToText(htmlText);
+    if (text === "") return null;
+
+    const textLower = text.toLowerCase();
+    const actualStartPosition = [...keywords]
+      .map((k) => textLower.indexOf(k.toLowerCase()))
+      .filter((i) => i > -1)
+      .slice(-1)[0];
+    const startWithContext = Math.max(actualStartPosition - 120, 0);
+
+    const top = startWithContext === 0 ? "" : "...";
+    const tail = startWithContext + 240 < text.length ? "..." : "";
+
+    let summary = document.createElement("p");
+    summary.classList.add("context");
+    summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
+
+    return summary;
+  },
+};
+
+_ready(Search.init);
diff --git a/pull/45/_static/sidebar.js b/pull/45/_static/sidebar.js
new file mode 100644
index 0000000..8922cda
--- /dev/null
+++ b/pull/45/_static/sidebar.js
@@ -0,0 +1,160 @@
+﻿/*
+ * sidebar.js
+ * ~~~~~~~~~~
+ *
+ * This script makes the Sphinx sidebar collapsible.
+ *
+ * .sphinxsidebar contains .sphinxsidebarwrapper.  This script adds
+ * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
+ * used to collapse and expand the sidebar.
+ *
+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
+ * and the width of the sidebar and the margin-left of the document
+ * are decreased. When the sidebar is expanded the opposite happens.
+ * This script saves a per-browser/per-session cookie used to
+ * remember the position of the sidebar among the pages.
+ * Once the browser is closed the cookie is deleted and the position
+ * reset to the default (expanded).
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+$(function() {
+  // global elements used by the functions.
+  // the 'sidebarbutton' element is defined as global after its
+  // creation, in the add_sidebar_button function
+  var bodywrapper = $('.bodywrapper');
+  var sidebar = $('.sphinxsidebar');
+  var sidebarwrapper = $('.sphinxsidebarwrapper');
+
+  // for some reason, the document has no sidebar; do not run into errors
+  if (!sidebar.length) return;
+
+  // original margin-left of the bodywrapper and width of the sidebar
+  // with the sidebar expanded
+  var bw_margin_expanded = bodywrapper.css('margin-left');
+  var ssb_width_expanded = sidebar.width();
+
+  // margin-left of the bodywrapper and width of the sidebar
+  // with the sidebar collapsed
+  var bw_margin_collapsed = 12;
+  var ssb_width_collapsed = 12;
+
+  // custom colors
+  var dark_color = '#003a66';
+  var light_color = '#0070c5';
+
+  function sidebar_is_collapsed() {
+    return sidebarwrapper.is(':not(:visible)');
+  }
+
+  function toggle_sidebar() {
+    if (sidebar_is_collapsed())
+      expand_sidebar();
+    else
+      collapse_sidebar();
+  }
+
+  function collapse_sidebar() {
+    sidebarwrapper.hide();
+    sidebar.css('width', ssb_width_collapsed);
+    bodywrapper.css('margin-left', bw_margin_collapsed);
+    sidebarbutton.css({
+        'margin-left': '-1px',
+        'height': bodywrapper.height(),
+	'border-radius': '3px'
+    });
+    sidebarbutton.find('span').text('»');
+    sidebarbutton.attr('title', _('Expand sidebar'));
+    document.cookie = 'sidebar=collapsed';
+  }
+
+  function expand_sidebar() {
+    bodywrapper.css('margin-left', bw_margin_expanded);
+    sidebar.css('width', ssb_width_expanded);
+    sidebarwrapper.show();
+    sidebarbutton.css({
+        'margin-left': ssb_width_expanded - 12,
+        'height': bodywrapper.height(),
+	'border-radius': '0px 3px 3px 0px'
+    });
+    sidebarbutton.find('span').text('«');
+    sidebarbutton.attr('title', _('Collapse sidebar'));
+    document.cookie = 'sidebar=expanded';
+  }
+
+  function add_sidebar_button() {
+    sidebarwrapper.css({
+        'float': 'left',
+        'margin-right': '0',
+        'width': ssb_width_expanded - 18
+    });
+    // create the button
+    sidebar.append('<div id="sidebarbutton"><span>&laquo;</span></div>');
+    var sidebarbutton = $('#sidebarbutton');
+
+    // find the height of the viewport to center the '<<' in the page
+    var viewport_height;
+    if (window.innerHeight)
+ 	  viewport_height = window.innerHeight;
+    else
+	  viewport_height = $(window).height();
+    var sidebar_offset = sidebar.offset().top;
+    var sidebar_height = Math.max(bodywrapper.height(), sidebar.height());
+    sidebarbutton.find('span').css({
+        'font-family': '"Lucida Grande",Arial,sans-serif',
+	'display': 'block',
+	'top': Math.min(viewport_height/2, sidebar_height/2 + sidebar_offset) - 10,
+	'width': 12,
+	'position': 'fixed',
+	'text-align': 'center'
+    });
+
+    sidebarbutton.click(toggle_sidebar);
+    sidebarbutton.attr('title', _('Collapse sidebar'));
+    sidebarbutton.css({
+        'color': '#FFFFFF',
+	'background-color': light_color,
+	'border': '1px solid ' + light_color,
+        'border-radius': '0px 3px 3px 0px',
+        'font-size': '1.2em',
+        'cursor': 'pointer',
+        'height': sidebar_height,
+        'padding-top': '1px',
+	'margin': '-1px',
+        'margin-left': ssb_width_expanded - 12
+    });
+
+    sidebarbutton.hover(
+      function () {
+          $(this).css('background-color', dark_color);
+      },
+      function () {
+          $(this).css('background-color', light_color);
+      }
+    );
+  }
+
+  function set_position_from_cookie() {
+    if (!document.cookie)
+      return;
+    var items = document.cookie.split(';');
+    for(var k=0; k<items.length; k++) {
+      var key_val = items[k].split('=');
+      var key = key_val[0];
+      if (key == 'sidebar') {
+        var value = key_val[1];
+        if ((value == 'collapsed') && (!sidebar_is_collapsed()))
+          collapse_sidebar();
+        else if ((value == 'expanded') && (sidebar_is_collapsed()))
+          expand_sidebar();
+      }
+    }
+  }
+
+  add_sidebar_button();
+  var sidebarbutton = $('#sidebarbutton');
+  set_position_from_cookie();
+});
diff --git a/pull/45/_static/sphinx_highlight.js b/pull/45/_static/sphinx_highlight.js
new file mode 100644
index 0000000..aae669d
--- /dev/null
+++ b/pull/45/_static/sphinx_highlight.js
@@ -0,0 +1,144 @@
+/* Highlighting utilities for Sphinx HTML documentation. */
+"use strict";
+
+const SPHINX_HIGHLIGHT_ENABLED = true
+
+/**
+ * highlight a given string on a node by wrapping it in
+ * span elements with the given class name.
+ */
+const _highlight = (node, addItems, text, className) => {
+  if (node.nodeType === Node.TEXT_NODE) {
+    const val = node.nodeValue;
+    const parent = node.parentNode;
+    const pos = val.toLowerCase().indexOf(text);
+    if (
+      pos >= 0 &&
+      !parent.classList.contains(className) &&
+      !parent.classList.contains("nohighlight")
+    ) {
+      let span;
+
+      const closestNode = parent.closest("body, svg, foreignObject");
+      const isInSVG = closestNode && closestNode.matches("svg");
+      if (isInSVG) {
+        span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+      } else {
+        span = document.createElement("span");
+        span.classList.add(className);
+      }
+
+      span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+      parent.insertBefore(
+        span,
+        parent.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling
+        )
+      );
+      node.nodeValue = val.substr(0, pos);
+
+      if (isInSVG) {
+        const rect = document.createElementNS(
+          "http://www.w3.org/2000/svg",
+          "rect"
+        );
+        const bbox = parent.getBBox();
+        rect.x.baseVal.value = bbox.x;
+        rect.y.baseVal.value = bbox.y;
+        rect.width.baseVal.value = bbox.width;
+        rect.height.baseVal.value = bbox.height;
+        rect.setAttribute("class", className);
+        addItems.push({ parent: parent, target: rect });
+      }
+    }
+  } else if (node.matches && !node.matches("button, select, textarea")) {
+    node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
+  }
+};
+const _highlightText = (thisNode, text, className) => {
+  let addItems = [];
+  _highlight(thisNode, addItems, text, className);
+  addItems.forEach((obj) =>
+    obj.parent.insertAdjacentElement("beforebegin", obj.target)
+  );
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const SphinxHighlight = {
+
+  /**
+   * highlight the search words provided in localstorage in the text
+   */
+  highlightSearchWords: () => {
+    if (!SPHINX_HIGHLIGHT_ENABLED) return;  // bail if no highlight
+
+    // get and clear terms from localstorage
+    const url = new URL(window.location);
+    const highlight =
+        localStorage.getItem("sphinx_highlight_terms")
+        || url.searchParams.get("highlight")
+        || "";
+    localStorage.removeItem("sphinx_highlight_terms")
+    url.searchParams.delete("highlight");
+    window.history.replaceState({}, "", url);
+
+    // get individual terms from highlight string
+    const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
+    if (terms.length === 0) return; // nothing to do
+
+    // There should never be more than one element matching "div.body"
+    const divBody = document.querySelectorAll("div.body");
+    const body = divBody.length ? divBody[0] : document.querySelector("body");
+    window.setTimeout(() => {
+      terms.forEach((term) => _highlightText(body, term, "highlighted"));
+    }, 10);
+
+    const searchBox = document.getElementById("searchbox");
+    if (searchBox === null) return;
+    searchBox.appendChild(
+      document
+        .createRange()
+        .createContextualFragment(
+          '<p class="highlight-link">' +
+            '<a href="javascript:SphinxHighlight.hideSearchWords()">' +
+            _("Hide Search Matches") +
+            "</a></p>"
+        )
+    );
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords: () => {
+    document
+      .querySelectorAll("#searchbox .highlight-link")
+      .forEach((el) => el.remove());
+    document
+      .querySelectorAll("span.highlighted")
+      .forEach((el) => el.classList.remove("highlighted"));
+    localStorage.removeItem("sphinx_highlight_terms")
+  },
+
+  initEscapeListener: () => {
+    // only install a listener if it is really needed
+    if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
+
+    document.addEventListener("keydown", (event) => {
+      // bail for input elements
+      if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+      // bail with special keys
+      if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
+      if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
+        SphinxHighlight.hideSearchWords();
+        event.preventDefault();
+      }
+    });
+  },
+};
+
+_ready(SphinxHighlight.highlightSearchWords);
+_ready(SphinxHighlight.initEscapeListener);
diff --git a/pull/45/benchmarks.html b/pull/45/benchmarks.html
new file mode 100644
index 0000000..45e52e3
--- /dev/null
+++ b/pull/45/benchmarks.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Benchmarks &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Demos" href="demos.html" />
+    <link rel="prev" title="Examples with performance using Mandelbrot calculation" href="notebooks/03-mandelbrot_perfomance.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="demos.html" title="Demos">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="notebooks/03-mandelbrot_perfomance.html" title="Examples with performance using Mandelbrot calculation">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Benchmarks</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="benchmarks"></span><section id="id1">
+<h1>Benchmarks<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<p><strong>Data Parallel Extensions for Python</strong> provide a set of
+<a class="reference external" href="https://github.com/IntelPython/dpbench">benchmarks</a> illustrating different aspects of
+implementing the performant code with Data Parallel Extensions for Python.
+Benchmarks represent some real life numerical problem or some important part (kernel) of real life application.
+Each application/kernel is implemented in several variants (not necessarily all variants):</p>
+<ul class="simple">
+<li><p>Pure Python: Typically the slowest and used just as a reference implementation</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numpy</span></code>: Same application/kernel implemented using NumPy library</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">dpnp</span></code>: Modified numpy implementation to run on a specific device. You can use numpy as a baseline while evaluating the dpnp implementation and its performance</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba</span> <span class="pre">&#64;njit</span></code> array-style: application/kernel implemented using NumPy and compiled with Numba. You can use numpy as a baseline when evaluate numba &#64;njit array-style implementat and its performance</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba</span> <span class="pre">&#64;njit</span></code> direct loops (prange): Same application/kernel implemented using Numba compiler using direct loops. Sometimes array-style programming is cumbersome and performance inefficient. Using direct loop programming may lead to more readable and performance code. Thus, while evaluating the performance of direct loop implementation it is useful to compare array-style Numba implementation as a baseline</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-dpex</span> <span class="pre">&#64;dpjit</span></code> array-style: Modified numba &#64;njit array-style implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing numba-dpex implementation details and performance. You can also compare it against dpnp implementation to see how much extra performance numba-dpex can bring when you compile NumPy code for a given device</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-dpex</span> <span class="pre">&#64;dpjit</span></code> direct loops (prange): Modified numba &#64;njit direct loop implementation to compile and run on a specific device. You can use vanilla Numba implementation as a baseline while comparing numba-dpex implementation details and performance. You can also compare it against dpnp implementation to see how much extra performance numba-dpex can bring when you compile NumPy code for a given device</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-dpex</span> <span class="pre">&#64;dpjit</span></code> kernel: Kernel-style programming, which is close to &#64;cuda.jit programming model used in vanilla Numba</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">numba-mlir</span></code>: Array-style, direct loops and kernel-style implementations for experimental MLIR-based backend for Numba</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">cupy</span></code>: NumPy-like implementation using CuPy to run on CUDA-compatible devices</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">&#64;cuda.jit</span></code>: Kernel-style Numba implementation to run on CUDA-compatible devices</p></li>
+<li><p>Native SYCL: Most applications/kernels also have DPC++ implementation, which can be used to compare performance of above implementations to DPC++ compiled code.</p></li>
+</ul>
+<p>These benchmarks are implemented in <code class="docutils literal notranslate"><span class="pre">dpbench</span></code> framework, which allows you to run all or select benchmarks and variants to evaluate their performance on different hardware.</p>
+<p>For more details please refer to <code class="docutils literal notranslate"><span class="pre">dpbench</span></code>
+<a class="reference external" href="https://github.com/IntelPython/dpbench/blob/main/README.md">documentation</a>.</p>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="notebooks/03-mandelbrot_perfomance.html"
+                          title="previous chapter">Examples with performance using Mandelbrot calculation</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="demos.html"
+                          title="next chapter">Demos</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/demos.html b/pull/45/demos.html
new file mode 100644
index 0000000..dec6648
--- /dev/null
+++ b/pull/45/demos.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Demos &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Useful links" href="useful_links.html" />
+    <link rel="prev" title="Benchmarks" href="benchmarks.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="useful_links.html" title="Useful links">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="benchmarks.html" title="Benchmarks">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Demos</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="demos"></span><section id="id1">
+<h1>Demos<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<p>There are several demo applications illustrating the power of the <strong>Data Parallel Extensions for Python</strong>. They are:</p>
+<ul class="simple">
+<li><p><a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos/mcpi">Monte Carlo Pi</a>
+The Monte Carlo method to estimate the value of <span class="math notranslate nohighlight">\(\pi\)</span>.</p></li>
+<li><p><a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos/mandelbrot">Mandelbrot Set</a>
+Visualization of the breathtaking process of diving in the famous Mandelbrot fractal</p></li>
+<li><p><a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos/game-of-life">Game of Life</a>
+Visualization of the life evolution using famous Conway’s model</p></li>
+</ul>
+<p>All demos are located in the <a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/demos">GitHub repository</a>.
+For more details please refer to the documentation located in the individual demo directory.</p>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="benchmarks.html"
+                          title="previous chapter">Benchmarks</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="useful_links.html"
+                          title="next chapter">Useful links</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/examples.html b/pull/45/examples.html
new file mode 100644
index 0000000..2127b4b
--- /dev/null
+++ b/pull/45/examples.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Examples &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Tutorials" href="jupyter_notebook.html" />
+    <link rel="prev" title="Programming with Data Parallel Extensions for Python" href="programming_dpep.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="#"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="jupyter_notebook.html" title="Tutorials">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="programming_dpep.html" title="Programming with Data Parallel Extensions for Python">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Examples</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="examples"></span><section id="id1">
+<h1>Examples<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<p>All examples are located in the <a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/examples">GitHub repository</a>.
+Their names start with the 2-digit number followed by a descriptive name.
+You can run examples in any order, however, if
+you are new to the Data Parallel Extensions for Python, it is recommended to go in the order examples are enumerated.</p>
+<p>The following command will run the very first example of using Data Parallel Extensions for Python</p>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">python ./examples/01-hello_dpnp.py</span>
+</pre></div>
+</div>
+<p>These are listings of these examples:</p>
+<div class="literal-block-wrapper docutils container" id="examples-01-hello-dpnp">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 01:</strong> Your first NumPy code running on GPU</span><a class="headerlink" href="#examples-01-hello-dpnp" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="examples-02-dpnp-device">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 02:</strong> Select device type while creating array</span><a class="headerlink" href="#examples-02-dpnp-device" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="examples-03-dpnp2numba-dpex">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 03:</strong> Compile dpnp code with numba-dpex</span><a class="headerlink" href="#examples-03-dpnp2numba-dpex" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">from</span> <span class="nn">numba_dpex</span> <span class="kn">import</span> <span class="n">dpjit</span> <span class="k">as</span> <span class="n">njit</span>
+
+
+<span class="nd">@njit</span><span class="p">()</span>
+<span class="k">def</span> <span class="nf">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>  <span class="c1"># Device queue is inferred from x. The kernel is submitted to that queue</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="examples-04-dpctl-device-query">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 04:</strong> Get information about devices</span><a class="headerlink" href="#examples-04-dpctl-device-query" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">()</span>  <span class="c1"># Print platform information</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;GPU devices:&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the list of all GPU devices</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;Number of GPU devices&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_num_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the number of GPU devices</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has CPU devices?&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">has_cpu_devices</span><span class="p">())</span>  <span class="c1"># Check if there are CPU devices</span>
+</pre></div>
+</div>
+</div>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="programming_dpep.html"
+                          title="previous chapter">Programming with Data Parallel Extensions for Python</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="jupyter_notebook.html"
+                          title="next chapter">Tutorials</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/genindex.html b/pull/45/genindex.html
new file mode 100644
index 0000000..ef3fbeb
--- /dev/null
+++ b/pull/45/genindex.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Index &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="#" />
+    <link rel="search" title="Search" href="search.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+       
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+
+<h1 id="index">Index</h1>
+
+<div class="genindex-jumpbox">
+ 
+</div>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/heterogeneous_computing.html b/pull/45/heterogeneous_computing.html
new file mode 100644
index 0000000..17ee00c
--- /dev/null
+++ b/pull/45/heterogeneous_computing.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Heterogeneous Computing &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Programming with Data Parallel Extensions for Python" href="programming_dpep.html" />
+    <link rel="prev" title="Parallelism in Modern Data-Parallel Architectures" href="parallelism.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="programming_dpep.html" title="Programming with Data Parallel Extensions for Python">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="parallelism.html" title="Parallelism in Modern Data-Parallel Architectures">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Heterogeneous Computing</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="heterogeneous-computing"></span><section id="id1">
+<h1>Heterogeneous Computing<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<section id="device-offload">
+<h2>Device Offload<a class="headerlink" href="#device-offload" title="Permalink to this heading">¶</a></h2>
+<p>Python is an interpreted language, which implies that most of the Python script will run on CPU,
+and only a few data parallel regions will execute on data parallel devices.
+That is why the concept of the host and offload devices is helpful when it comes to conceptualizing
+a heterogeneous programming model in Python.</p>
+<a class="reference internal image-reference" href="_images/hetero-devices.png"><img alt="SIMD" class="align-center" src="_images/hetero-devices.png" style="width: 600px;" /></a>
+<p>The above diagram illustrates the <em>host</em> (the CPU which runs Python interpreter) and three <em>devices</em>
+(two GPU devices and one attached accelerator device). <strong>Data Parallel Extensions for Python</strong>
+offer a programming model where a script executed by Python interpreter on the host can <em>offload</em> data-parallel
+kernels to a user-specified device. A <em>kernel</em> is the <em>data-parallel region</em> of a program submitted
+for execution on the device. There can be multiple data-parallel regions, and hence multiple <em>offload kernels</em>.</p>
+<p>Kernels can be pre-compiled into a library, such as <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>, or directly coded
+in a programming language for heterogeneous computing, such as <a class="reference external" href="https://www.khronos.org/opencl/">OpenCl*</a> or <a class="reference external" href="https://www.apress.com/gp/book/9781484255735">DPC++</a> .
+<strong>Data Parallel Extensions for Python</strong> offer the way of writing kernels directly in Python
+using <a class="reference external" href="https://numba.pydata.org/">Numba*</a> compiler along with <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code>, the <a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a>.</p>
+<p>One or more kernels are submitted for execution into a <em>queue</em> targeting an <em>offload device</em>.
+For each device, you can create one or more queues. In most cases, you do not need to work
+with device queues directly. Data Parallel Extensions for Python will do necessary underlying
+work with queues for you through the <a class="reference internal" href="#compute-follows-data"><span class="std std-ref">Compute-Follows-Data</span></a>.</p>
+</section>
+<section id="unified-shared-memory">
+<h2>Unified Shared Memory<a class="headerlink" href="#unified-shared-memory" title="Permalink to this heading">¶</a></h2>
+<p>Each device has its memory, not necessarily accessible from another device.</p>
+<a class="reference internal image-reference" href="_images/hetero-devices.png"><img alt="SIMD" class="align-center" src="_images/hetero-devices.png" style="width: 600px;" /></a>
+<p>For example, <strong>Device 1</strong> memory may not be directly accessible from the host but accessible
+via expensive copying by a driver software. Similarly, depending on the architecture, direct data
+exchange between <strong>Device 2</strong> and <strong>Device 1</strong> may be only impossible possible via expensive
+copying through the host memory. These aspects must be taken into consideration when programming
+data parallel devices.</p>
+<p>On the illustration above the <strong>Device 2</strong> logically consists of two sub-devices: <strong>Sub-Device 1</strong>
+and <strong>Sub-Device 2</strong>. The programming model allows accessing <strong>Device 2</strong> as a single logical device, or
+by working with each individual sub-devices. For the former case a programmer needs to create
+a queue for <strong>Device 2</strong>. For the latter case a programmer needs to create 2 queues, one for each sub-device.</p>
+<p><a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> standard introduces a concept of the <em>Unified Shared Memory</em> (USM). USM requires hardware support
+for unified virtual address space, which allows coherency between the host and the device
+pointers. The host allocates all memory, but offers three distinct allocation types:</p>
+<ul class="simple">
+<li><p><strong>Host: located on the host, accessible by the host or device.</strong> This type of memory is useful in a situation
+when you need to stream read-only data from the host to the device once.</p></li>
+<li><p><strong>Device: located on the device, accessible by device only.</strong> The fastest type of memory.
+Useful in a situation when most of the data crunching happens on the device.</p></li>
+<li><p><strong>Shared: location is both host and device, accessible by the host and device</strong>.
+Shared allocations are useful when both host and device access data,
+since a user does not need to manage data migration explicitly.
+However, it is much slower than the USM Device memory type.</p></li>
+</ul>
+</section>
+<section id="compute-follows-data">
+<h2>Compute-Follows-Data<a class="headerlink" href="#compute-follows-data" title="Permalink to this heading">¶</a></h2>
+<p>Since data copying between devices is typically very expensive, for performance reasons it is essential
+to process data close to where it is allocated. This is the premise of the <em>Compute-Follows-Data</em> programming model,
+which states that the compute happens where the data resides. Tensors implemented in <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> and <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>
+carry information about allocation queues, and hence, about the device on which an array is allocated.
+Based on tensor input arguments of the offload kernel, it deduces the queue on which the execution happens.</p>
+<a class="reference internal image-reference" href="_images/kernel-queue-device.png"><img alt="SIMD" class="align-center" src="_images/kernel-queue-device.png" style="width: 600px;" /></a>
+<p>The picture above illustrates the <em>Compute-Follows-Data</em> concept. Arrays <code class="docutils literal notranslate"><span class="pre">A</span></code> and <code class="docutils literal notranslate"><span class="pre">B</span></code> are inputs to the
+<strong>Offload Kernel</strong>. These arrays carry information about their <em>allocation queue</em> (<strong>Device Queue</strong>) and the
+<em>device</em> (<strong>Device 1</strong>) where they were created. According to the Compute-Follows-Data paradigm
+the <strong>Offload Kernel</strong> will be submitted to this <strong>Device Queue</strong>, and the resulting array <code class="docutils literal notranslate"><span class="pre">C</span></code> will
+be created on the <strong>Device Queue</strong> associated with the <strong>Device 1</strong>.</p>
+<p><strong>Data Parallel Extensions for Python</strong> require all input tensor arguments to have the <strong>same</strong> allocation queue.
+Otherwise, an exception is thrown. For example, the following usages will result in an exception.</p>
+<figure class="align-center" id="id2">
+<a class="reference internal image-reference" href="_images/queue-exception1.png"><img alt="SIMD" src="_images/queue-exception1.png" style="width: 600px;" /></a>
+<figcaption>
+<p><span class="caption-text">Input tensors are on different devices and different queues. Exception is thrown.</span><a class="headerlink" href="#id2" title="Permalink to this image">¶</a></p>
+</figcaption>
+</figure>
+<figure class="align-center" id="id3">
+<a class="reference internal image-reference" href="_images/queue-exception2.png"><img alt="SIMD" src="_images/queue-exception2.png" style="width: 600px;" /></a>
+<figcaption>
+<p><span class="caption-text">Input tensors are on the same device, but queues are different. Exception is thrown.</span><a class="headerlink" href="#id3" title="Permalink to this image">¶</a></p>
+</figcaption>
+</figure>
+<figure class="align-center" id="id4">
+<a class="reference internal image-reference" href="_images/queue-exception3.png"><img alt="SIMD" src="_images/queue-exception3.png" style="width: 600px;" /></a>
+<figcaption>
+<p><span class="caption-text">Data belongs to the same device, but queues are different and associated with different sub-devices.</span><a class="headerlink" href="#id4" title="Permalink to this image">¶</a></p>
+</figcaption>
+</figure>
+</section>
+<section id="copying-data-between-devices-and-queues">
+<h2>Copying Data Between Devices and Queues<a class="headerlink" href="#copying-data-between-devices-and-queues" title="Permalink to this heading">¶</a></h2>
+<p><strong>Data Parallel Extensions for Python</strong> create <strong>one</strong> <em>canonical queue</em> per device. Normally,
+you do not need to directly manage queues. Having one canonical queue per device
+allows you to copy data between devices using the <code class="docutils literal notranslate"><span class="pre">to_device()</span></code> method:</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a_new</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">to_device</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Array <code class="docutils literal notranslate"><span class="pre">a</span></code> is copied to the device associated with array <code class="docutils literal notranslate"><span class="pre">b</span></code> into the new array <code class="docutils literal notranslate"><span class="pre">a_new</span></code>.
+The same queue is associated with <code class="docutils literal notranslate"><span class="pre">b</span></code> and <code class="docutils literal notranslate"><span class="pre">a_new</span></code>.</p>
+<p>Alternatively, you can do this as follows:</p>
+<div class="literal-block-wrapper docutils container" id="id5">
+<div class="code-block-caption"><span class="caption-text">DPNP array</span><a class="headerlink" href="#id5" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a_new</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="id6">
+<div class="code-block-caption"><span class="caption-text">DPCtl array</span><a class="headerlink" href="#id6" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a_new</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">tensor</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+</section>
+<section id="creating-additional-queues">
+<h2>Creating Additional Queues<a class="headerlink" href="#creating-additional-queues" title="Permalink to this heading">¶</a></h2>
+<p>As said before, <strong>Data Parallel Extensions for Python</strong> automatically creates one canonical queue per device,
+and you normally work with this queue implicitly. However, you can always create as many additional queues per device
+as needed and work explicitly with them, for example, for profiling purposes.</p>
+<p>Read <a class="reference external" href="https://intelpython.github.io/dpctl/latest/index.html">Data Parallel Control</a> documentation for more details about queues.</p>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="parallelism.html"
+                          title="previous chapter">Parallelism in Modern Data-Parallel Architectures</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="programming_dpep.html"
+                          title="next chapter">Programming with Data Parallel Extensions for Python</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/index.html b/pull/45/index.html
new file mode 100644
index 0000000..451ddd1
--- /dev/null
+++ b/pull/45/index.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Data Parallel Extensions for Python &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Prerequisites and Installation" href="prerequisites_and_installation.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="#"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="prerequisites_and_installation.html" title="Prerequisites and Installation">
+	  next &raquo;
+	</a>
+      </li>
+      <li>
+	<a href="#">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+       
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="index"></span><a class="reference internal image-reference" href="_images/DPEP-large.png"><img alt="Data Parallel Extensions for Python" class="align-center" src="_images/DPEP-large.png" style="width: 400px;" /></a>
+<section id="data-parallel-extensions-for-python">
+<h1>Data Parallel Extensions for Python<a class="headerlink" href="#data-parallel-extensions-for-python" title="Permalink to this heading">¶</a></h1>
+<p>Data Parallel Extensions for Python* extend numerical Python capabilities beyond CPU and allow even higher performance
+gains on data parallel devices, such as GPUs. It consists of three foundational packages:</p>
+<ul class="simple">
+<li><p><strong>dpnp</strong> - Data Parallel Extensions for <a class="reference external" href="https://numpy.org/">Numpy*</a> - a library that implements a subset of
+Numpy that can be executed on any data parallel device. The subset is a drop-in replacement
+of core Numpy functions and numerical data types.</p></li>
+<li><p><strong>numba_dpex</strong> - Data Parallel Extensions for <a class="reference external" href="https://numba.pydata.org/">Numba*</a> - an extension for Numba compiler
+that lets you program data-parallel devices as you program CPU with Numba.</p></li>
+<li><p><strong>dpctl - Data Parallel Control library</strong> that provides utilities for device selection,
+allocation of data on devices, tensor data structure along with <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> implementation, and support for creation of user-defined data-parallel extensions.</p></li>
+</ul>
+<section id="table-of-contents">
+<h2>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this heading">¶</a></h2>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="prerequisites_and_installation.html#device-drivers">1. Device Drivers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="prerequisites_and_installation.html#python-interpreter">2. Python Interpreter</a></li>
+<li class="toctree-l2"><a class="reference internal" href="prerequisites_and_installation.html#data-parallel-extensions-for-python">3. Data Parallel Extensions for Python</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#device-offload">Device Offload</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#unified-shared-memory">Unified Shared Memory</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#compute-follows-data">Compute-Follows-Data</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#copying-data-between-devices-and-queues">Copying Data Between Devices and Queues</a></li>
+<li class="toctree-l2"><a class="reference internal" href="heterogeneous_computing.html#creating-additional-queues">Creating Additional Queues</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#scalars-vs-0-dimensional-arrays">Scalars vs. 0-Dimensional Arrays</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#data-parallel-extension-for-numpy-dpnp">Data Parallel Extension for Numpy - dpnp</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#data-parallel-extension-for-numba-numba-dpex">Data Parallel Extension for Numba - numba-dpex</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#data-parallel-control-dpctl">Data Parallel Control - dpctl</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#debugging-and-profiling-data-parallel-extensions-for-python">Debugging and Profiling Data Parallel Extensions for Python</a></li>
+<li class="toctree-l2"><a class="reference internal" href="programming_dpep.html#writing-robust-numerical-codes-for-heterogeneous-computing">Writing Robust Numerical Codes for Heterogeneous Computing</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/01-get_started.html">Getting Started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/03-mandelbrot_perfomance.html">Examples with performance using Mandelbrot calculation</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+</div>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="prerequisites_and_installation.html"
+                          title="next chapter">Prerequisites and Installation</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/jupyter_notebook.html b/pull/45/jupyter_notebook.html
new file mode 100644
index 0000000..a401ffb
--- /dev/null
+++ b/pull/45/jupyter_notebook.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Tutorials &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python" href="notebooks/01-get_started.html" />
+    <link rel="prev" title="Examples" href="examples.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="notebooks/01-get_started.html" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="examples.html" title="Examples">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Tutorials</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="jupyter-notebook"></span><section id="tutorials">
+<h1>Tutorials<a class="headerlink" href="#tutorials" title="Permalink to this heading">¶</a></h1>
+<p>Getting started Jupyter* Notebooks illustrating the usage of <strong>Data Parallel Extensions for Python</strong> are located
+in the <a class="reference external" href="https://github.com/IntelPython/DPEP/tree/main/notebooks">GitHub repository</a></p>
+<p>To run the tutorial, in the command line prompt type:</p>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">jupyter notebook</span>
+</pre></div>
+</div>
+<p>This will print some information about the notebook server in your terminal, including the URL of
+the web application (by default, <code class="docutils literal notranslate"><span class="pre">http://localhost:8888</span></code>):</p>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>jupyter<span class="w"> </span>notebook
+<span class="go">[I 08:58:24.417 NotebookApp] Serving notebooks from local directory: /Users/catherine</span>
+<span class="go">[I 08:58:24.417 NotebookApp] 0 active kernels</span>
+<span class="go">[I 08:58:24.417 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/</span>
+<span class="go">[I 08:58:24.417 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).</span>
+<span class="go">It will then open your default web browser to this URL.</span>
+</pre></div>
+</div>
+<p>When the notebook opens in your browser, you will see the Notebook Dashboard,
+which will show a list of the notebooks, files, and subdirectories
+in the directory where the notebook server was started.
+Navigate to the notebook of your interest and open it in the dashboard.</p>
+<p>For more information please refer to <a class="reference external" href="https://docs.jupyter.org/en/latest/running.html">Jupyter documentation</a></p>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="notebooks/01-get_started.html">Getting Started</a></li>
+<li class="toctree-l1"><a class="reference internal" href="notebooks/02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+<li class="toctree-l1"><a class="reference internal" href="notebooks/03-mandelbrot_perfomance.html">Examples with performance using Mandelbrot calculation</a></li>
+</ul>
+</div>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Tutorials</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/01-get_started.html">Getting Started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+<li class="toctree-l2"><a class="reference internal" href="notebooks/03-mandelbrot_perfomance.html">Examples with performance using Mandelbrot calculation</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="examples.html"
+                          title="previous chapter">Examples</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="notebooks/01-get_started.html"
+                          title="next chapter">Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/notebooks/01-get_started.html b/pull/45/notebooks/01-get_started.html
new file mode 100644
index 0000000..38e0cb3
--- /dev/null
+++ b/pull/45/notebooks/01-get_started.html
@@ -0,0 +1,473 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/sdc.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
+    
+    <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
+    <script src="../_static/doctools.js"></script>
+    <script src="../_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="../_static/sidebar.js"></script>
+    <script type="text/javascript" src="../_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" />
+    <link rel="next" title="Jupyter Notebook 2: Falling back to NumPy" href="02-dpnp_numpy_fallback.html" />
+    <link rel="prev" title="Tutorials" href="../jupyter_notebook.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="../other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="../index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="../examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="02-dpnp_numpy_fallback.html" title="Jupyter Notebook 2: Falling back to NumPy">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="../jupyter_notebook.html" title="Tutorials">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="../index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      <li><a href="../jupyter_notebook.html" accesskey="U">Tutorials</a> &#187;</li>
+      
+      <li>Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <section id="Jupyter-Notebook-1:-Getting-started-with-Data-Parallel-Extensions-for-Python">
+<h1>Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python<a class="headerlink" href="#Jupyter-Notebook-1:-Getting-started-with-Data-Parallel-Extensions-for-Python" title="Permalink to this heading">¶</a></h1>
+<p><img alt="5158f4d26e28435b90a448aeb74880b7" class="no-scaled-link" src="https://intelpython.github.io/DPEP/main/_images/DPEP-large.png" style="width: 300px;" /></p>
+<p><a class="reference external" href="https://intelpython.github.io/DPEP/main/">Data Parallel Extensions for Python</a> allow you to run NumPy-like code beyond CPU using <strong>Data Parallel Extension for NumPy</strong>. It will also allow you to compile the code using <strong>Data Parallel Extension for Numba</strong>.</p>
+<section id="Modifying-CPU-script-to-run-on-GPU">
+<h2>Modifying CPU script to run on GPU<a class="headerlink" href="#Modifying-CPU-script-to-run-on-GPU" title="Permalink to this heading">¶</a></h2>
+<p>In many cases the process of running Python on GPU is about making minor changes to your CPU script, which are: 1. Changing import statement(s) 2. Specifying on which device(s) the data is allocated 3. Explicitly copying data between devices and the host as needed</p>
+<p>We will illustrate these concepts on series of short examples. Let’s assume we have the following NumPy script originally written to run on CPU, which is nothing more than creating two matrices <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code> and performing matrix-matrix multiplication with <code class="docutils literal notranslate"><span class="pre">numpy.matmul()</span></code>, and prining the resulting matrix:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># CPU script for matrix-matrix multiplication using NumPy</span>
+
+<span class="c1"># 1. Import numpy</span>
+<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="c1"># 2. Create two matrices</span>
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+
+<span class="c1"># 3. Perform matrix-matrix multiplication</span>
+<span class="n">res</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">matmul</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
+
+<span class="c1"># 4. Print resulting matrix</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+[[2 2]
+ [2 2]]
+</pre></div></div>
+</div>
+<p>As stated before in many cases to run the same code on GPU is a trivial modification of a few lines of the code, like this:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Modified script to run the same code on GPU using dpnp</span>
+
+<span class="c1"># 1. Import dpnp</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>  <span class="c1"># Note, we changed the import statement. Since dpnp is a drop-in replacement of numpy the rest of the code will run lik regular numpy</span>
+
+<span class="c1"># 2. Create two matrices</span>
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
+
+<span class="c1"># 3. Perform matrix-matrix multiplication</span>
+<span class="n">res</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">matmul</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
+
+<span class="c1"># 4. Print what&#39;s going on under the hood</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array y is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;res is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+[[2 2]
+ [2 2]]
+Array x is allocated on the device: Device(level_zero:gpu:0)
+Array y is allocated on the device: Device(level_zero:gpu:0)
+res is allocated on the device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+<p>Let’s see what we actually changed.</p>
+<ol class="arabic simple">
+<li><p>Obviously we changed the import statement. Now we import <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>, which is a drop-in replacement for a subset of <code class="docutils literal notranslate"><span class="pre">numpy</span></code> that extends numpy-like codes beyond CPU</p></li>
+<li><p>No change in matrix creation code. How does <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> know that matrices <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code> need to be allocated on GPU? This is because, if we do not specify the device explicitly, the driver will use the default device, which is GPU on systems with installed GPU drivers.</p></li>
+<li><p>No change in matrix multiplication code. This is because <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> programming model is the Compute-Follows-Data. It means that <code class="docutils literal notranslate"><span class="pre">dpnp.matmul()</span></code> determines which device will execute an operation based on where array inputs are allocated. Since our inputs <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code> are allocated on the default device (GPU) the matrix-matrix multiplication will follow data allocation and execute on GPU too.</p></li>
+<li><p>Note, arrays <code class="docutils literal notranslate"><span class="pre">x</span></code>, <code class="docutils literal notranslate"><span class="pre">y</span></code>, <code class="docutils literal notranslate"><span class="pre">res</span></code> all have the <code class="docutils literal notranslate"><span class="pre">device</span></code> attribute by printing which we make sure that all inputs are indeed on the GPU device, and the result is also on the GPU deivice. To be precise the data allocation (and execution) happened on GPU device 0 through Level-Zero driver.</p></li>
+</ol>
+</section>
+<section id="More-on-data-allocation-and-the-Compute-Follows-Data">
+<h2>More on data allocation and the Compute-Follows-Data<a class="headerlink" href="#More-on-data-allocation-and-the-Compute-Follows-Data" title="Permalink to this heading">¶</a></h2>
+<p>Sometimes you may want to be specific about the device type, not relying on the default behavior. You can do so by specifying the device in a keyword arguments for <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array creation functions and random number generators.</p>
+<div class="nbinput nblast docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="n">step</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<p><code class="docutils literal notranslate"><span class="pre">dpnp.arange()</span></code> is the array creation function that has optional keyword argument <code class="docutils literal notranslate"><span class="pre">device</span></code>, using which you can specify the device you want data to be allocated on with filter selector string. In our case the string specifies device type <code class="docutils literal notranslate"><span class="pre">&quot;gpu&quot;</span></code>. The proper way of handling situations when the specified device is not available would be as follows:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="n">step</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The a is allocated on the device:&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+    <span class="c1"># Do some fallback code</span>
+
+<span class="c1"># Do reduction on the selected device</span>
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Reduction sum y: &quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 75</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y.shape=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+The a is allocated on the device: Device(level_zero:gpu:0)
+Reduction sum y:  75
+Result y is located on the device: Device(level_zero:gpu:0)
+y.shape= ()
+</pre></div></div>
+</div>
+<p>Note that <code class="docutils literal notranslate"><span class="pre">y</span></code> is itself a device array (not a scalar!), its data resides on the same device as input array <code class="docutils literal notranslate"><span class="pre">a</span></code>.</p>
+<section id="Advanced-data-and-device-control-with-Data-Parallel-Control-library-dpctl">
+<h3>Advanced data and device control with Data Parallel Control library <code class="docutils literal notranslate"><span class="pre">dpctl</span></code><a class="headerlink" href="#Advanced-data-and-device-control-with-Data-Parallel-Control-library-dpctl" title="Permalink to this heading">¶</a></h3>
+<p>Data Parallel Control library, <code class="docutils literal notranslate"><span class="pre">dpctl</span></code>, among other things provide advanced capabilities for controling devices and data. Among its useful functions is <code class="docutils literal notranslate"><span class="pre">dpctl.lsplatform(verbosity)</span></code>, printing information about the list of available devices on the system with different levels of verbosity:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">()</span>  <span class="c1"># Print platform information</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Intel(R) OpenCL HD Graphics OpenCL 3.0
+Intel(R) Level-Zero 1.3
+</pre></div></div>
+</div>
+<p>Using a different verbosity setting to print extra meta-data:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>  <span class="c1"># Print platform information with verbocitz level 2 (highest level)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Platform  0 ::
+    Name        Intel(R) OpenCL HD Graphics
+    Version     OpenCL 3.0
+    Vendor      Intel(R) Corporation
+    Backend     opencl
+    Num Devices 1
+      # 0
+        Name                Intel(R) UHD Graphics 620
+        Version             31.0.101.2111
+        Filter string       opencl:gpu:0
+Platform  1 ::
+    Name        Intel(R) Level-Zero
+    Version     1.3
+    Vendor      Intel(R) Corporation
+    Backend     ext_oneapi_level_zero
+    Num Devices 1
+      # 0
+        Name                Intel(R) UHD Graphics 620
+        Version             1.3.0
+        Filter string       level_zero:gpu:0
+</pre></div></div>
+</div>
+<p>You can also query whether system has GPU devices and retrieve respective device objects:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="k">if</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">has_gpu_devices</span><span class="p">():</span>
+    <span class="n">devices</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s1">&#39;gpu&#39;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;This system has </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">devices</span><span class="p">)</span><span class="si">}</span><span class="s2"> GPUs&quot;</span><span class="p">)</span>
+    <span class="k">for</span> <span class="n">device</span> <span class="ow">in</span> <span class="n">devices</span><span class="p">:</span>
+        <span class="n">device</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span>
+
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="n">devices</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>  <span class="c1"># Another way of selecting on which device to allocate the data</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x is on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="k">else</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU devices are not available on this system&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+This system has 2 GPUs
+    Name            Intel(R) UHD Graphics 620
+    Driver version  31.0.101.2111
+    Vendor          Intel(R) Corporation
+    Filter string   opencl:gpu:0
+
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+Array x is on the device: Device(opencl:gpu:0)
+</pre></div></div>
+</div>
+<p>The following snapshot illustrates how to select the default GPU device using <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> and generate an array of random numbers on this device:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
+    <span class="n">gpu</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">select_gpu_device</span><span class="p">()</span>
+    <span class="n">gpu</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span> <span class="c1"># print GPU device information</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">gpu</span><span class="p">)</span>  <span class="c1"># Create array of random numbers on the default GPU device</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x.device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;No GPU devices available&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+Array x: [0.87253657 0.87415047 0.61092713 0.1395424  0.95248436]
+Array x.device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+<p>Or by creating GPU device object from the filter selector string:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[9]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">l0_gpu_0</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">SyclDevice</span><span class="p">(</span><span class="s2">&quot;level_zero:gpu:0&quot;</span><span class="p">)</span>
+    <span class="n">l0_gpu_0</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Cannot create the device object from a given filter selector string&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+</pre></div></div>
+</div>
+<p>The following snapshot checks whether a given device supports certain aspects, which may be important for the application, such as support for float64 (double precision) or the amount of available global memory on the device, etc.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">gpu</span> <span class="o">=</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">select_gpu_device</span><span class="p">()</span>
+    <span class="n">gpu</span><span class="o">.</span><span class="n">print_device_info</span><span class="p">()</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has double precision:&quot;</span><span class="p">,</span> <span class="n">gpu</span><span class="o">.</span><span class="n">has_aspect_fp64</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has atomic operations support:&quot;</span><span class="p">,</span> <span class="n">gpu</span><span class="o">.</span><span class="n">has_aspect_atomic64</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Global memory size: </span><span class="si">{</span><span class="n">gpu</span><span class="o">.</span><span class="n">global_mem_size</span><span class="o">/</span><span class="mi">1024</span><span class="o">/</span><span class="mi">1024</span><span class="si">}</span><span class="s2"> MB&quot;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Global memory cache size: </span><span class="si">{</span><span class="n">gpu</span><span class="o">.</span><span class="n">global_mem_cache_size</span><span class="o">/</span><span class="mi">1024</span><span class="si">}</span><span class="s2"> KB&quot;</span><span class="p">)</span>
+    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Maximum compute units: </span><span class="si">{</span><span class="n">gpu</span><span class="o">.</span><span class="n">max_compute_units</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+<span class="k">except</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The GPU device is not available&quot;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+    Name            Intel(R) UHD Graphics 620
+    Driver version  1.3.0
+    Vendor          Intel(R) Corporation
+    Filter string   level_zero:gpu:0
+
+Has double precision: True
+Has atomic operations support: True
+Global memory size: 6284.109375 MB
+Global memory cache size: 512.0 KB
+Maximum compute units: 24
+</pre></div></div>
+</div>
+<p>For more information about <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> device selection please refer to <a class="reference external" href="https://intelpython.github.io/dpctl/latest/docfiles/user_guides/manual/dpctl/device_selection.html">Data Parallel Control: Device Selection</a></p>
+<p>For more information about <code class="docutils literal notranslate"><span class="pre">dpctl.SyclDevice</span></code> class methods and attributes please refer to <a class="reference external" href="https://intelpython.github.io/dpctl/latest/docfiles/dpctl/SyclDevice.html">Data Parallel Control: dpctl.SyclDevice</a></p>
+</section>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../examples.html">Examples</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../jupyter_notebook.html">Tutorials</a><ul class="current">
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Getting Started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+<li class="toctree-l2"><a class="reference internal" href="03-mandelbrot_perfomance.html">Examples with performance using Mandelbrot calculation</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="../jupyter_notebook.html"
+                          title="previous chapter">Tutorials</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="02-dpnp_numpy_fallback.html"
+                          title="next chapter">Jupyter Notebook 2: Falling back to NumPy</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/notebooks/01-get_started.ipynb b/pull/45/notebooks/01-get_started.ipynb
new file mode 100644
index 0000000..e0a970a
--- /dev/null
+++ b/pull/45/notebooks/01-get_started.ipynb
@@ -0,0 +1,490 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "a002ea61",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "# Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python\n",
+    "<img src=\"https://intelpython.github.io/DPEP/main/_images/DPEP-large.png\" width=\"300\"/>\n",
+    "\n",
+    "[Data Parallel Extensions for Python](https://intelpython.github.io/DPEP/main/) allow you to run NumPy-like code beyond CPU using **Data Parallel Extension for NumPy**. It will also allow you to compile the code using **Data Parallel Extension for Numba**. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0565bf88-a3e9-4ee3-a815-3efe977c2a8f",
+   "metadata": {
+    "jp-MarkdownHeadingCollapsed": true,
+    "tags": []
+   },
+   "source": [
+    "## Modifying CPU script to run on GPU\n",
+    "\n",
+    "In many cases the process of running Python on GPU is about making minor changes to your CPU script, which are:\n",
+    "1. Changing import statement(s)\n",
+    "2. Specifying on which device(s) the data is allocated\n",
+    "3. Explicitly copying data between devices and the host as needed\n",
+    "\n",
+    "We will illustrate these concepts on series of short examples. Let's assume we have the following NumPy script originally written to run on CPU, which is nothing more than creating two matrices `x` and `y` and performing matrix-matrix multiplication with `numpy.matmul()`, and prining the resulting matrix:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "d9e8711d",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[2 2]\n",
+      " [2 2]]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# CPU script for matrix-matrix multiplication using NumPy\n",
+    "\n",
+    "# 1. Import numpy\n",
+    "import numpy as np\n",
+    "\n",
+    "# 2. Create two matrices\n",
+    "x = np.array([[1, 1], [1, 1]])\n",
+    "y = np.array([[1, 1], [1, 1]])\n",
+    "\n",
+    "# 3. Perform matrix-matrix multiplication\n",
+    "res = np.matmul(x, y)\n",
+    "\n",
+    "# 4. Print resulting matrix\n",
+    "print(res)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "402c3d61",
+   "metadata": {},
+   "source": [
+    "As stated before in many cases to run the same code on GPU is a trivial modification of a few lines of the code, like this:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "c10b7d83",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[2 2]\n",
+      " [2 2]]\n",
+      "Array x is allocated on the device: Device(level_zero:gpu:0)\n",
+      "Array y is allocated on the device: Device(level_zero:gpu:0)\n",
+      "res is allocated on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Modified script to run the same code on GPU using dpnp\n",
+    "\n",
+    "# 1. Import dpnp\n",
+    "import dpnp as np  # Note, we changed the import statement. Since dpnp is a drop-in replacement of numpy the rest of the code will run lik regular numpy\n",
+    "\n",
+    "# 2. Create two matrices\n",
+    "x = np.array([[1, 1], [1, 1]])\n",
+    "y = np.array([[1, 1], [1, 1]])\n",
+    "\n",
+    "# 3. Perform matrix-matrix multiplication\n",
+    "res = np.matmul(x, y)\n",
+    "\n",
+    "# 4. Print what's going on under the hood\n",
+    "print(res)\n",
+    "print(\"Array x is allocated on the device:\", x.device)\n",
+    "print(\"Array y is allocated on the device:\", y.device)\n",
+    "print(\"res is allocated on the device:\", res.device)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d6a58f17",
+   "metadata": {},
+   "source": [
+    "Let's see what we actually changed.\n",
+    "\n",
+    "1. Obviously we changed the import statement. Now we import `dpnp`, which is a drop-in replacement for a subset of `numpy` that extends numpy-like codes beyond CPU\n",
+    "2. No change in matrix creation code. How does `dpnp` know that matrices `x` and `y` need to be allocated on GPU? This is because, if we do not specify the device explicitly, the driver will use the default device, which is GPU on systems with installed GPU drivers.\n",
+    "3. No change in matrix multiplication code. This is because `dpnp` programming model is the Compute-Follows-Data. It means that `dpnp.matmul()` determines which device will execute an operation based on where array inputs are allocated. Since our inputs `x` and `y` are allocated on the default device (GPU) the matrix-matrix multiplication will follow data allocation and execute on GPU too.\n",
+    "4. Note, arrays `x`, `y`, `res` all have the `device` attribute by printing which we make sure that all inputs are indeed on the GPU device, and the result is also on the GPU deivice. To be precise the data allocation (and execution) happened on GPU device 0 through Level-Zero driver."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "be340585",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "## More on data allocation and the Compute-Follows-Data\n",
+    "\n",
+    "Sometimes you may want to be specific about the device type, not relying on the default behavior. You can do so by specifying the device in a keyword arguments for `dpnp` array creation functions and random number generators."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "0435d7f0",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import dpnp as np\n",
+    "\n",
+    "a = np.arange(3, 30, step = 6, device=\"gpu\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a6765095",
+   "metadata": {},
+   "source": [
+    "`dpnp.arange()` is the array creation function that has optional keyword argument `device`, using which you can specify the device you want data to be allocated on with filter selector string. In our case the string specifies device type `\"gpu\"`. The proper way of handling situations when the specified device is not available would be as follows:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "e613398f",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "The a is allocated on the device: Device(level_zero:gpu:0)\n",
+      "Reduction sum y:  75\n",
+      "Result y is located on the device: Device(level_zero:gpu:0)\n",
+      "y.shape= ()\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpnp as np\n",
+    "\n",
+    "try:\n",
+    "    a = np.arange(3, 30, step = 6, device=\"gpu\")\n",
+    "    print(\"The a is allocated on the device:\", a.device)\n",
+    "except:\n",
+    "    print(\"GPU device is not available\")\n",
+    "    # Do some fallback code\n",
+    "\n",
+    "# Do reduction on the selected device\n",
+    "y = np.sum(a)\n",
+    "\n",
+    "print(\"Reduction sum y: \", y)  # Expect 75\n",
+    "print(\"Result y is located on the device:\", y.device)\n",
+    "print(\"y.shape=\", y.shape)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "88b4915e",
+   "metadata": {},
+   "source": [
+    "Note that `y` is itself a device array (not a scalar!), its data resides on the same device as input array `a`."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "94cb3b9b",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "### Advanced data and device control with Data Parallel Control library `dpctl`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9fb4b1b5",
+   "metadata": {},
+   "source": [
+    "Data Parallel Control library, `dpctl`, among other things provide advanced capabilities for controling devices and data. Among its useful functions is `dpctl.lsplatform(verbosity)`, printing information about the list of available devices on the system with different levels of verbosity:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "b890ae71",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Intel(R) OpenCL HD Graphics OpenCL 3.0 \n",
+      "Intel(R) Level-Zero 1.3\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "dpctl.lsplatform()  # Print platform information"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "db5e8db4",
+   "metadata": {},
+   "source": [
+    "Using a different verbosity setting to print extra meta-data:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "ffcf0cfb",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Platform  0 ::\n",
+      "    Name        Intel(R) OpenCL HD Graphics\n",
+      "    Version     OpenCL 3.0 \n",
+      "    Vendor      Intel(R) Corporation\n",
+      "    Backend     opencl\n",
+      "    Num Devices 1\n",
+      "      # 0\n",
+      "        Name                Intel(R) UHD Graphics 620\n",
+      "        Version             31.0.101.2111\n",
+      "        Filter string       opencl:gpu:0\n",
+      "Platform  1 ::\n",
+      "    Name        Intel(R) Level-Zero\n",
+      "    Version     1.3\n",
+      "    Vendor      Intel(R) Corporation\n",
+      "    Backend     ext_oneapi_level_zero\n",
+      "    Num Devices 1\n",
+      "      # 0\n",
+      "        Name                Intel(R) UHD Graphics 620\n",
+      "        Version             1.3.0\n",
+      "        Filter string       level_zero:gpu:0\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "dpctl.lsplatform(2)  # Print platform information with verbocitz level 2 (highest level)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f63525d3",
+   "metadata": {},
+   "source": [
+    "You can also query whether system has GPU devices and retrieve respective device objects:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "84ff47e9",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "This system has 2 GPUs\n",
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  31.0.101.2111\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   opencl:gpu:0\n",
+      "\n",
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Array x is on the device: Device(opencl:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "import dpnp as np\n",
+    "\n",
+    "if dpctl.has_gpu_devices():\n",
+    "    devices = dpctl.get_devices(device_type='gpu')\n",
+    "    print(f\"This system has {len(devices)} GPUs\")\n",
+    "    for device in devices:\n",
+    "        device.print_device_info()\n",
+    "        \n",
+    "    x = np.array([1, 2, 3], device=devices[0])  # Another way of selecting on which device to allocate the data\n",
+    "    print(\"Array x is on the device:\", x.device)\n",
+    "else:\n",
+    "    print(\"GPU devices are not available on this system\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e0918733-0992-41e8-bfa5-228a080bc165",
+   "metadata": {},
+   "source": [
+    "The following snapshot illustrates how to select the default GPU device using `dpctl` and generate an array of random numbers on this device:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "1c068447",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Array x: [0.87253657 0.87415047 0.61092713 0.1395424  0.95248436]\n",
+      "Array x.device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "try:\n",
+    "    gpu = dpctl.select_gpu_device()\n",
+    "    gpu.print_device_info() # print GPU device information\n",
+    "    x = np.random.random(5, device=gpu)  # Create array of random numbers on the default GPU device\n",
+    "    print(\"Array x:\", x)\n",
+    "    print(\"Array x.device:\", x.device)\n",
+    "except:\n",
+    "    print (\"No GPU devices available\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c378b79d",
+   "metadata": {},
+   "source": [
+    "Or by creating GPU device object from the filter selector string:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "ad83abb5",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "try:\n",
+    "    l0_gpu_0 = dpctl.SyclDevice(\"level_zero:gpu:0\")\n",
+    "    l0_gpu_0.print_device_info()\n",
+    "except:\n",
+    "    print(\"Cannot create the device object from a given filter selector string\")    "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "eadefe0b",
+   "metadata": {},
+   "source": [
+    "The following snapshot checks whether a given device supports certain aspects, which may be important for the application, such as support for float64 (double precision) or the amount of available global memory on the device, etc."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "a94756d7",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "    Name            Intel(R) UHD Graphics 620\n",
+      "    Driver version  1.3.0\n",
+      "    Vendor          Intel(R) Corporation\n",
+      "    Filter string   level_zero:gpu:0\n",
+      "\n",
+      "Has double precision: True\n",
+      "Has atomic operations support: True\n",
+      "Global memory size: 6284.109375 MB\n",
+      "Global memory cache size: 512.0 KB\n",
+      "Maximum compute units: 24\n"
+     ]
+    }
+   ],
+   "source": [
+    "import dpctl\n",
+    "\n",
+    "try:\n",
+    "    gpu = dpctl.select_gpu_device()\n",
+    "    gpu.print_device_info()\n",
+    "    print(\"Has double precision:\", gpu.has_aspect_fp64)\n",
+    "    print(\"Has atomic operations support:\", gpu.has_aspect_atomic64)\n",
+    "    print(f\"Global memory size: {gpu.global_mem_size/1024/1024} MB\")\n",
+    "    print(f\"Global memory cache size: {gpu.global_mem_cache_size/1024} KB\")\n",
+    "    print(f\"Maximum compute units: {gpu.max_compute_units}\")\n",
+    "except:\n",
+    "    print(\"The GPU device is not available\")   "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "97b53113-8264-4f7e-9a9d-a997e70ed3bc",
+   "metadata": {},
+   "source": [
+    "For more information about `dpctl` device selection please refer to [Data Parallel Control: Device Selection](https://intelpython.github.io/dpctl/latest/docfiles/user_guides/manual/dpctl/device_selection.html)\n",
+    "\n",
+    "For more information about `dpctl.SyclDevice` class methods and attributes please refer to [Data Parallel Control: dpctl.SyclDevice](https://intelpython.github.io/dpctl/latest/docfiles/dpctl/SyclDevice.html)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pull/45/notebooks/02-dpnp_numpy_fallback.html b/pull/45/notebooks/02-dpnp_numpy_fallback.html
new file mode 100644
index 0000000..d273f4a
--- /dev/null
+++ b/pull/45/notebooks/02-dpnp_numpy_fallback.html
@@ -0,0 +1,287 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Jupyter Notebook 2: Falling back to NumPy &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/sdc.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
+    
+    <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
+    <script src="../_static/doctools.js"></script>
+    <script src="../_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="../_static/sidebar.js"></script>
+    <script type="text/javascript" src="../_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" />
+    <link rel="next" title="Examples with performance using Mandelbrot calculation" href="03-mandelbrot_perfomance.html" />
+    <link rel="prev" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python" href="01-get_started.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="../other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="../index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="../examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="03-mandelbrot_perfomance.html" title="Examples with performance using Mandelbrot calculation">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="01-get_started.html" title="Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="../index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      <li><a href="../jupyter_notebook.html" accesskey="U">Tutorials</a> &#187;</li>
+      
+      <li>Jupyter Notebook 2: Falling back to NumPy</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <section id="Jupyter-Notebook-2:-Falling-back-to-NumPy">
+<h1>Jupyter Notebook 2: Falling back to NumPy<a class="headerlink" href="#Jupyter-Notebook-2:-Falling-back-to-NumPy" title="Permalink to this heading">¶</a></h1>
+<p><strong>Data Parallel Extensions for Python</strong> are still in active development and have not yet reached production quality. This in particular means that some functional and performance gaps may exist in certain <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> functions that require workarounds. The functional gaps include:</p>
+<ul class="simple">
+<li><p>Certain NumPy APIs are not supported. For complete reference please see the <a class="reference external" href="https://intelpython.github.io/dpnp/reference/comparison.html">comparison table</a> for <strong>Data Parallel Extension for NumPy</strong>.</p></li>
+<li><p>Limited support of <code class="docutils literal notranslate"><span class="pre">dtypes</span></code>. At present the <strong>Data Parallel Extension for NumPy</strong> supports <code class="docutils literal notranslate"><span class="pre">float32</span></code>, <code class="docutils literal notranslate"><span class="pre">float64</span></code>, <code class="docutils literal notranslate"><span class="pre">int32</span></code>, and <code class="docutils literal notranslate"><span class="pre">int64</span></code> types.</p></li>
+<li><p>Certain keyword arguments are supported for default settings only. Please refer to the <a class="reference external" href="https://intelpython.github.io/dpnp/reference/index.html">Data Parallel Extension for NumPy API Reference</a> for details.</p></li>
+</ul>
+<p>Since NumPy API is versatily there are typically some workaround options exist. Please refer to <a class="reference external" href="https://intelpython.github.io/dpnp/reference/index.html">Data Parallel Extension for NumPy API Reference</a> and <a class="reference external" href="https://numpy.org/doc/stable/">NumPy documentation</a> for hints for possible alternatives.</p>
+<p>Another possible workaround is to fall back to the host and execute the script via NumPy. This is a discouraged use because it typically results in significant performance penalties associated with copying data from the device to the host and back. However, for debugging purposes you may still want to enable this behavior.</p>
+<p>To do so you must set the <code class="docutils literal notranslate"><span class="pre">DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK</span></code> environment variable to <code class="docutils literal notranslate"><span class="pre">0</span></code>.</p>
+<p>Let’s take the following example:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span>
+<span class="kn">import</span> <span class="nn">numpy</span>
+
+<span class="n">N</span> <span class="o">=</span> <span class="mi">200</span><span class="o">*</span><span class="mi">100</span>
+
+<span class="c1"># Create an two dimencial array with singular element and array like option</span>
+<span class="n">a_np</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">like</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)))</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a_np</span><span class="p">)</span>
+<span class="n">a_dp</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">like</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)))</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a_dp</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+[[3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ ...
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]]
+</pre></div></div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+<span class="ansi-red-intense-fg ansi-bold">---------------------------------------------------------------------------</span>
+<span class="ansi-red-intense-fg ansi-bold">NotImplementedError</span>                       Traceback (most recent call last)
+Cell <span class="ansi-green-intense-fg ansi-bold">In[3], line 9</span>
+<span class="ansi-green-fg">      7</span> a_np <span style="color: rgb(98,98,98)">=</span> numpy<span style="color: rgb(98,98,98)">.</span>full((N, N), <span style="color: rgb(98,98,98)">3.</span>, like <span style="color: rgb(98,98,98)">=</span> numpy<span style="color: rgb(98,98,98)">.</span>zeros((N, <span style="color: rgb(98,98,98)">0</span>)))
+<span class="ansi-green-fg">      8</span> <span style="color: rgb(0,135,0)">print</span>(a_np)
+<span class="ansi-green-intense-fg ansi-bold">----&gt; 9</span> a_dp <span style="color: rgb(98,98,98)">=</span> <span class="ansi-yellow-bg">dpnp</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">full</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">N</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">N</span><span class="ansi-yellow-bg">)</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">3.</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">like</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">=</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">dpnp</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">zeros</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">N</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">0</span><span class="ansi-yellow-bg">)</span><span class="ansi-yellow-bg">)</span><span class="ansi-yellow-bg">)</span>
+<span class="ansi-green-fg">     10</span> <span style="color: rgb(0,135,0)">print</span>(a_dp)
+
+File <span class="ansi-green-intense-fg ansi-bold">~\AppData\Local\Continuum\miniconda3\envs\ndpex-examples\lib\site-packages\dpnp\dpnp_iface_arraycreation.py:747</span>, in <span class="ansi-cyan-fg">full</span><span class="ansi-blue-intense-fg ansi-bold">(shape, fill_value, dtype, order, like, device, usm_type, sycl_queue)</span>
+<span class="ansi-green-fg">    738</span> <span class="ansi-bold" style="color: rgb(0,135,0)">else</span>:
+<span class="ansi-green-fg">    739</span>     <span class="ansi-bold" style="color: rgb(0,135,0)">return</span> dpnp_container<span style="color: rgb(98,98,98)">.</span>full(shape,
+<span class="ansi-green-fg">    740</span>                                fill_value,
+<span class="ansi-green-fg">    741</span>                                dtype<span style="color: rgb(98,98,98)">=</span>dtype,
+<span class="ansi-green-intense-fg ansi-bold">   (...)</span>
+<span class="ansi-green-fg">    744</span>                                usm_type<span style="color: rgb(98,98,98)">=</span>usm_type,
+<span class="ansi-green-fg">    745</span>                                sycl_queue<span style="color: rgb(98,98,98)">=</span>sycl_queue)
+<span class="ansi-green-intense-fg ansi-bold">--&gt; 747</span> <span class="ansi-bold" style="color: rgb(0,135,0)">return</span> <span class="ansi-yellow-bg">call_origin</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">numpy</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">full</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">shape</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">fill_value</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">dtype</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">order</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">like</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">=</span><span class="ansi-yellow-bg">like</span><span class="ansi-yellow-bg">)</span>
+
+File <span class="ansi-green-intense-fg ansi-bold">dpnp\dpnp_utils\dpnp_algo_utils.pyx:132</span>, in <span class="ansi-cyan-fg">dpnp.dpnp_utils.dpnp_algo_utils.call_origin</span><span class="ansi-blue-intense-fg ansi-bold">()</span>
+
+<span class="ansi-red-intense-fg ansi-bold">NotImplementedError</span>: Requested funtion=full with args=((20000, 20000), 3.0, None, &#39;C&#39;) and kwargs={&#39;like&#39;: array([])} isn&#39;t currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception.
+</pre></div></div>
+</div>
+<p>We are attempting to call <code class="docutils literal notranslate"><span class="pre">dpnp.full()</span></code> function with the keyword argument <code class="docutils literal notranslate"><span class="pre">like</span></code> set to another <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array, which is currently unsupported. A possible alternative would be to use <code class="docutils literal notranslate"><span class="pre">dpnp.full_like</span></code> function:</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">time</span>
+
+<span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
+<span class="n">a</span> <span class="o">=</span> <span class="n">dpnp</span><span class="o">.</span><span class="n">full_like</span><span class="p">(</span><span class="n">dpnp</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">))</span>
+<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Elapsed </span><span class="si">{</span><span class="p">(</span><span class="n">time</span><span class="p">()</span><span class="o">-</span><span class="n">t</span><span class="p">)</span><span class="o">*</span><span class="mi">1000</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> ms&quot;</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array a is located on the device:&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+Elapsed 1494.33 ms
+[[3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ ...
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]]
+Array a is located on the device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+<p>Now we enable <code class="docutils literal notranslate"><span class="pre">DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK</span></code> to fall back to NumPy in case of <code class="docutils literal notranslate"><span class="pre">NotImplementedError</span></code>.</p>
+<p><strong>Note: Restart Jupyter Notebook kernel before running the following code</strong></p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
+<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;0&quot;</span>
+
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="nb">print</span> <span class="p">(</span><span class="s2">&quot;DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK =&quot;</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">__DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK__</span><span class="p">)</span>  <span class="c1"># Expect 0</span>
+
+<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">time</span>
+
+<span class="n">N</span> <span class="o">=</span> <span class="mi">200</span><span class="o">*</span><span class="mi">100</span>
+
+<span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="p">()</span>
+<span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mf">3.</span><span class="p">,</span> <span class="n">like</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">N</span><span class="p">,</span> <span class="mi">0</span><span class="p">)))</span>
+<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Elapsed </span><span class="si">{</span><span class="p">(</span><span class="n">time</span><span class="p">()</span><span class="o">-</span><span class="n">t</span><span class="p">)</span><span class="o">*</span><span class="mi">1000</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> ms&quot;</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array a is located on the device:&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK = 0
+Elapsed 2231.62 ms
+[[3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ ...
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]
+ [3. 3. 3. ... 3. 3. 3.]]
+Array a is located on the device: Device(level_zero:gpu:0)
+</pre></div></div>
+</div>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../examples.html">Examples</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../jupyter_notebook.html">Tutorials</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="01-get_started.html">Getting Started</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Controlling `dpnp` fallback to `numpy`</a></li>
+<li class="toctree-l2"><a class="reference internal" href="03-mandelbrot_perfomance.html">Examples with performance using Mandelbrot calculation</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="01-get_started.html"
+                          title="previous chapter">Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="03-mandelbrot_perfomance.html"
+                          title="next chapter">Examples with performance using Mandelbrot calculation</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/notebooks/02-dpnp_numpy_fallback.ipynb b/pull/45/notebooks/02-dpnp_numpy_fallback.ipynb
new file mode 100644
index 0000000..ca03c12
--- /dev/null
+++ b/pull/45/notebooks/02-dpnp_numpy_fallback.ipynb
@@ -0,0 +1,196 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "be340585",
+   "metadata": {},
+   "source": [
+    "# Jupyter Notebook 2: Falling back to NumPy"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9008dbe5",
+   "metadata": {},
+   "source": [
+    "**Data Parallel Extensions for Python** are still in active development and have not yet reached production quality. This in particular means that some functional and performance gaps may exist in certain `dpnp` functions that require workarounds. The functional gaps include:\n",
+    "\n",
+    "* Certain NumPy APIs are not supported. For complete reference please see the [comparison table](https://intelpython.github.io/dpnp/reference/comparison.html) for **Data Parallel Extension for NumPy**.\n",
+    "* Limited support of `dtypes`. At present the **Data Parallel Extension for NumPy** supports `float32`, `float64`, `int32`, and `int64` types.\n",
+    "* Certain keyword arguments are supported for default settings only. Please refer to the [Data Parallel Extension for NumPy API Reference](https://intelpython.github.io/dpnp/reference/index.html) for details.\n",
+    "\n",
+    "Since NumPy API is versatily there are typically some workaround options exist. Please refer to [Data Parallel Extension for NumPy API Reference](https://intelpython.github.io/dpnp/reference/index.html) and [NumPy documentation](https://numpy.org/doc/stable/) for hints for possible alternatives.\n",
+    "\n",
+    "Another possible workaround is to fall back to the host and execute the script via NumPy. This is a discouraged use because it typically results in significant performance penalties associated with copying data from the device to the host and back. However, for debugging purposes you may still want to enable this behavior.\n",
+    "\n",
+    "To do so you must set the `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` environment variable to `0`.\n",
+    "\n",
+    "Let's take the following example:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "c78511cd",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n"
+     ]
+    },
+    {
+     "ename": "NotImplementedError",
+     "evalue": "Requested funtion=full with args=((20000, 20000), 3.0, None, 'C') and kwargs={'like': array([])} isn't currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception.",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mNotImplementedError\u001b[0m                       Traceback (most recent call last)",
+      "Cell \u001b[1;32mIn[3], line 9\u001b[0m\n\u001b[0;32m      7\u001b[0m a_np \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39mfull((N, N), \u001b[38;5;241m3.\u001b[39m, like \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39mzeros((N, \u001b[38;5;241m0\u001b[39m)))\n\u001b[0;32m      8\u001b[0m \u001b[38;5;28mprint\u001b[39m(a_np)\n\u001b[1;32m----> 9\u001b[0m a_dp \u001b[38;5;241m=\u001b[39m \u001b[43mdpnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfull\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mN\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mN\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m3.\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlike\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mdpnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mzeros\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mN\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     10\u001b[0m \u001b[38;5;28mprint\u001b[39m(a_dp)\n",
+      "File \u001b[1;32m~\\AppData\\Local\\Continuum\\miniconda3\\envs\\ndpex-examples\\lib\\site-packages\\dpnp\\dpnp_iface_arraycreation.py:747\u001b[0m, in \u001b[0;36mfull\u001b[1;34m(shape, fill_value, dtype, order, like, device, usm_type, sycl_queue)\u001b[0m\n\u001b[0;32m    738\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m    739\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m dpnp_container\u001b[38;5;241m.\u001b[39mfull(shape,\n\u001b[0;32m    740\u001b[0m                                fill_value,\n\u001b[0;32m    741\u001b[0m                                dtype\u001b[38;5;241m=\u001b[39mdtype,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    744\u001b[0m                                usm_type\u001b[38;5;241m=\u001b[39musm_type,\n\u001b[0;32m    745\u001b[0m                                sycl_queue\u001b[38;5;241m=\u001b[39msycl_queue)\n\u001b[1;32m--> 747\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcall_origin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnumpy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfull\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshape\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlike\u001b[49m\u001b[43m)\u001b[49m\n",
+      "File \u001b[1;32mdpnp\\dpnp_utils\\dpnp_algo_utils.pyx:132\u001b[0m, in \u001b[0;36mdpnp.dpnp_utils.dpnp_algo_utils.call_origin\u001b[1;34m()\u001b[0m\n",
+      "\u001b[1;31mNotImplementedError\u001b[0m: Requested funtion=full with args=((20000, 20000), 3.0, None, 'C') and kwargs={'like': array([])} isn't currently supported and would fall back on NumPy implementation. Define enviroment variable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to `0` if the fall back is required to be supported without rasing an exception."
+     ]
+    }
+   ],
+   "source": [
+    "import dpnp\n",
+    "import numpy\n",
+    "\n",
+    "N = 200*100\n",
+    "\n",
+    "# Create an two dimencial array with singular element and array like option\n",
+    "a_np = numpy.full((N, N), 3., like = numpy.zeros((N, 0)))\n",
+    "print(a_np)\n",
+    "a_dp = dpnp.full((N, N), 3., like = dpnp.zeros((N, 0)))\n",
+    "print(a_dp)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ae026021",
+   "metadata": {},
+   "source": [
+    "We are attempting to call `dpnp.full()` function with the keyword argument `like` set to another `dpnp` array, which is currently unsupported. A possible alternative would be to use `dpnp.full_like` function:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "5e588080-484a-44f4-a168-7d07f760c7a0",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Elapsed 1494.33 ms\n",
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n",
+      "Array a is located on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "from time import time\n",
+    "\n",
+    "t = time()\n",
+    "a = dpnp.full_like(dpnp.zeros((N, 0)), 3., shape=(N, N))\n",
+    "print(f\"Elapsed {(time()-t)*1000:.2f} ms\")\n",
+    "print(a)\n",
+    "print(\"Array a is located on the device:\", a.device)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "210440c3",
+   "metadata": {},
+   "source": [
+    "Now we enable `DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK` to fall back to NumPy in case of `NotImplementedError`."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bca7490d",
+   "metadata": {},
+   "source": [
+    "**Note: Restart Jupyter Notebook kernel before running the following code** "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "05ad1565",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK = 0\n",
+      "Elapsed 2231.62 ms\n",
+      "[[3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " ...\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]\n",
+      " [3. 3. 3. ... 3. 3. 3.]]\n",
+      "Array a is located on the device: Device(level_zero:gpu:0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "import os\n",
+    "os.environ[\"DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK\"] = \"0\" \n",
+    "\n",
+    "import dpnp as np\n",
+    "print (\"DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK =\", np.config.__DPNP_RAISE_EXCEPION_ON_NUMPY_FALLBACK__)  # Expect 0\n",
+    "\n",
+    "from time import time\n",
+    "\n",
+    "N = 200*100\n",
+    "\n",
+    "t = time()\n",
+    "a = np.full((N, N), 3., like = np.zeros((N, 0)))\n",
+    "print(f\"Elapsed {(time()-t)*1000:.2f} ms\")\n",
+    "print(a)\n",
+    "print(\"Array a is located on the device:\", a.device)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pull/45/notebooks/03-mandelbrot_perfomance.html b/pull/45/notebooks/03-mandelbrot_perfomance.html
new file mode 100644
index 0000000..cadfe04
--- /dev/null
+++ b/pull/45/notebooks/03-mandelbrot_perfomance.html
@@ -0,0 +1,920 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Examples with performance using Mandelbrot calculation &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/sdc.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/nbsphinx-code-cells.css" />
+    
+    <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
+    <script src="../_static/doctools.js"></script>
+    <script src="../_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="../_static/sidebar.js"></script>
+    <script type="text/javascript" src="../_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" />
+    <link rel="next" title="Benchmarks" href="../benchmarks.html" />
+    <link rel="prev" title="Jupyter Notebook 2: Falling back to NumPy" href="02-dpnp_numpy_fallback.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="../other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="../index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="../examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="../benchmarks.html" title="Benchmarks">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="02-dpnp_numpy_fallback.html" title="Jupyter Notebook 2: Falling back to NumPy">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="../index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      <li><a href="../jupyter_notebook.html" accesskey="U">Tutorials</a> &#187;</li>
+      
+      <li>Examples with performance using Mandelbrot calculation</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <section id="Examples-with-performance-using-Mandelbrot-calculation">
+<h1>Examples with performance using Mandelbrot calculation<a class="headerlink" href="#Examples-with-performance-using-Mandelbrot-calculation" title="Permalink to this heading">¶</a></h1>
+<p><a class="reference external" href="https://intelpython.github.io/DPEP/main/">Data Parallel Extensions for Python</a> makes calculations on the gpu faster than on the cpu. Let’s look at performance using the example of the Mandelbrot set computation. The Mandelbrot set is the set of points <code class="docutils literal notranslate"><span class="pre">c</span></code> on the complex plane for which the recurrence relation $ z_{n+1} = z_n^2+c $ at $ z_0=0 $ defines a bounded sequence. In other words, it is the set of such <code class="docutils literal notranslate"><span class="pre">c</span></code> for which there exists a real <code class="docutils literal notranslate"><span class="pre">R</span></code> such that the inequality $ |z_n|&lt;R $
+holds for all natural <code class="docutils literal notranslate"><span class="pre">n</span></code>. The definition and the name belong to the French mathematician Adrien Duadi, after the mathematician Benoit Mandelbrot.</p>
+<p><strong>Prerequisits:</strong> please be sure that Matplotlib library is installed</p>
+<section id="The-Mandelbrot-set-based-on-the-NumPy*-library">
+<h2>The Mandelbrot set based on the NumPy* library<a class="headerlink" href="#The-Mandelbrot-set-based-on-the-NumPy*-library" title="Permalink to this heading">¶</a></h2>
+<p>Let’s build the Mandelbrot set based on the NumPy* library and measure its performance. We will use these values for a baseline.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1">#calculating the Mandelbrot set on CPU using NumPy* library</span>
+
+<span class="c1">#set variables</span>
+<span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">,</span> <span class="mi">800</span>
+<span class="n">OFFSET_X</span> <span class="o">=</span> <span class="mf">1.4</span> <span class="o">*</span> <span class="n">DISPLAY_W</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">OFFSET_Y</span> <span class="o">=</span> <span class="n">DISPLAY_H</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">ZOOM</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="o">/</span> <span class="n">DISPLAY_H</span>
+<span class="n">MAX_ITER</span> <span class="o">=</span> <span class="mi">30</span>
+
+<span class="c1">#import NumPy* library</span>
+<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="c1">#import Matplotlib* library to make visualisation</span>
+<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
+<span class="o">%</span><span class="k">matplotlib</span> inline
+
+<span class="c1">#create arrays</span>
+<span class="n">c1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+<span class="n">c2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">])</span>
+<span class="n">c3</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.6</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+
+<span class="c1">#perform calculations</span>
+<span class="k">def</span> <span class="nf">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">):</span>
+    <span class="n">intensity</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">broadcast_to</span><span class="p">(</span><span class="n">intensity</span><span class="p">[:,</span> <span class="p">:,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">],</span> <span class="n">intensity</span><span class="o">.</span><span class="n">shape</span> <span class="o">+</span> <span class="p">(</span><span class="mi">3</span><span class="p">,))</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span>
+        <span class="n">intensity</span> <span class="o">&lt;</span> <span class="mf">0.5</span><span class="p">,</span>
+        <span class="n">c3</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">),</span>
+        <span class="n">c1</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">),</span>
+    <span class="p">)</span>
+
+<span class="c1">#implementation of mandelbrot set calculation</span>
+<span class="k">def</span> <span class="nf">mandelbrot</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">w</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+    <span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">h</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+    <span class="n">xx</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+    <span class="n">yy</span> <span class="o">=</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+    <span class="n">c</span> <span class="o">=</span> <span class="n">xx</span> <span class="o">+</span> <span class="mi">1</span><span class="n">j</span> <span class="o">*</span> <span class="n">yy</span><span class="p">[:,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">]</span>
+
+    <span class="n">n_iter</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>  <span class="c1"># 2d array</span>
+    <span class="n">z</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">csingle</span><span class="p">)</span>  <span class="c1"># 2d array too</span>
+    <span class="n">mask</span> <span class="o">=</span> <span class="n">n_iter</span> <span class="o">&lt;</span> <span class="n">MAX_ITER</span>  <span class="c1"># Initialize with True</span>
+    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">MAX_ITER</span><span class="p">):</span>
+        <span class="n">z</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">=</span> <span class="n">z</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">**</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">c</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span>
+        <span class="n">mask</span> <span class="o">=</span> <span class="n">mask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">2.0</span><span class="p">)</span>
+        <span class="n">n_iter</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
+
+    <span class="n">intensity</span> <span class="o">=</span> <span class="n">n_iter</span><span class="o">.</span><span class="n">T</span> <span class="o">/</span> <span class="n">MAX_ITER</span>
+    <span class="c1">#values = (color_by_intensity(intensity) * 255).astype(np.uint8)</span>
+    <span class="n">values</span> <span class="o">=</span> <span class="p">(</span><span class="n">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">)</span> <span class="o">*</span> <span class="mi">255</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">def</span> <span class="nf">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
+    <span class="c1">#return np.full((w, h, 3), 0, dtype=np.uint8)</span>
+
+<span class="k">def</span> <span class="nf">asnumpy</span><span class="p">(</span><span class="n">values</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">class</span> <span class="nc">Fractal</span><span class="p">:</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">w</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">=</span> <span class="n">h</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">=</span> <span class="n">zoom</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span>
+
+    <span class="k">def</span> <span class="nf">calculate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">mandelbrot</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">offset</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">plt</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+    <span class="n">fractal</span> <span class="o">=</span> <span class="n">Fractal</span><span class="p">(</span><span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span><span class="p">,</span> <span class="n">ZOOM</span><span class="p">,</span> <span class="p">(</span><span class="n">OFFSET_X</span><span class="p">,</span> <span class="n">OFFSET_Y</span><span class="p">))</span>
+    <span class="c1">#calculating the Mandelbrot set and measuring performance</span>
+    <span class="o">%</span><span class="k">timeit</span> fractal.calculate()
+    <span class="c1">#draw results</span>
+    <span class="n">fractal</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
+    <span class="n">main</span><span class="p">()</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+497 ms ± 35.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
+</pre></div></div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<img alt="../_images/notebooks_03-mandelbrot_perfomance_5_1.png" src="../_images/notebooks_03-mandelbrot_perfomance_5_1.png" />
+</div>
+</div>
+<p>Now we have the results of code execution on the CPU using the NumPy* library</p>
+</section>
+<section id="The-Mandelbrot-set-based-on-the-Data-Parallel-Extension-for-NumPy">
+<h2>The Mandelbrot set based on the Data Parallel Extension for NumPy<a class="headerlink" href="#The-Mandelbrot-set-based-on-the-Data-Parallel-Extension-for-NumPy" title="Permalink to this heading">¶</a></h2>
+<p>To run Python on the GPU, we have to make minor changes to our CPU script, namely: 1. Changing import statement(s) (call the Data Parallel Extension for NumPy) 2. Specifying on which device(s) the data is allocated 3. Explicitly copying data between devices and the host as needed</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1">#calculating the Mandelbrot set on GPU using dpnp library</span>
+
+<span class="c1">#set variables</span>
+<span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">,</span> <span class="mi">800</span>
+<span class="n">OFFSET_X</span> <span class="o">=</span> <span class="mf">1.4</span> <span class="o">*</span> <span class="n">DISPLAY_W</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">OFFSET_Y</span> <span class="o">=</span> <span class="n">DISPLAY_H</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">ZOOM</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="o">/</span> <span class="n">DISPLAY_H</span>
+<span class="n">MAX_ITER</span> <span class="o">=</span> <span class="mi">30</span>
+
+<span class="c1">#specify the device type</span>
+<span class="kn">import</span> <span class="nn">os</span>
+<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;SYCL_DEVICE_FILTER&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;level_zero:gpu&quot;</span>
+<span class="c1">#os.environ[&quot;SYCL_DEVICE_FILTER&quot;] = &quot;opencl:gpu&quot;</span>
+<span class="c1">#os.environ[&quot;SYCL_DEVICE_FILTER&quot;] = &quot;cpu&quot;</span>
+<span class="nb">print</span> <span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;SYCL_DEVICE_FILTER&quot;</span><span class="p">])</span>
+
+<span class="c1">#import dpnp library</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="c1">#import Matplotlib* library to make visualisation</span>
+<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
+<span class="o">%</span><span class="k">matplotlib</span> inline
+
+<span class="c1">#create arrays</span>
+<span class="n">c1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+<span class="n">c2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">])</span>
+<span class="n">c3</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.6</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+
+<span class="c1">#perform calculations</span>
+<span class="k">def</span> <span class="nf">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">):</span>
+    <span class="n">intensity</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">broadcast_to</span><span class="p">(</span><span class="n">intensity</span><span class="p">[:,</span> <span class="p">:,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">],</span> <span class="n">intensity</span><span class="o">.</span><span class="n">shape</span> <span class="o">+</span> <span class="p">(</span><span class="mi">3</span><span class="p">,))</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span>
+        <span class="n">intensity</span> <span class="o">&lt;</span> <span class="mf">0.5</span><span class="p">,</span>
+        <span class="n">c3</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">),</span>
+        <span class="n">c1</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">),</span>
+    <span class="p">)</span>
+
+<span class="c1">#implementation of mandelbrot set calculation</span>
+<span class="k">def</span> <span class="nf">mandelbrot</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">w</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+    <span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">h</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+    <span class="n">xx</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+    <span class="n">yy</span> <span class="o">=</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+    <span class="n">c</span> <span class="o">=</span> <span class="n">xx</span> <span class="o">+</span> <span class="mi">1</span><span class="n">j</span> <span class="o">*</span> <span class="n">yy</span><span class="p">[:,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">]</span>
+
+
+    <span class="n">n_iter</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>  <span class="c1"># 2d array</span>
+    <span class="n">z</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">csingle</span><span class="p">)</span>  <span class="c1"># 2d array too</span>
+
+    <span class="n">mask</span> <span class="o">=</span> <span class="n">n_iter</span> <span class="o">&lt;</span> <span class="n">MAX_ITER</span>  <span class="c1"># Initialize with True</span>
+    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">MAX_ITER</span><span class="p">):</span>
+        <span class="n">z</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">=</span> <span class="n">z</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">**</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">c</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span>
+        <span class="n">mask</span> <span class="o">=</span> <span class="n">mask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">2.0</span><span class="p">)</span>
+        <span class="n">n_iter</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
+
+    <span class="n">intensity</span> <span class="o">=</span> <span class="n">n_iter</span><span class="o">.</span><span class="n">T</span> <span class="o">/</span> <span class="n">MAX_ITER</span>
+    <span class="n">values</span> <span class="o">=</span> <span class="p">(</span><span class="n">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">)</span> <span class="o">*</span> <span class="mi">255</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">def</span> <span class="nf">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">asnumpy</span><span class="p">(</span><span class="n">values</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">class</span> <span class="nc">Fractal</span><span class="p">:</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">w</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">=</span> <span class="n">h</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">=</span> <span class="n">zoom</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span>
+
+    <span class="k">def</span> <span class="nf">calculate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">mandelbrot</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">offset</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c1">#return the NumPy* array with input data</span>
+        <span class="n">cpu_values</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+        <span class="n">plt</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">cpu_values</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+    <span class="n">fractal</span> <span class="o">=</span> <span class="n">Fractal</span><span class="p">(</span><span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span><span class="p">,</span> <span class="n">ZOOM</span><span class="p">,</span> <span class="p">(</span><span class="n">OFFSET_X</span><span class="p">,</span> <span class="n">OFFSET_Y</span><span class="p">))</span>
+    <span class="c1">#calculating the Mandelbrot set and measuring performance</span>
+    <span class="o">%</span><span class="k">timeit</span> fractal.calculate()
+    <span class="c1">#draw results</span>
+    <span class="n">fractal</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
+    <span class="n">main</span><span class="p">()</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+level_zero:gpu
+947 ms ± 19.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
+</pre></div></div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<img alt="../_images/notebooks_03-mandelbrot_perfomance_9_1.png" src="../_images/notebooks_03-mandelbrot_perfomance_9_1.png" />
+</div>
+</div>
+<p>You can compare the performance of the gpu calculations with the dpnp library using the OpenCL (Open Computing Language) driver. For both type of GPU drivers performance will be 2 times faster than on cpu.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1">#calculating the Mandelbrot set on OpenCL GPU device using dpnp library</span>
+
+<span class="c1">#set variables</span>
+<span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">,</span> <span class="mi">800</span>
+<span class="n">OFFSET_X</span> <span class="o">=</span> <span class="mf">1.4</span> <span class="o">*</span> <span class="n">DISPLAY_W</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">OFFSET_Y</span> <span class="o">=</span> <span class="n">DISPLAY_H</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">ZOOM</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="o">/</span> <span class="n">DISPLAY_H</span>
+<span class="n">MAX_ITER</span> <span class="o">=</span> <span class="mi">30</span>
+
+<span class="c1">#specify the device type</span>
+<span class="kn">import</span> <span class="nn">os</span>
+<span class="c1">#os.environ[&quot;SYCL_DEVICE_FILTER&quot;] = &quot;level_zero:gpu&quot;</span>
+<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;SYCL_DEVICE_FILTER&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;opencl:gpu&quot;</span>
+<span class="c1">#os.environ[&quot;SYCL_DEVICE_FILTER&quot;] = &quot;cpu&quot;</span>
+<span class="nb">print</span> <span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;SYCL_DEVICE_FILTER&quot;</span><span class="p">])</span>
+
+<span class="c1">#import dpnp library</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="c1">#import Matplotlib* library to make visualisation</span>
+<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
+<span class="o">%</span><span class="k">matplotlib</span> inline
+
+<span class="c1">#create arrays</span>
+<span class="n">c1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+<span class="n">c2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">])</span>
+<span class="n">c3</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.6</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+
+<span class="c1">#perform calculations</span>
+<span class="k">def</span> <span class="nf">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">):</span>
+    <span class="n">intensity</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">broadcast_to</span><span class="p">(</span><span class="n">intensity</span><span class="p">[:,</span> <span class="p">:,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">],</span> <span class="n">intensity</span><span class="o">.</span><span class="n">shape</span> <span class="o">+</span> <span class="p">(</span><span class="mi">3</span><span class="p">,))</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span>
+        <span class="n">intensity</span> <span class="o">&lt;</span> <span class="mf">0.5</span><span class="p">,</span>
+        <span class="n">c3</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">),</span>
+        <span class="n">c1</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">),</span>
+    <span class="p">)</span>
+
+<span class="c1">#implementation of mandelbrot set calculation</span>
+<span class="k">def</span> <span class="nf">mandelbrot</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">w</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+    <span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">h</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+    <span class="n">xx</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+    <span class="n">yy</span> <span class="o">=</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+    <span class="n">c</span> <span class="o">=</span> <span class="n">xx</span> <span class="o">+</span> <span class="mi">1</span><span class="n">j</span> <span class="o">*</span> <span class="n">yy</span><span class="p">[:,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">]</span>
+
+
+    <span class="n">n_iter</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>  <span class="c1"># 2d array</span>
+    <span class="n">z</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">csingle</span><span class="p">)</span>  <span class="c1"># 2d array too</span>
+
+    <span class="n">mask</span> <span class="o">=</span> <span class="n">n_iter</span> <span class="o">&lt;</span> <span class="n">MAX_ITER</span>  <span class="c1"># Initialize with True</span>
+    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">MAX_ITER</span><span class="p">):</span>
+        <span class="n">z</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">=</span> <span class="n">z</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">**</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">c</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span>
+        <span class="n">mask</span> <span class="o">=</span> <span class="n">mask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">2.0</span><span class="p">)</span>
+        <span class="n">n_iter</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
+
+    <span class="n">intensity</span> <span class="o">=</span> <span class="n">n_iter</span><span class="o">.</span><span class="n">T</span> <span class="o">/</span> <span class="n">MAX_ITER</span>
+    <span class="n">values</span> <span class="o">=</span> <span class="p">(</span><span class="n">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">)</span> <span class="o">*</span> <span class="mi">255</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">def</span> <span class="nf">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">asnumpy</span><span class="p">(</span><span class="n">values</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">class</span> <span class="nc">Fractal</span><span class="p">:</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">w</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">=</span> <span class="n">h</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">=</span> <span class="n">zoom</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span>
+
+    <span class="k">def</span> <span class="nf">calculate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">mandelbrot</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">offset</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c1">#return the NumPy* array with input data</span>
+        <span class="n">cpu_values</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+        <span class="n">plt</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">cpu_values</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+    <span class="n">fractal</span> <span class="o">=</span> <span class="n">Fractal</span><span class="p">(</span><span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span><span class="p">,</span> <span class="n">ZOOM</span><span class="p">,</span> <span class="p">(</span><span class="n">OFFSET_X</span><span class="p">,</span> <span class="n">OFFSET_Y</span><span class="p">))</span>
+    <span class="c1">#calculating the Mandelbrot set and measuring performance</span>
+    <span class="o">%</span><span class="k">timeit</span> fractal.calculate()
+    <span class="c1">#draw results</span>
+    <span class="n">fractal</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
+    <span class="n">main</span><span class="p">()</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+opencl:gpu
+967 ms ± 15.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
+</pre></div></div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<img alt="../_images/notebooks_03-mandelbrot_perfomance_11_1.png" src="../_images/notebooks_03-mandelbrot_perfomance_11_1.png" />
+</div>
+</div>
+<p>Calculations using the Data Parallel Extension for NumPy on the GPU will be faster than the same calculations using the same library on the CPU. Lets compare this.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1">#calculating the Mandelbrot set on CPU device using dpnp library</span>
+
+<span class="c1">#set variables</span>
+<span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">,</span> <span class="mi">800</span>
+<span class="n">OFFSET_X</span> <span class="o">=</span> <span class="mf">1.4</span> <span class="o">*</span> <span class="n">DISPLAY_W</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">OFFSET_Y</span> <span class="o">=</span> <span class="n">DISPLAY_H</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">ZOOM</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="o">/</span> <span class="n">DISPLAY_H</span>
+<span class="n">MAX_ITER</span> <span class="o">=</span> <span class="mi">30</span>
+
+<span class="c1">#specify the device type</span>
+<span class="kn">import</span> <span class="nn">os</span>
+<span class="c1">#os.environ[&quot;SYCL_DEVICE_FILTER&quot;] = &quot;level_zero:gpu&quot;</span>
+<span class="c1">#os.environ[&quot;SYCL_DEVICE_FILTER&quot;] = &quot;opencl:gpu&quot;</span>
+<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;SYCL_DEVICE_FILTER&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;cpu&quot;</span>
+<span class="nb">print</span> <span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;SYCL_DEVICE_FILTER&quot;</span><span class="p">])</span>
+
+<span class="c1">#import dpnp library</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="c1">#import Matplotlib* library to make visualisation</span>
+<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
+<span class="o">%</span><span class="k">matplotlib</span> inline
+
+<span class="c1">#create arrays</span>
+<span class="n">c1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+<span class="n">c2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">])</span>
+<span class="n">c3</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.6</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+
+<span class="c1">#perform calculations</span>
+<span class="k">def</span> <span class="nf">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">):</span>
+    <span class="n">intensity</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">broadcast_to</span><span class="p">(</span><span class="n">intensity</span><span class="p">[:,</span> <span class="p">:,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">],</span> <span class="n">intensity</span><span class="o">.</span><span class="n">shape</span> <span class="o">+</span> <span class="p">(</span><span class="mi">3</span><span class="p">,))</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span>
+        <span class="n">intensity</span> <span class="o">&lt;</span> <span class="mf">0.5</span><span class="p">,</span>
+        <span class="n">c3</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">),</span>
+        <span class="n">c1</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">),</span>
+    <span class="p">)</span>
+
+<span class="c1">#implementation of mandelbrot set calculation</span>
+<span class="k">def</span> <span class="nf">mandelbrot</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">w</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+    <span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">h</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
+    <span class="n">xx</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+    <span class="n">yy</span> <span class="o">=</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+    <span class="n">c</span> <span class="o">=</span> <span class="n">xx</span> <span class="o">+</span> <span class="mi">1</span><span class="n">j</span> <span class="o">*</span> <span class="n">yy</span><span class="p">[:,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">]</span>
+
+
+    <span class="n">n_iter</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>  <span class="c1"># 2d array</span>
+    <span class="n">z</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">csingle</span><span class="p">)</span>  <span class="c1"># 2d array too</span>
+
+    <span class="n">mask</span> <span class="o">=</span> <span class="n">n_iter</span> <span class="o">&lt;</span> <span class="n">MAX_ITER</span>  <span class="c1"># Initialize with True</span>
+    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">MAX_ITER</span><span class="p">):</span>
+        <span class="n">z</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">=</span> <span class="n">z</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">**</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">c</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span>
+        <span class="n">mask</span> <span class="o">=</span> <span class="n">mask</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">2.0</span><span class="p">)</span>
+        <span class="n">n_iter</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
+
+    <span class="n">intensity</span> <span class="o">=</span> <span class="n">n_iter</span><span class="o">.</span><span class="n">T</span> <span class="o">/</span> <span class="n">MAX_ITER</span>
+    <span class="n">values</span> <span class="o">=</span> <span class="p">(</span><span class="n">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">)</span> <span class="o">*</span> <span class="mi">255</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">def</span> <span class="nf">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">asnumpy</span><span class="p">(</span><span class="n">values</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">class</span> <span class="nc">Fractal</span><span class="p">:</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">w</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">=</span> <span class="n">h</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">=</span> <span class="n">zoom</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span>
+
+    <span class="k">def</span> <span class="nf">calculate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">mandelbrot</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">offset</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c1">#return the NumPy* array with input data</span>
+        <span class="n">cpu_values</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+        <span class="n">plt</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">cpu_values</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+    <span class="n">fractal</span> <span class="o">=</span> <span class="n">Fractal</span><span class="p">(</span><span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span><span class="p">,</span> <span class="n">ZOOM</span><span class="p">,</span> <span class="p">(</span><span class="n">OFFSET_X</span><span class="p">,</span> <span class="n">OFFSET_Y</span><span class="p">))</span>
+    <span class="c1">#calculating the Mandelbrot set and measuring performance</span>
+    <span class="o">%</span><span class="k">timeit</span> fractal.calculate()
+    <span class="c1">#draw results</span>
+    <span class="n">fractal</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
+    <span class="n">main</span><span class="p">()</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+cpu
+908 ms ± 9.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
+</pre></div></div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<img alt="../_images/notebooks_03-mandelbrot_perfomance_13_1.png" src="../_images/notebooks_03-mandelbrot_perfomance_13_1.png" />
+</div>
+</div>
+</section>
+<section id="The-Mandelbrot-set-on-the-Numba">
+<h2>The Mandelbrot set on the Numba<a class="headerlink" href="#The-Mandelbrot-set-on-the-Numba" title="Permalink to this heading">¶</a></h2>
+<p>If we run the Mandelbrot set on Numba, the high-performance Python compiler, we see that the computation on it is faster than on the Numpy library.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1">#calculating the Mandelbrot set on CPU device using dpnp library</span>
+
+<span class="c1">#set variables</span>
+<span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">,</span> <span class="mi">800</span>
+<span class="n">OFFSET_X</span> <span class="o">=</span> <span class="mf">1.4</span> <span class="o">*</span> <span class="n">DISPLAY_W</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">OFFSET_Y</span> <span class="o">=</span> <span class="n">DISPLAY_H</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">ZOOM</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="o">/</span> <span class="n">DISPLAY_H</span>
+<span class="n">MAX_ITER</span> <span class="o">=</span> <span class="mi">30</span>
+
+<span class="c1">#import libraries</span>
+<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">import</span> <span class="nn">numba</span> <span class="k">as</span> <span class="nn">nb</span>
+
+<span class="c1">#import Matplotlib* library to make visualisation</span>
+<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
+<span class="o">%</span><span class="k">matplotlib</span> inline
+
+<span class="n">nb</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">THREADING_LAYER</span> <span class="o">=</span> <span class="s2">&quot;omp&quot;</span>
+
+<span class="c1">#perform calculations</span>
+<span class="nd">@nb</span><span class="o">.</span><span class="n">jit</span><span class="p">(</span><span class="n">fastmath</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">nopython</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+<span class="k">def</span> <span class="nf">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">,</span> <span class="n">c1</span><span class="p">,</span> <span class="n">c2</span><span class="p">,</span> <span class="n">c3</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">intensity</span> <span class="o">&lt;</span> <span class="mf">0.5</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">c3</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">)</span>
+    <span class="k">else</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">c1</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">)</span>
+
+<span class="nd">@nb</span><span class="o">.</span><span class="n">jit</span><span class="p">(</span><span class="n">fastmath</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">nopython</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+<span class="k">def</span> <span class="nf">mandel</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
+    <span class="n">c</span> <span class="o">=</span> <span class="nb">complex</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
+    <span class="n">z</span> <span class="o">=</span> <span class="mf">0.0</span><span class="n">j</span>
+    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">MAX_ITER</span><span class="p">):</span>
+        <span class="n">z</span> <span class="o">=</span> <span class="n">z</span> <span class="o">*</span> <span class="n">z</span> <span class="o">+</span> <span class="n">c</span>
+        <span class="k">if</span> <span class="p">(</span><span class="n">z</span><span class="o">.</span><span class="n">real</span> <span class="o">*</span> <span class="n">z</span><span class="o">.</span><span class="n">real</span> <span class="o">+</span> <span class="n">z</span><span class="o">.</span><span class="n">imag</span> <span class="o">*</span> <span class="n">z</span><span class="o">.</span><span class="n">imag</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mf">4.0</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">i</span>
+    <span class="k">return</span> <span class="n">MAX_ITER</span>
+
+<span class="c1">#implementation of mandelbrot set calculation</span>
+<span class="nd">@nb</span><span class="o">.</span><span class="n">jit</span><span class="p">(</span><span class="n">fastmath</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">nopython</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">parallel</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+<span class="k">def</span> <span class="nf">mandelbrot</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
+    <span class="n">c1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+    <span class="n">c2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">])</span>
+    <span class="n">c3</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.6</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+
+    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">nb</span><span class="o">.</span><span class="n">prange</span><span class="p">(</span><span class="n">w</span><span class="p">):</span>
+        <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">h</span><span class="p">):</span>
+            <span class="n">xx</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+            <span class="n">yy</span> <span class="o">=</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+            <span class="n">intensity</span> <span class="o">=</span> <span class="n">mandel</span><span class="p">(</span><span class="n">xx</span><span class="p">,</span> <span class="n">yy</span><span class="p">)</span> <span class="o">/</span> <span class="n">MAX_ITER</span>
+            <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span>
+                <span class="n">color</span> <span class="o">=</span> <span class="n">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">,</span> <span class="n">c1</span><span class="p">[</span><span class="n">c</span><span class="p">],</span> <span class="n">c2</span><span class="p">[</span><span class="n">c</span><span class="p">],</span> <span class="n">c3</span><span class="p">[</span><span class="n">c</span><span class="p">])</span>
+                <span class="n">color</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">color</span> <span class="o">*</span> <span class="mf">255.0</span><span class="p">)</span>
+                <span class="n">values</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">c</span><span class="p">]</span> <span class="o">=</span> <span class="n">color</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">def</span> <span class="nf">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">asnumpy</span><span class="p">(</span><span class="n">values</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">class</span> <span class="nc">Fractal</span><span class="p">:</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">w</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">=</span> <span class="n">h</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">=</span> <span class="n">zoom</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span>
+
+    <span class="k">def</span> <span class="nf">calculate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">mandelbrot</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">offset</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">plt</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+    <span class="n">fractal</span> <span class="o">=</span> <span class="n">Fractal</span><span class="p">(</span><span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span><span class="p">,</span> <span class="n">ZOOM</span><span class="p">,</span> <span class="p">(</span><span class="n">OFFSET_X</span><span class="p">,</span> <span class="n">OFFSET_Y</span><span class="p">))</span>
+    <span class="c1">#calculating the Mandelbrot set and measuring performance</span>
+    <span class="o">%</span><span class="k">timeit</span> fractal.calculate()
+    <span class="c1">#draw results</span>
+    <span class="n">fractal</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
+     <span class="n">main</span><span class="p">()</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+7.23 ms ± 875 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
+</pre></div></div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<img alt="../_images/notebooks_03-mandelbrot_perfomance_16_1.png" src="../_images/notebooks_03-mandelbrot_perfomance_16_1.png" />
+</div>
+</div>
+</section>
+<section id="The-Mandelbrot-set-on-the-Data-Parallel-Extension-for-Numba">
+<h2>The Mandelbrot set on the Data Parallel Extension for Numba<a class="headerlink" href="#The-Mandelbrot-set-on-the-Data-Parallel-Extension-for-Numba" title="Permalink to this heading">¶</a></h2>
+<p>The calculation on the Data Parallel Extension for Numba go faster than on the Numba or on the Data Parallel Extension for NumPy.</p>
+<div class="nbinput docutils container">
+<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]:
+</pre></div>
+</div>
+<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1">#calculating the Mandelbrot set on CPU device using dpnp library</span>
+
+<span class="c1">#set variables</span>
+<span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">,</span> <span class="mi">800</span>
+<span class="n">OFFSET_X</span> <span class="o">=</span> <span class="mf">1.4</span> <span class="o">*</span> <span class="n">DISPLAY_W</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">OFFSET_Y</span> <span class="o">=</span> <span class="n">DISPLAY_H</span> <span class="o">//</span> <span class="mi">2</span>
+<span class="n">ZOOM</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="o">/</span> <span class="n">DISPLAY_H</span>
+<span class="n">MAX_ITER</span> <span class="o">=</span> <span class="mi">30</span>
+
+<span class="c1">#import libraries</span>
+<span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">import</span> <span class="nn">numba_dpex</span> <span class="k">as</span> <span class="nn">nb</span>
+
+<span class="c1">#import Matplotlib* library to make visualisation</span>
+<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
+<span class="o">%</span><span class="k">matplotlib</span> inline
+
+<span class="n">nb</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">THREADING_LAYER</span> <span class="o">=</span> <span class="s2">&quot;omp&quot;</span>
+
+<span class="c1">#perform calculations</span>
+<span class="nd">@nb</span><span class="o">.</span><span class="n">dpjit</span><span class="p">(</span><span class="n">fastmath</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">nopython</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+<span class="k">def</span> <span class="nf">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">,</span> <span class="n">c1</span><span class="p">,</span> <span class="n">c2</span><span class="p">,</span> <span class="n">c3</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">intensity</span> <span class="o">&lt;</span> <span class="mf">0.5</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">c3</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">)</span>
+    <span class="k">else</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">c1</span> <span class="o">*</span> <span class="n">intensity</span> <span class="o">+</span> <span class="n">c2</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">intensity</span><span class="p">)</span>
+
+<span class="nd">@nb</span><span class="o">.</span><span class="n">dpjit</span><span class="p">(</span><span class="n">fastmath</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">nopython</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+<span class="k">def</span> <span class="nf">mandel</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
+    <span class="n">c</span> <span class="o">=</span> <span class="nb">complex</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
+    <span class="n">z</span> <span class="o">=</span> <span class="mf">0.0</span><span class="n">j</span>
+    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">MAX_ITER</span><span class="p">):</span>
+        <span class="n">z</span> <span class="o">=</span> <span class="n">z</span> <span class="o">*</span> <span class="n">z</span> <span class="o">+</span> <span class="n">c</span>
+        <span class="k">if</span> <span class="p">(</span><span class="n">z</span><span class="o">.</span><span class="n">real</span> <span class="o">*</span> <span class="n">z</span><span class="o">.</span><span class="n">real</span> <span class="o">+</span> <span class="n">z</span><span class="o">.</span><span class="n">imag</span> <span class="o">*</span> <span class="n">z</span><span class="o">.</span><span class="n">imag</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mf">4.0</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">i</span>
+    <span class="k">return</span> <span class="n">MAX_ITER</span>
+
+<span class="c1">#implementation of mandelbrot set calculation</span>
+<span class="nd">@nb</span><span class="o">.</span><span class="n">dpjit</span><span class="p">(</span><span class="n">fastmath</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">nopython</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">parallel</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+<span class="k">def</span> <span class="nf">mandelbrot</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
+    <span class="n">c1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+    <span class="n">c2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">])</span>
+    <span class="n">c3</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mf">0.6</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>
+
+    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">nb</span><span class="o">.</span><span class="n">prange</span><span class="p">(</span><span class="n">w</span><span class="p">):</span>
+        <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">h</span><span class="p">):</span>
+            <span class="n">xx</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+            <span class="n">yy</span> <span class="o">=</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">offset</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">*</span> <span class="n">zoom</span>
+            <span class="n">intensity</span> <span class="o">=</span> <span class="n">mandel</span><span class="p">(</span><span class="n">xx</span><span class="p">,</span> <span class="n">yy</span><span class="p">)</span> <span class="o">/</span> <span class="n">MAX_ITER</span>
+            <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span>
+                <span class="n">color</span> <span class="o">=</span> <span class="n">color_by_intensity</span><span class="p">(</span><span class="n">intensity</span><span class="p">,</span> <span class="n">c1</span><span class="p">[</span><span class="n">c</span><span class="p">],</span> <span class="n">c2</span><span class="p">[</span><span class="n">c</span><span class="p">],</span> <span class="n">c3</span><span class="p">[</span><span class="n">c</span><span class="p">])</span>
+                <span class="n">color</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">color</span> <span class="o">*</span> <span class="mf">255.0</span><span class="p">)</span>
+                <span class="n">values</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">c</span><span class="p">]</span> <span class="o">=</span> <span class="n">color</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="k">def</span> <span class="nf">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">((</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">asnumpy</span><span class="p">(</span><span class="n">values</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">values</span>
+
+<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
+<span class="o">%</span><span class="k">matplotlib</span> inline
+
+<span class="k">class</span> <span class="nc">Fractal</span><span class="p">:</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">w</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">=</span> <span class="n">h</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">init_values</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">=</span> <span class="n">zoom</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span>
+
+    <span class="k">def</span> <span class="nf">calculate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="n">mandelbrot</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">offset</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c1">#return the NumPy* array with input data</span>
+        <span class="n">cpu_values</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
+        <span class="n">plt</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">cpu_values</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
+    <span class="n">fractal</span> <span class="o">=</span> <span class="n">Fractal</span><span class="p">(</span><span class="n">DISPLAY_W</span><span class="p">,</span> <span class="n">DISPLAY_H</span><span class="p">,</span> <span class="n">ZOOM</span><span class="p">,</span> <span class="p">(</span><span class="n">OFFSET_X</span><span class="p">,</span> <span class="n">OFFSET_Y</span><span class="p">))</span>
+    <span class="c1">#calculating the Mandelbrot set and measuring performance</span>
+    <span class="o">%</span><span class="k">timeit</span> fractal.calculate()
+    <span class="c1">#draw results</span>
+    <span class="n">fractal</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
+     <span class="n">main</span><span class="p">()</span>
+</pre></div>
+</div>
+</div>
+<div class="nboutput docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area stderr docutils container">
+<div class="highlight"><pre>
+C:\Users\mvyasank\Anaconda3\envs\my_env\lib\site-packages\numba_dpex\decorators.py:154: RuntimeWarning: nopython is set for dpjit and is ignored
+  warnings.warn(
+</pre></div></div>
+</div>
+<div class="nboutput nblast docutils container">
+<div class="prompt empty docutils container">
+</div>
+<div class="output_area docutils container">
+<div class="highlight"><pre>
+<span class="ansi-red-intense-fg ansi-bold">---------------------------------------------------------------------------</span>
+<span class="ansi-red-intense-fg ansi-bold">TypingError</span>                               Traceback (most recent call last)
+Cell <span class="ansi-green-intense-fg ansi-bold">In[4], line 89</span>
+<span class="ansi-green-fg">     86</span>     fractal<span style="color: rgb(98,98,98)">.</span>draw()
+<span class="ansi-green-fg">     88</span> <span class="ansi-bold" style="color: rgb(0,135,0)">if</span> <span style="color: rgb(0,0,135)">__name__</span> <span style="color: rgb(98,98,98)">==</span> <span style="color: rgb(175,0,0)">&#34;</span><span style="color: rgb(175,0,0)">__main__</span><span style="color: rgb(175,0,0)">&#34;</span>:
+<span class="ansi-green-intense-fg ansi-bold">---&gt; 89</span>      <span class="ansi-yellow-bg">main</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">)</span>
+
+Cell <span class="ansi-green-intense-fg ansi-bold">In[4], line 84</span>, in <span class="ansi-cyan-fg">main</span><span class="ansi-blue-intense-fg ansi-bold">()</span>
+<span class="ansi-green-fg">     82</span> fractal <span style="color: rgb(98,98,98)">=</span> Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))
+<span class="ansi-green-fg">     83</span> <span style="color: rgb(95,135,135)">#calculating the Mandelbrot set and measuring performance</span>
+<span class="ansi-green-intense-fg ansi-bold">---&gt; 84</span> <span class="ansi-yellow-bg">get_ipython</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">)</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">run_line_magic</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg" style="color: rgb(175,0,0)">&#39;</span><span class="ansi-yellow-bg" style="color: rgb(175,0,0)">timeit</span><span class="ansi-yellow-bg" style="color: rgb(175,0,0)">&#39;</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(175,0,0)">&#39;</span><span class="ansi-yellow-bg" style="color: rgb(175,0,0)">fractal.calculate()</span><span class="ansi-yellow-bg" style="color: rgb(175,0,0)">&#39;</span><span class="ansi-yellow-bg">)</span>
+<span class="ansi-green-fg">     85</span> <span style="color: rgb(95,135,135)">#draw results</span>
+<span class="ansi-green-fg">     86</span> fractal<span style="color: rgb(98,98,98)">.</span>draw()
+
+File <span class="ansi-green-intense-fg ansi-bold">~\Anaconda3\envs\my_env\lib\site-packages\IPython\core\interactiveshell.py:2414</span>, in <span class="ansi-cyan-fg">InteractiveShell.run_line_magic</span><span class="ansi-blue-intense-fg ansi-bold">(self, magic_name, line, _stack_depth)</span>
+<span class="ansi-green-fg">   2412</span>     kwargs[<span style="color: rgb(175,0,0)">&#39;</span><span style="color: rgb(175,0,0)">local_ns</span><span style="color: rgb(175,0,0)">&#39;</span>] <span style="color: rgb(98,98,98)">=</span> <span style="color: rgb(0,135,0)">self</span><span style="color: rgb(98,98,98)">.</span>get_local_scope(stack_depth)
+<span class="ansi-green-fg">   2413</span> <span class="ansi-bold" style="color: rgb(0,135,0)">with</span> <span style="color: rgb(0,135,0)">self</span><span style="color: rgb(98,98,98)">.</span>builtin_trap:
+<span class="ansi-green-intense-fg ansi-bold">-&gt; 2414</span>     result <span style="color: rgb(98,98,98)">=</span> <span class="ansi-yellow-bg">fn</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">*</span><span class="ansi-yellow-bg">args</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">*</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">*</span><span class="ansi-yellow-bg">kwargs</span><span class="ansi-yellow-bg">)</span>
+<span class="ansi-green-fg">   2416</span> <span style="color: rgb(95,135,135)"># The code below prevents the output from being displayed</span>
+<span class="ansi-green-fg">   2417</span> <span style="color: rgb(95,135,135)"># when using magics with decodator @output_can_be_silenced</span>
+<span class="ansi-green-fg">   2418</span> <span style="color: rgb(95,135,135)"># when the last Python token in the expression is a &#39;;&#39;.</span>
+<span class="ansi-green-fg">   2419</span> <span class="ansi-bold" style="color: rgb(0,135,0)">if</span> <span style="color: rgb(0,135,0)">getattr</span>(fn, magic<span style="color: rgb(98,98,98)">.</span>MAGIC_OUTPUT_CAN_BE_SILENCED, <span class="ansi-bold" style="color: rgb(0,135,0)">False</span>):
+
+File <span class="ansi-green-intense-fg ansi-bold">~\Anaconda3\envs\my_env\lib\site-packages\IPython\core\magics\execution.py:1170</span>, in <span class="ansi-cyan-fg">ExecutionMagics.timeit</span><span class="ansi-blue-intense-fg ansi-bold">(self, line, cell, local_ns)</span>
+<span class="ansi-green-fg">   1168</span> <span class="ansi-bold" style="color: rgb(0,135,0)">for</span> index <span class="ansi-bold" style="color: rgb(175,0,255)">in</span> <span style="color: rgb(0,135,0)">range</span>(<span style="color: rgb(98,98,98)">0</span>, <span style="color: rgb(98,98,98)">10</span>):
+<span class="ansi-green-fg">   1169</span>     number <span style="color: rgb(98,98,98)">=</span> <span style="color: rgb(98,98,98)">10</span> <span style="color: rgb(98,98,98)">*</span><span style="color: rgb(98,98,98)">*</span> index
+<span class="ansi-green-intense-fg ansi-bold">-&gt; 1170</span>     time_number <span style="color: rgb(98,98,98)">=</span> <span class="ansi-yellow-bg">timer</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">timeit</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">number</span><span class="ansi-yellow-bg">)</span>
+<span class="ansi-green-fg">   1171</span>     <span class="ansi-bold" style="color: rgb(0,135,0)">if</span> time_number <span style="color: rgb(98,98,98)">&gt;</span><span style="color: rgb(98,98,98)">=</span> <span style="color: rgb(98,98,98)">0.2</span>:
+<span class="ansi-green-fg">   1172</span>         <span class="ansi-bold" style="color: rgb(0,135,0)">break</span>
+
+File <span class="ansi-green-intense-fg ansi-bold">~\Anaconda3\envs\my_env\lib\site-packages\IPython\core\magics\execution.py:158</span>, in <span class="ansi-cyan-fg">Timer.timeit</span><span class="ansi-blue-intense-fg ansi-bold">(self, number)</span>
+<span class="ansi-green-fg">    156</span> gc<span style="color: rgb(98,98,98)">.</span>disable()
+<span class="ansi-green-fg">    157</span> <span class="ansi-bold" style="color: rgb(0,135,0)">try</span>:
+<span class="ansi-green-intense-fg ansi-bold">--&gt; 158</span>     timing <span style="color: rgb(98,98,98)">=</span> <span class="ansi-yellow-bg" style="color: rgb(0,135,0)">self</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">inner</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">it</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(0,135,0)">self</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">timer</span><span class="ansi-yellow-bg">)</span>
+<span class="ansi-green-fg">    159</span> <span class="ansi-bold" style="color: rgb(0,135,0)">finally</span>:
+<span class="ansi-green-fg">    160</span>     <span class="ansi-bold" style="color: rgb(0,135,0)">if</span> gcold:
+
+File <span class="ansi-green-intense-fg ansi-bold">&lt;magic-timeit&gt;:1</span>, in <span class="ansi-cyan-fg">inner</span><span class="ansi-blue-intense-fg ansi-bold">(_it, _timer)</span>
+
+Cell <span class="ansi-green-intense-fg ansi-bold">In[4], line 74</span>, in <span class="ansi-cyan-fg">Fractal.calculate</span><span class="ansi-blue-intense-fg ansi-bold">(self)</span>
+<span class="ansi-green-fg">     73</span> <span class="ansi-bold" style="color: rgb(0,135,0)">def</span> <span style="color: rgb(0,0,255)">calculate</span>(<span style="color: rgb(0,135,0)">self</span>):
+<span class="ansi-green-intense-fg ansi-bold">---&gt; 74</span>     <span style="color: rgb(0,135,0)">self</span><span style="color: rgb(98,98,98)">.</span>values <span style="color: rgb(98,98,98)">=</span> <span class="ansi-yellow-bg">mandelbrot</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg" style="color: rgb(0,135,0)">self</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">w</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(0,135,0)">self</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">h</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(0,135,0)">self</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">zoom</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(0,135,0)">self</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">offset</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(0,135,0)">self</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">.</span><span class="ansi-yellow-bg">values</span><span class="ansi-yellow-bg">)</span>
+
+File <span class="ansi-green-intense-fg ansi-bold">~\Anaconda3\envs\my_env\lib\site-packages\numba\core\dispatcher.py:468</span>, in <span class="ansi-cyan-fg">_DispatcherBase._compile_for_args</span><span class="ansi-blue-intense-fg ansi-bold">(self, *args, **kws)</span>
+<span class="ansi-green-fg">    464</span>         msg <span style="color: rgb(98,98,98)">=</span> (<span style="color: rgb(175,0,0)">f</span><span style="color: rgb(175,0,0)">&#34;</span><span class="ansi-bold" style="color: rgb(175,95,135)">{</span><span style="color: rgb(0,135,0)">str</span>(e)<span style="color: rgb(98,98,98)">.</span>rstrip()<span class="ansi-bold" style="color: rgb(175,95,135)">}</span><span style="color: rgb(175,0,0)"> </span><span class="ansi-bold" style="color: rgb(175,95,0)">\n</span><span class="ansi-bold" style="color: rgb(175,95,0)">\n</span><span style="color: rgb(175,0,0)">This error may have been caused </span><span style="color: rgb(175,0,0)">&#34;</span>
+<span class="ansi-green-fg">    465</span>                <span style="color: rgb(175,0,0)">f</span><span style="color: rgb(175,0,0)">&#34;</span><span style="color: rgb(175,0,0)">by the following argument(s):</span><span class="ansi-bold" style="color: rgb(175,95,0)">\n</span><span class="ansi-bold" style="color: rgb(175,95,135)">{</span>args_str<span class="ansi-bold" style="color: rgb(175,95,135)">}</span><span class="ansi-bold" style="color: rgb(175,95,0)">\n</span><span style="color: rgb(175,0,0)">&#34;</span>)
+<span class="ansi-green-fg">    466</span>         e<span style="color: rgb(98,98,98)">.</span>patch_message(msg)
+<span class="ansi-green-intense-fg ansi-bold">--&gt; 468</span>     <span class="ansi-yellow-bg">error_rewrite</span><span class="ansi-yellow-bg">(</span><span class="ansi-yellow-bg">e</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg" style="color: rgb(175,0,0)">&#39;</span><span class="ansi-yellow-bg" style="color: rgb(175,0,0)">typing</span><span class="ansi-yellow-bg" style="color: rgb(175,0,0)">&#39;</span><span class="ansi-yellow-bg">)</span>
+<span class="ansi-green-fg">    469</span> <span class="ansi-bold" style="color: rgb(0,135,0)">except</span> errors<span style="color: rgb(98,98,98)">.</span>UnsupportedError <span class="ansi-bold" style="color: rgb(0,135,0)">as</span> e:
+<span class="ansi-green-fg">    470</span>     <span style="color: rgb(95,135,135)"># Something unsupported is present in the user code, add help info</span>
+<span class="ansi-green-fg">    471</span>     error_rewrite(e, <span style="color: rgb(175,0,0)">&#39;</span><span style="color: rgb(175,0,0)">unsupported_error</span><span style="color: rgb(175,0,0)">&#39;</span>)
+
+File <span class="ansi-green-intense-fg ansi-bold">~\Anaconda3\envs\my_env\lib\site-packages\numba\core\dispatcher.py:409</span>, in <span class="ansi-cyan-fg">_DispatcherBase._compile_for_args.&lt;locals&gt;.error_rewrite</span><span class="ansi-blue-intense-fg ansi-bold">(e, issue_type)</span>
+<span class="ansi-green-fg">    407</span>     <span class="ansi-bold" style="color: rgb(0,135,0)">raise</span> e
+<span class="ansi-green-fg">    408</span> <span class="ansi-bold" style="color: rgb(0,135,0)">else</span>:
+<span class="ansi-green-intense-fg ansi-bold">--&gt; 409</span>     <span class="ansi-bold" style="color: rgb(0,135,0)">raise</span> e<span style="color: rgb(98,98,98)">.</span>with_traceback(<span class="ansi-bold" style="color: rgb(0,135,0)">None</span>)
+
+<span class="ansi-red-intense-fg ansi-bold">TypingError</span>: Failed in dpex_dpjit_nopython mode pipeline (step: nopython frontend)
+<span class="ansi-bold">Unknown attribute &#39;asarray&#39; of type Module(&lt;module &#39;dpnp&#39; from &#39;C:\\Users\\mvyasank\\Anaconda3\\envs\\my_env\\lib\\site-packages\\dpnp\\__init__.py&#39;&gt;)
+</span><span class="ansi-bold">
+File &#34;AppData\Local\Temp\ipykernel_29672\2269767202.py&#34;, line 41:</span>
+<span class="ansi-bold">&lt;source missing, REPL/exec in use?&gt;</span>
+
+<span class="ansi-bold">During: typing of get attribute at C:\Users\mvyasank\AppData\Local\Temp\ipykernel_29672\2269767202.py (41)</span>
+<span class="ansi-bold">
+File &#34;AppData\Local\Temp\ipykernel_29672\2269767202.py&#34;, line 41:</span>
+<span class="ansi-bold">&lt;source missing, REPL/exec in use?&gt;</span>
+
+</pre></div></div>
+</div>
+</section>
+<section id="The-conclusion">
+<h2>The conclusion<a class="headerlink" href="#The-conclusion" title="Permalink to this heading">¶</a></h2>
+<p>The Data Parallel Extension for Python libraries follow the “compute follows data” approach, with all data being created on the same device where all the computation takes place.</p>
+<p>Based on the experiment with Mandelbrot calculation we see the folliwng:</p>
+<table class="docutils align-default">
+<thead>
+<tr class="row-odd"><th class="head"><p>Results</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>The NumPy* library shows the slowest results</p></td>
+</tr>
+<tr class="row-odd"><td><p>The Data Parallel Extension for NumPy is faster than the NumPy* library</p></td>
+</tr>
+<tr class="row-even"><td><p>The Data Parallel Extension for NumPy on the GPU = the NumPy* library * 0,8</p></td>
+</tr>
+<tr class="row-odd"><td><p>The Data Parallel Extension for NumPy on the GPU = The Data Parallel Extension for NumPy on the CPU * 0,5</p></td>
+</tr>
+<tr class="row-even"><td><p>The Numba is faster than the NumPy* library</p></td>
+</tr>
+<tr class="row-odd"><td><p>The Data Parallel Extension for Numba is faster than the Numba and The Data Parallel Extension for NumPy</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../examples.html">Examples</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../jupyter_notebook.html">Tutorials</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="01-get_started.html">Getting Started</a></li>
+<li class="toctree-l2"><a class="reference internal" href="02-dpnp_numpy_fallback.html">Controlling `dpnp` fallback to `numpy`</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Examples with performance using Mandelbrot calculation</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="../benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="../search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="02-dpnp_numpy_fallback.html"
+                          title="previous chapter">Jupyter Notebook 2: Falling back to NumPy</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="../benchmarks.html"
+                          title="next chapter">Benchmarks</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/notebooks/03-mandelbrot_perfomance.ipynb b/pull/45/notebooks/03-mandelbrot_perfomance.ipynb
new file mode 100644
index 0000000..edafb84
--- /dev/null
+++ b/pull/45/notebooks/03-mandelbrot_perfomance.ipynb
@@ -0,0 +1,872 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "24d4cab0",
+   "metadata": {},
+   "source": [
+    "# Examples with performance using Mandelbrot calculation"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e62a1f43",
+   "metadata": {},
+   "source": [
+    "[Data Parallel Extensions for Python](https://intelpython.github.io/DPEP/main/) makes calculations on the gpu faster than on the cpu. \n",
+    "Let's look at performance using the example of the Mandelbrot set computation. \n",
+    "The Mandelbrot set is the set of points `c` on the complex plane for which the recurrence relation $ z_{n+1} = z_n^2+c $ at \n",
+    "$ z_0=0 $ defines a bounded sequence. In other words, it is the set of such `c` for which there exists a real `R` such that the inequality \n",
+    "$ |z_n|<R $\n",
+    "holds for all natural `n`. \n",
+    "The definition and the name belong to the French mathematician Adrien Duadi, after the mathematician Benoit Mandelbrot."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7a476f4e",
+   "metadata": {},
+   "source": [
+    "**Prerequisits:** please be sure that Matplotlib library is installed"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d8d45aaa",
+   "metadata": {},
+   "source": [
+    "### The Mandelbrot set based on the NumPy* library"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "382d368a",
+   "metadata": {},
+   "source": [
+    "Let's build the Mandelbrot set based on the NumPy* library and measure its performance. We will use these values for a baseline."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "9a26bc85",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "497 ms ± 35.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on CPU using NumPy* library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#import NumPy* library\n",
+    "import numpy as np\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "#create arrays\n",
+    "c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "#perform calculations\n",
+    "def color_by_intensity(intensity):\n",
+    "    intensity = np.broadcast_to(intensity[:, :, np.newaxis], intensity.shape + (3,))\n",
+    "    return np.where(\n",
+    "        intensity < 0.5,\n",
+    "        c3 * intensity + c2 * (1.0 - intensity),\n",
+    "        c1 * intensity + c2 * (1.0 - intensity),\n",
+    "    )\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    x = np.linspace(0, w, num=w, dtype=np.float32)\n",
+    "    y = np.linspace(0, h, num=h, dtype=np.float32)\n",
+    "    xx = (x - offset[0]) * zoom\n",
+    "    yy = (y - offset[1]) * zoom\n",
+    "    c = xx + 1j * yy[:, np.newaxis]\n",
+    "\n",
+    "    n_iter = np.full(c.shape, 0)  # 2d array\n",
+    "    z = np.zeros(c.shape, np.csingle)  # 2d array too\n",
+    "    mask = n_iter < MAX_ITER  # Initialize with True\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z[mask] = z[mask] ** 2 + c[mask]\n",
+    "        mask = mask & (np.abs(z) <= 2.0)\n",
+    "        n_iter[mask] = i\n",
+    "\n",
+    "    intensity = n_iter.T / MAX_ITER\n",
+    "    #values = (color_by_intensity(intensity) * 255).astype(np.uint8)\n",
+    "    values = (color_by_intensity(intensity) * 255).astype(np.int32)\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "    #return np.full((w, h, 3), 0, dtype=np.uint8)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        plt.imshow(self.values)\n",
+    "            \n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "    main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8dd3214d",
+   "metadata": {},
+   "source": [
+    "Now we have the results of code execution on the CPU using the NumPy* library"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4db6b1f0",
+   "metadata": {},
+   "source": [
+    "### The Mandelbrot set based on the Data Parallel Extension for NumPy"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "2f48cd68",
+   "metadata": {},
+   "source": [
+    "To run Python on the GPU, we have to make minor changes to our CPU script, namely:\n",
+    "1. Changing import statement(s) (call the Data Parallel Extension for NumPy)\n",
+    "2. Specifying on which device(s) the data is allocated\n",
+    "3. Explicitly copying data between devices and the host as needed"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "e4c3536a",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "level_zero:gpu\n",
+      "947 ms ± 19.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on GPU using dpnp library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#specify the device type\n",
+    "import os\n",
+    "os.environ[\"SYCL_DEVICE_FILTER\"] = \"level_zero:gpu\"\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"opencl:gpu\"\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"cpu\"\n",
+    "print (os.environ[\"SYCL_DEVICE_FILTER\"])\n",
+    "\n",
+    "#import dpnp library\n",
+    "import dpnp as np\n",
+    "\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "#create arrays\n",
+    "c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "#perform calculations\n",
+    "def color_by_intensity(intensity):\n",
+    "    intensity = np.broadcast_to(intensity[:, :, np.newaxis], intensity.shape + (3,))\n",
+    "    return np.where(\n",
+    "        intensity < 0.5,\n",
+    "        c3 * intensity + c2 * (1.0 - intensity),\n",
+    "        c1 * intensity + c2 * (1.0 - intensity),\n",
+    "    )\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    x = np.linspace(0, w, num=w, dtype=np.float32)\n",
+    "    y = np.linspace(0, h, num=h, dtype=np.float32)\n",
+    "    xx = (x - offset[0]) * zoom\n",
+    "    yy = (y - offset[1]) * zoom\n",
+    "    c = xx + 1j * yy[:, np.newaxis]\n",
+    "\n",
+    "    \n",
+    "    n_iter = np.full(c.shape, 0)  # 2d array\n",
+    "    z = np.zeros(c.shape, dtype=np.csingle)  # 2d array too\n",
+    "\n",
+    "    mask = n_iter < MAX_ITER  # Initialize with True\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z[mask] = z[mask] ** 2 + c[mask]\n",
+    "        mask = mask & (np.abs(z) <= 2.0)\n",
+    "        n_iter[mask] = i\n",
+    "\n",
+    "    intensity = n_iter.T / MAX_ITER\n",
+    "    values = (color_by_intensity(intensity) * 255).astype(np.int32)\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        #return the NumPy* array with input data\n",
+    "        cpu_values = np.asnumpy(self.values)\n",
+    "        plt.imshow(cpu_values)\n",
+    "            \n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "    main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a0a3b406",
+   "metadata": {},
+   "source": [
+    "You can compare the performance of the gpu calculations with the dpnp library using the OpenCL (Open Computing Language) driver. For both type of GPU drivers performance will be 2 times faster than on cpu."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "f702fa13",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "opencl:gpu\n",
+      "967 ms ± 15.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on OpenCL GPU device using dpnp library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#specify the device type\n",
+    "import os\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"level_zero:gpu\"\n",
+    "os.environ[\"SYCL_DEVICE_FILTER\"] = \"opencl:gpu\"\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"cpu\"\n",
+    "print (os.environ[\"SYCL_DEVICE_FILTER\"])\n",
+    "\n",
+    "#import dpnp library\n",
+    "import dpnp as np\n",
+    "\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "#create arrays\n",
+    "c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "#perform calculations\n",
+    "def color_by_intensity(intensity):\n",
+    "    intensity = np.broadcast_to(intensity[:, :, np.newaxis], intensity.shape + (3,))\n",
+    "    return np.where(\n",
+    "        intensity < 0.5,\n",
+    "        c3 * intensity + c2 * (1.0 - intensity),\n",
+    "        c1 * intensity + c2 * (1.0 - intensity),\n",
+    "    )\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    x = np.linspace(0, w, num=w, dtype=np.float32)\n",
+    "    y = np.linspace(0, h, num=h, dtype=np.float32)\n",
+    "    xx = (x - offset[0]) * zoom\n",
+    "    yy = (y - offset[1]) * zoom\n",
+    "    c = xx + 1j * yy[:, np.newaxis]\n",
+    "\n",
+    "    \n",
+    "    n_iter = np.full(c.shape, 0)  # 2d array\n",
+    "    z = np.zeros(c.shape, dtype=np.csingle)  # 2d array too\n",
+    "\n",
+    "    mask = n_iter < MAX_ITER  # Initialize with True\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z[mask] = z[mask] ** 2 + c[mask]\n",
+    "        mask = mask & (np.abs(z) <= 2.0)\n",
+    "        n_iter[mask] = i\n",
+    "\n",
+    "    intensity = n_iter.T / MAX_ITER\n",
+    "    values = (color_by_intensity(intensity) * 255).astype(np.int32)\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        #return the NumPy* array with input data\n",
+    "        cpu_values = np.asnumpy(self.values)\n",
+    "        plt.imshow(cpu_values)\n",
+    "            \n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "    main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ac61f656",
+   "metadata": {},
+   "source": [
+    "Calculations using the Data Parallel Extension for NumPy on the GPU will be faster than the same calculations using the same library on the CPU. Lets compare this."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "0c2a4f2d",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "cpu\n",
+      "908 ms ± 9.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on CPU device using dpnp library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#specify the device type\n",
+    "import os\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"level_zero:gpu\"\n",
+    "#os.environ[\"SYCL_DEVICE_FILTER\"] = \"opencl:gpu\"\n",
+    "os.environ[\"SYCL_DEVICE_FILTER\"] = \"cpu\"\n",
+    "print (os.environ[\"SYCL_DEVICE_FILTER\"])\n",
+    "\n",
+    "#import dpnp library\n",
+    "import dpnp as np\n",
+    "\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "#create arrays\n",
+    "c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "#perform calculations\n",
+    "def color_by_intensity(intensity):\n",
+    "    intensity = np.broadcast_to(intensity[:, :, np.newaxis], intensity.shape + (3,))\n",
+    "    return np.where(\n",
+    "        intensity < 0.5,\n",
+    "        c3 * intensity + c2 * (1.0 - intensity),\n",
+    "        c1 * intensity + c2 * (1.0 - intensity),\n",
+    "    )\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    x = np.linspace(0, w, num=w, dtype=np.float32)\n",
+    "    y = np.linspace(0, h, num=h, dtype=np.float32)\n",
+    "    xx = (x - offset[0]) * zoom\n",
+    "    yy = (y - offset[1]) * zoom\n",
+    "    c = xx + 1j * yy[:, np.newaxis]\n",
+    "\n",
+    "    \n",
+    "    n_iter = np.full(c.shape, 0)  # 2d array\n",
+    "    z = np.zeros(c.shape, dtype=np.csingle)  # 2d array too\n",
+    "\n",
+    "    mask = n_iter < MAX_ITER  # Initialize with True\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z[mask] = z[mask] ** 2 + c[mask]\n",
+    "        mask = mask & (np.abs(z) <= 2.0)\n",
+    "        n_iter[mask] = i\n",
+    "\n",
+    "    intensity = n_iter.T / MAX_ITER\n",
+    "    values = (color_by_intensity(intensity) * 255).astype(np.int32)\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        #return the NumPy* array with input data\n",
+    "        cpu_values = np.asnumpy(self.values)\n",
+    "        plt.imshow(cpu_values)\n",
+    "            \n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "    main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ba97cbfd",
+   "metadata": {},
+   "source": [
+    "### The Mandelbrot set on the Numba"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0a314c05",
+   "metadata": {},
+   "source": [
+    "If we run the Mandelbrot set on Numba, the high-performance Python compiler, we see that the computation on it is faster than on the Numpy library."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "f1e11ebc",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "7.23 ms ± 875 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on CPU device using dpnp library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#import libraries\n",
+    "import numpy as np\n",
+    "import numba as nb\n",
+    "\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "nb.config.THREADING_LAYER = \"omp\"\n",
+    "\n",
+    "#perform calculations\n",
+    "@nb.jit(fastmath=True, nopython=True)\n",
+    "def color_by_intensity(intensity, c1, c2, c3):\n",
+    "    if intensity < 0.5:\n",
+    "        return c3 * intensity + c2 * (1.0 - intensity)\n",
+    "    else:\n",
+    "        return c1 * intensity + c2 * (1.0 - intensity)\n",
+    "\n",
+    "@nb.jit(fastmath=True, nopython=True)\n",
+    "def mandel(x, y):\n",
+    "    c = complex(x, y)\n",
+    "    z = 0.0j\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z = z * z + c\n",
+    "        if (z.real * z.real + z.imag * z.imag) > 4.0:\n",
+    "            return i\n",
+    "    return MAX_ITER\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "@nb.jit(fastmath=True, nopython=True, parallel=True)\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "    c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "    c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "    for x in nb.prange(w):\n",
+    "        for y in range(h):\n",
+    "            xx = (x - offset[0]) * zoom\n",
+    "            yy = (y - offset[1]) * zoom\n",
+    "            intensity = mandel(xx, yy) / MAX_ITER\n",
+    "            for c in range(3):\n",
+    "                color = color_by_intensity(intensity, c1[c], c2[c], c3[c])\n",
+    "                color = int(color * 255.0)\n",
+    "                values[x, y, c] = color\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        plt.imshow(self.values)\n",
+    "\n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "     main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9d5d93ef",
+   "metadata": {},
+   "source": [
+    "### The Mandelbrot set on the Data Parallel Extension for Numba"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6c03c2c9",
+   "metadata": {},
+   "source": [
+    "The calculation on the Data Parallel Extension for Numba go faster than on the Numba or on the Data Parallel Extension for NumPy."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "1c45197f",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "C:\\Users\\mvyasank\\Anaconda3\\envs\\my_env\\lib\\site-packages\\numba_dpex\\decorators.py:154: RuntimeWarning: nopython is set for dpjit and is ignored\n",
+      "  warnings.warn(\n"
+     ]
+    },
+    {
+     "ename": "TypingError",
+     "evalue": "Failed in dpex_dpjit_nopython mode pipeline (step: nopython frontend)\n\u001b[1m\u001b[1mUnknown attribute 'asarray' of type Module(<module 'dpnp' from 'C:\\\\Users\\\\mvyasank\\\\Anaconda3\\\\envs\\\\my_env\\\\lib\\\\site-packages\\\\dpnp\\\\__init__.py'>)\n\u001b[1m\nFile \"AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py\", line 41:\u001b[0m\n\u001b[1m<source missing, REPL/exec in use?>\u001b[0m\n\u001b[0m\n\u001b[0m\u001b[1mDuring: typing of get attribute at C:\\Users\\mvyasank\\AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py (41)\u001b[0m\n\u001b[1m\nFile \"AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py\", line 41:\u001b[0m\n\u001b[1m<source missing, REPL/exec in use?>\u001b[0m\n",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mTypingError\u001b[0m                               Traceback (most recent call last)",
+      "Cell \u001b[1;32mIn[4], line 89\u001b[0m\n\u001b[0;32m     86\u001b[0m     fractal\u001b[38;5;241m.\u001b[39mdraw()\n\u001b[0;32m     88\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;18m__name__\u001b[39m \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__main__\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m---> 89\u001b[0m      \u001b[43mmain\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
+      "Cell \u001b[1;32mIn[4], line 84\u001b[0m, in \u001b[0;36mmain\u001b[1;34m()\u001b[0m\n\u001b[0;32m     82\u001b[0m fractal \u001b[38;5;241m=\u001b[39m Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n\u001b[0;32m     83\u001b[0m \u001b[38;5;66;03m#calculating the Mandelbrot set and measuring performance\u001b[39;00m\n\u001b[1;32m---> 84\u001b[0m \u001b[43mget_ipython\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_line_magic\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtimeit\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mfractal.calculate()\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m     85\u001b[0m \u001b[38;5;66;03m#draw results\u001b[39;00m\n\u001b[0;32m     86\u001b[0m fractal\u001b[38;5;241m.\u001b[39mdraw()\n",
+      "File \u001b[1;32m~\\Anaconda3\\envs\\my_env\\lib\\site-packages\\IPython\\core\\interactiveshell.py:2414\u001b[0m, in \u001b[0;36mInteractiveShell.run_line_magic\u001b[1;34m(self, magic_name, line, _stack_depth)\u001b[0m\n\u001b[0;32m   2412\u001b[0m     kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlocal_ns\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_local_scope(stack_depth)\n\u001b[0;32m   2413\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuiltin_trap:\n\u001b[1;32m-> 2414\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m   2416\u001b[0m \u001b[38;5;66;03m# The code below prevents the output from being displayed\u001b[39;00m\n\u001b[0;32m   2417\u001b[0m \u001b[38;5;66;03m# when using magics with decodator @output_can_be_silenced\u001b[39;00m\n\u001b[0;32m   2418\u001b[0m \u001b[38;5;66;03m# when the last Python token in the expression is a ';'.\u001b[39;00m\n\u001b[0;32m   2419\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(fn, magic\u001b[38;5;241m.\u001b[39mMAGIC_OUTPUT_CAN_BE_SILENCED, \u001b[38;5;28;01mFalse\u001b[39;00m):\n",
+      "File \u001b[1;32m~\\Anaconda3\\envs\\my_env\\lib\\site-packages\\IPython\\core\\magics\\execution.py:1170\u001b[0m, in \u001b[0;36mExecutionMagics.timeit\u001b[1;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[0;32m   1168\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m index \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m10\u001b[39m):\n\u001b[0;32m   1169\u001b[0m     number \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m10\u001b[39m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m index\n\u001b[1;32m-> 1170\u001b[0m     time_number \u001b[38;5;241m=\u001b[39m \u001b[43mtimer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimeit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnumber\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m   1171\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m time_number \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.2\u001b[39m:\n\u001b[0;32m   1172\u001b[0m         \u001b[38;5;28;01mbreak\u001b[39;00m\n",
+      "File \u001b[1;32m~\\Anaconda3\\envs\\my_env\\lib\\site-packages\\IPython\\core\\magics\\execution.py:158\u001b[0m, in \u001b[0;36mTimer.timeit\u001b[1;34m(self, number)\u001b[0m\n\u001b[0;32m    156\u001b[0m gc\u001b[38;5;241m.\u001b[39mdisable()\n\u001b[0;32m    157\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 158\u001b[0m     timing \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minner\u001b[49m\u001b[43m(\u001b[49m\u001b[43mit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    159\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m    160\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m gcold:\n",
+      "File \u001b[1;32m<magic-timeit>:1\u001b[0m, in \u001b[0;36minner\u001b[1;34m(_it, _timer)\u001b[0m\n",
+      "Cell \u001b[1;32mIn[4], line 74\u001b[0m, in \u001b[0;36mFractal.calculate\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m     73\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcalculate\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m---> 74\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvalues \u001b[38;5;241m=\u001b[39m \u001b[43mmandelbrot\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mw\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mh\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mzoom\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moffset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalues\u001b[49m\u001b[43m)\u001b[49m\n",
+      "File \u001b[1;32m~\\Anaconda3\\envs\\my_env\\lib\\site-packages\\numba\\core\\dispatcher.py:468\u001b[0m, in \u001b[0;36m_DispatcherBase._compile_for_args\u001b[1;34m(self, *args, **kws)\u001b[0m\n\u001b[0;32m    464\u001b[0m         msg \u001b[38;5;241m=\u001b[39m (\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mstr\u001b[39m(e)\u001b[38;5;241m.\u001b[39mrstrip()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mThis error may have been caused \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m    465\u001b[0m                \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mby the following argument(s):\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00margs_str\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m    466\u001b[0m         e\u001b[38;5;241m.\u001b[39mpatch_message(msg)\n\u001b[1;32m--> 468\u001b[0m     \u001b[43merror_rewrite\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtyping\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m    469\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m errors\u001b[38;5;241m.\u001b[39mUnsupportedError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m    470\u001b[0m     \u001b[38;5;66;03m# Something unsupported is present in the user code, add help info\u001b[39;00m\n\u001b[0;32m    471\u001b[0m     error_rewrite(e, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124munsupported_error\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
+      "File \u001b[1;32m~\\Anaconda3\\envs\\my_env\\lib\\site-packages\\numba\\core\\dispatcher.py:409\u001b[0m, in \u001b[0;36m_DispatcherBase._compile_for_args.<locals>.error_rewrite\u001b[1;34m(e, issue_type)\u001b[0m\n\u001b[0;32m    407\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[0;32m    408\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 409\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(\u001b[38;5;28;01mNone\u001b[39;00m)\n",
+      "\u001b[1;31mTypingError\u001b[0m: Failed in dpex_dpjit_nopython mode pipeline (step: nopython frontend)\n\u001b[1m\u001b[1mUnknown attribute 'asarray' of type Module(<module 'dpnp' from 'C:\\\\Users\\\\mvyasank\\\\Anaconda3\\\\envs\\\\my_env\\\\lib\\\\site-packages\\\\dpnp\\\\__init__.py'>)\n\u001b[1m\nFile \"AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py\", line 41:\u001b[0m\n\u001b[1m<source missing, REPL/exec in use?>\u001b[0m\n\u001b[0m\n\u001b[0m\u001b[1mDuring: typing of get attribute at C:\\Users\\mvyasank\\AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py (41)\u001b[0m\n\u001b[1m\nFile \"AppData\\Local\\Temp\\ipykernel_29672\\2269767202.py\", line 41:\u001b[0m\n\u001b[1m<source missing, REPL/exec in use?>\u001b[0m\n"
+     ]
+    }
+   ],
+   "source": [
+    "#calculating the Mandelbrot set on CPU device using dpnp library\n",
+    "\n",
+    "#set variables\n",
+    "DISPLAY_W, DISPLAY_H = 1024, 800\n",
+    "OFFSET_X = 1.4 * DISPLAY_W // 2\n",
+    "OFFSET_Y = DISPLAY_H // 2\n",
+    "ZOOM = 2.5 / DISPLAY_H\n",
+    "MAX_ITER = 30\n",
+    "\n",
+    "#import libraries\n",
+    "import dpnp as np\n",
+    "import numba_dpex as nb\n",
+    "\n",
+    "#import Matplotlib* library to make visualisation\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "nb.config.THREADING_LAYER = \"omp\"\n",
+    "\n",
+    "#perform calculations\n",
+    "@nb.dpjit(fastmath=True, nopython=True)\n",
+    "def color_by_intensity(intensity, c1, c2, c3):\n",
+    "    if intensity < 0.5:\n",
+    "        return c3 * intensity + c2 * (1.0 - intensity)\n",
+    "    else:\n",
+    "        return c1 * intensity + c2 * (1.0 - intensity)\n",
+    "\n",
+    "@nb.dpjit(fastmath=True, nopython=True)\n",
+    "def mandel(x, y):\n",
+    "    c = complex(x, y)\n",
+    "    z = 0.0j\n",
+    "    for i in range(MAX_ITER):\n",
+    "        z = z * z + c\n",
+    "        if (z.real * z.real + z.imag * z.imag) > 4.0:\n",
+    "            return i\n",
+    "    return MAX_ITER\n",
+    "\n",
+    "#implementation of mandelbrot set calculation\n",
+    "@nb.dpjit(fastmath=True, nopython=True, parallel=True)\n",
+    "def mandelbrot(w, h, zoom, offset, values):\n",
+    "    c1 = np.asarray([0.0, 0.0, 0.2])\n",
+    "    c2 = np.asarray([1.0, 0.7, 0.9])\n",
+    "    c3 = np.asarray([0.6, 1.0, 0.2])\n",
+    "\n",
+    "    for x in nb.prange(w):\n",
+    "        for y in range(h):\n",
+    "            xx = (x - offset[0]) * zoom\n",
+    "            yy = (y - offset[1]) * zoom\n",
+    "            intensity = mandel(xx, yy) / MAX_ITER\n",
+    "            for c in range(3):\n",
+    "                color = color_by_intensity(intensity, c1[c], c2[c], c3[c])\n",
+    "                color = int(color * 255.0)\n",
+    "                values[x, y, c] = color\n",
+    "    return values\n",
+    "\n",
+    "def init_values(w, h):\n",
+    "    return np.full((w, h, 3), 0, dtype=np.int32)\n",
+    "\n",
+    "def asnumpy(values):\n",
+    "    return values\n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline \n",
+    "\n",
+    "class Fractal:\n",
+    "    def __init__(self, w, h, zoom, offset):\n",
+    "        self.w = w\n",
+    "        self.h = h\n",
+    "        self.values = init_values(w, h)\n",
+    "        self.zoom = zoom\n",
+    "        self.offset = offset\n",
+    "\n",
+    "    def calculate(self):\n",
+    "        self.values = mandelbrot(self.w, self.h, self.zoom, self.offset, self.values)\n",
+    "\n",
+    "    def draw(self):\n",
+    "        #return the NumPy* array with input data\n",
+    "        cpu_values = np.asnumpy(self.values)\n",
+    "        plt.imshow(cpu_values)\n",
+    "         \n",
+    "def main():\n",
+    "    fractal = Fractal(DISPLAY_W, DISPLAY_H, ZOOM, (OFFSET_X, OFFSET_Y))\n",
+    "    #calculating the Mandelbrot set and measuring performance\n",
+    "    %timeit fractal.calculate()\n",
+    "    #draw results\n",
+    "    fractal.draw()\n",
+    "\n",
+    "if __name__ == \"__main__\":\n",
+    "     main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e9c275ff",
+   "metadata": {},
+   "source": [
+    "### The conclusion"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e5fe4a54",
+   "metadata": {},
+   "source": [
+    "The Data Parallel Extension for Python libraries follow the \"compute follows data\" approach, with all data being created on the same device where all the computation takes place.\n",
+    "\n",
+    "Based on the experiment with Mandelbrot calculation we see the folliwng:\n",
+    "\n",
+    "| Results        |\n",
+    "| :------------- |\n",
+    "| The NumPy* library shows the slowest results |\n",
+    "| The Data Parallel Extension for NumPy is faster than the NumPy* library |\n",
+    "| The Data Parallel Extension for NumPy on the GPU = the NumPy* library * 0,8 |\n",
+    "| The Data Parallel Extension for NumPy on the GPU = The Data Parallel Extension for NumPy on the CPU * 0,5 |\n",
+    "| The Numba is faster than the NumPy* library |\n",
+    "| The Data Parallel Extension for Numba is faster than the Numba and The Data Parallel Extension for NumPy |\n",
+    "\n"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.8.16"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/pull/45/objects.inv b/pull/45/objects.inv
new file mode 100644
index 0000000..db84128
Binary files /dev/null and b/pull/45/objects.inv differ
diff --git a/pull/45/parallelism.html b/pull/45/parallelism.html
new file mode 100644
index 0000000..7014774
--- /dev/null
+++ b/pull/45/parallelism.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Parallelism in Modern Data-Parallel Architectures &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Heterogeneous Computing" href="heterogeneous_computing.html" />
+    <link rel="prev" title="Prerequisites and Installation" href="prerequisites_and_installation.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="heterogeneous_computing.html" title="Heterogeneous Computing">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="prerequisites_and_installation.html" title="Prerequisites and Installation">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Parallelism in Modern Data-Parallel Architectures</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="parallelism"></span><section id="parallelism-in-modern-data-parallel-architectures">
+<h1>Parallelism in Modern Data-Parallel Architectures<a class="headerlink" href="#parallelism-in-modern-data-parallel-architectures" title="Permalink to this heading">¶</a></h1>
+<p>Python is loved for its productivity and interactivity. But when it comes to dealing with
+computationally heavy codes, Python performance cannot be compromised. Intel and Python numerical
+computing communities, such as <a class="reference external" href="https://numfocus.org/">NumFOCUS</a>, dedicate attention to
+optimizing core numerical and data science packages for leveraging parallelism available in modern CPUs:</p>
+<ul class="simple">
+<li><p><strong>Multiple computational cores:</strong> Several computational cores allow to process the data concurrently.
+Compared to a single-core CPU, <em>N</em> cores can process either <em>N</em> times bigger data in a fixed time, or
+reduce a computation time <em>N</em> times for a set amount of data.</p></li>
+</ul>
+<a class="reference internal image-reference" href="_images/dpep-cores.png"><img alt="Multiple CPU Cores" class="align-center" src="_images/dpep-cores.png" style="width: 600px;" /></a>
+<ul>
+<li><p><strong>SIMD parallelism:</strong> SIMD (Single Instruction Multiple Data) is a special type of instructions
+that perform operations on vectors of data elements at the same time. The size of vectors is called the SIMD width.
+If a SIMD width is <em>K</em> then a SIMD instruction can process <em>K</em> data elements in parallel.</p>
+<p>In the following diagram, the SIMD width is 2, which means that a single instruction processes two elements simultaneously.
+Compared to regular instructions that process one element at a time, 2-wide SIMD instruction performs
+two times more data in fixed time, or, respectively, process a fixed amount of data two times faster.</p>
+</li>
+</ul>
+<a class="reference internal image-reference" href="_images/dpep-simd.png"><img alt="SIMD" class="align-center" src="_images/dpep-simd.png" style="width: 150px;" /></a>
+<ul class="simple">
+<li><p><strong>Instruction-Level Parallelism:</strong> Modern CISC architectures, such as x86, allow performing data independent
+instructions in parallel. In the following example, see how to compute <span class="math notranslate nohighlight">\(a * b + (c - d)\)</span>.
+Operations <span class="math notranslate nohighlight">\(*\)</span> and <span class="math notranslate nohighlight">\(-\)</span> can be executed in parallel, the last instruction
+<span class="math notranslate nohighlight">\(+\)</span> depends on availability of <span class="math notranslate nohighlight">\(a * b\)</span> and <span class="math notranslate nohighlight">\(c - d\)</span> and cannot be executed in parallel
+with <span class="math notranslate nohighlight">\(*\)</span> and <span class="math notranslate nohighlight">\(-\)</span>.</p></li>
+</ul>
+<a class="reference internal image-reference" href="_images/dpep-ilp.png"><img alt="SIMD" class="align-center" src="_images/dpep-ilp.png" style="width: 150px;" /></a>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="prerequisites_and_installation.html"
+                          title="previous chapter">Prerequisites and Installation</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="heterogeneous_computing.html"
+                          title="next chapter">Heterogeneous Computing</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/prerequisites_and_installation.html b/pull/45/prerequisites_and_installation.html
new file mode 100644
index 0000000..c1add62
--- /dev/null
+++ b/pull/45/prerequisites_and_installation.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Prerequisites and Installation &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Parallelism in Modern Data-Parallel Architectures" href="parallelism.html" />
+    <link rel="prev" title="Data Parallel Extensions for Python" href="index.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="parallelism.html" title="Parallelism in Modern Data-Parallel Architectures">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="index.html" title="Data Parallel Extensions for Python">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Prerequisites and Installation</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="prerequisites-and-installation"></span><section id="id1">
+<h1>Prerequisites and Installation<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<section id="device-drivers">
+<h2>1. Device Drivers<a class="headerlink" href="#device-drivers" title="Permalink to this heading">¶</a></h2>
+<p>To start programming data parallel devices beyond CPU, you will need an appropriate hardware.
+For example, Data Parallel Extensions for Python work fine on Intel © laptops with integrated graphics.
+In majority of cases, your Windows*-based laptop already has all necessary device drivers installed. But if you want the most
+up-to-date driver, you can always
+<a class="reference external" href="https://www.intel.com/content/www/us/en/download-center/home.html">update it to the latest one</a>.
+Follow device driver installation instructions
+to complete this step.</p>
+<p>All other necessary components for programming data parallel devices will be installed with
+Data Parallel Extensions for Python.</p>
+</section>
+<section id="python-interpreter">
+<h2>2. Python Interpreter<a class="headerlink" href="#python-interpreter" title="Permalink to this heading">¶</a></h2>
+<p>You will need Python 3.8, 3.9, or 3.10 installed on your system. If you do not have one yet the easiest way to do
+that is to install <a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/distribution-for-python.html">Intel Distribution for Python*</a>.
+It installs all essential Python numerical and machine
+learning packages optimized for the Intel hardware, including Data Parallel Extensions for Python*.
+If you have Python installation from another vendor, it is fine too. All you need is to install Data Parallel
+Extensions for Python manually as shown in the next section.</p>
+</section>
+<section id="data-parallel-extensions-for-python">
+<h2>3. Data Parallel Extensions for Python<a class="headerlink" href="#data-parallel-extensions-for-python" title="Permalink to this heading">¶</a></h2>
+<p>Skip this step if you already installed Intel © Distribution for Python.</p>
+<p>The easiest way to install Data Parallel Extensions for Python is to install numba-dpex:</p>
+<ul class="simple">
+<li><p>Conda: <code class="docutils literal notranslate"><span class="pre">conda</span> <span class="pre">install</span> <span class="pre">numba-dpex</span></code></p></li>
+<li><p>Pip: <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">numba-dpex</span></code></p></li>
+</ul>
+<p>These commands install <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> along with its dependencies, including <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>, <code class="docutils literal notranslate"><span class="pre">dpctl</span></code>,
+and required compiler runtimes.</p>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>Before installing with conda or pip it is strongly advised to update <code class="docutils literal notranslate"><span class="pre">conda</span></code> and <code class="docutils literal notranslate"><span class="pre">pip</span></code> to latest versions</p>
+</div>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="index.html"
+                          title="previous chapter">Data Parallel Extensions for Python</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="parallelism.html"
+                          title="next chapter">Parallelism in Modern Data-Parallel Architectures</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/programming_dpep.html b/pull/45/programming_dpep.html
new file mode 100644
index 0000000..53a78e9
--- /dev/null
+++ b/pull/45/programming_dpep.html
@@ -0,0 +1,441 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Programming with Data Parallel Extensions for Python &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script>window.MathJax = {"tex": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true}, "options": {"ignoreHtmlClass": "tex2jax_ignore|mathjax_ignore|document", "processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="Examples" href="examples.html" />
+    <link rel="prev" title="Heterogeneous Computing" href="heterogeneous_computing.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="examples.html" title="Examples">
+	  next &raquo;
+	</a>
+      </li>
+      <li class="right">
+	<a href="heterogeneous_computing.html" title="Heterogeneous Computing">
+	  &laquo; previous
+	</a>
+	 |
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Programming with Data Parallel Extensions for Python</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="programming-dpep"></span><section id="programming-with-data-parallel-extensions-for-python">
+<h1>Programming with Data Parallel Extensions for Python<a class="headerlink" href="#programming-with-data-parallel-extensions-for-python" title="Permalink to this heading">¶</a></h1>
+<a class="reference internal image-reference" href="_images/dpep-all.png"><img alt="Data Parallel Extensions for Python" class="align-center" src="_images/dpep-all.png" style="width: 600px;" /></a>
+<p><strong>Data Parallel Extensions for Python</strong> consist of three foundational packages:</p>
+<ul class="simple">
+<li><p>The <a class="reference external" href="https://numpy.org/">Numpy*</a>-like library, <code class="docutils literal notranslate"><span class="pre">dpnp</span></code>;</p></li>
+<li><p>The compiler extension for <a class="reference external" href="https://numba.pydata.org/">Numba*</a>, <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code></p></li>
+<li><p>The library for managing devices, queues, and heterogeneous data, <code class="docutils literal notranslate"><span class="pre">dpctl</span></code>.</p></li>
+</ul>
+<p>Their underlying implementation is based on <a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> standard, which is a cross-platform abstraction layer
+for heterogeneous computing on data parallel devices, such as CPU, GPU, or domain-specific accelerators.</p>
+<section id="scalars-vs-0-dimensional-arrays">
+<h2>Scalars vs. 0-Dimensional Arrays<a class="headerlink" href="#scalars-vs-0-dimensional-arrays" title="Permalink to this heading">¶</a></h2>
+<p>Primitive types, such as Python’s and Numpy’s <code class="docutils literal notranslate"><span class="pre">float</span></code>, <code class="docutils literal notranslate"><span class="pre">int</span></code>, or <code class="docutils literal notranslate"><span class="pre">complex</span></code>, used to represent scalars,
+have the host storage. In contrast, <code class="docutils literal notranslate"><span class="pre">dpctl.tensor.usm_ndarray</span></code> and <code class="docutils literal notranslate"><span class="pre">dpnp.ndarray</span></code> have the USM storage
+and carry associated allocation queue. For the <a class="reference internal" href="heterogeneous_computing.html#compute-follows-data"><span class="std std-ref">Compute-Follows-Data</span></a> consistent behavior
+all <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> operations that produce scalars will instead produce respective 0-dimensional arrays.</p>
+<p>That implies, that some code changes may be needed to replace scalar math operations with respective
+<code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array operations. See <a class="reference external" href="https://intelpython.github.io/dpnp/">Data Parallel Extension for Numpy*</a> - <strong>API Reference</strong> section for details.</p>
+</section>
+<section id="data-parallel-extension-for-numpy-dpnp">
+<h2>Data Parallel Extension for Numpy - dpnp<a class="headerlink" href="#data-parallel-extension-for-numpy-dpnp" title="Permalink to this heading">¶</a></h2>
+<p>The <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> library is a bare minimum to start programming numerical codes for data-parallel devices.
+If you already have a Python script written in <a class="reference external" href="https://numpy.org/">Numpy*</a>, then running it on a GPU will typically require
+changing just a few lines of the code:</p>
+<div class="literal-block-wrapper docutils container" id="ex-01-hello-dpnp">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 01:</strong> Your first NumPy code running on GPU</span><a class="headerlink" href="#ex-01-hello-dpnp" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<p>In this example, <code class="docutils literal notranslate"><span class="pre">np.asarray()</span></code> creates an array on the default <a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> device, which is a <code class="docutils literal notranslate"><span class="pre">&quot;gpu&quot;</span></code> on systems
+with integrated or discrete GPU (it is the <code class="docutils literal notranslate"><span class="pre">&quot;host&quot;</span></code> on systems that do not have GPU).
+The queue associated with this array is now carried with <code class="docutils literal notranslate"><span class="pre">x</span></code>, and <code class="docutils literal notranslate"><span class="pre">np.sum(x)</span></code> derives it from <code class="docutils literal notranslate"><span class="pre">x</span></code>,
+and respective pre-compiled kernel implementing <code class="docutils literal notranslate"><span class="pre">np.sum()</span></code> is submitted to that queue.
+The result <code class="docutils literal notranslate"><span class="pre">y</span></code> is allocated on the device 0-dimensional array associated with that queue too.</p>
+<p>All <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> array creation routines and random number generators have additional optional keyword arguments:
+<code class="docutils literal notranslate"><span class="pre">device</span></code>, <code class="docutils literal notranslate"><span class="pre">queue</span></code>, and <code class="docutils literal notranslate"><span class="pre">usm_type</span></code>, using which you can explicitly specify on which device or queue you want
+the tensor data to be created along with the USM memory type to be used (<code class="docutils literal notranslate"><span class="pre">&quot;host&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;device&quot;</span></code>, or <code class="docutils literal notranslate"><span class="pre">&quot;shared&quot;</span></code>).
+In the following example, the array <code class="docutils literal notranslate"><span class="pre">x</span></code> is created on the GPU device, and reduction sum is done on it:</p>
+<div class="literal-block-wrapper docutils container" id="ex-02-dpnp-device">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 02:</strong> Select device type while creating array</span><a class="headerlink" href="#ex-02-dpnp-device" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+</section>
+<section id="data-parallel-extension-for-numba-numba-dpex">
+<h2>Data Parallel Extension for Numba - numba-dpex<a class="headerlink" href="#data-parallel-extension-for-numba-numba-dpex" title="Permalink to this heading">¶</a></h2>
+<p><a class="reference external" href="https://numba.pydata.org/">Numba*</a> is a powerful Just-In-Time (JIT) compiler that works best on <a class="reference external" href="https://numpy.org/">Numpy*</a> arrays, <a class="reference external" href="https://numpy.org/">Numpy*</a> functions, and loops.
+Data-parallel loops is where the data parallelism resides. It allows leveraging all available CPU cores,
+SIMD instructions, and schedules those in a way that exploits maximum instruction-level parallelism.
+The <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> extension allows to compile and offload data-parallel regions to any data parallel device.
+It takes just a few lines to modify your CPU <a class="reference external" href="https://numba.pydata.org/">Numba*</a> script to run on GPU:</p>
+<div class="literal-block-wrapper docutils container" id="ex-03-dpnp2numba-dpex">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 03:</strong> Compile dpnp code with numba-dpex</span><a class="headerlink" href="#ex-03-dpnp2numba-dpex" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpnp</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">from</span> <span class="nn">numba_dpex</span> <span class="kn">import</span> <span class="n">dpjit</span> <span class="k">as</span> <span class="n">njit</span>
+
+
+<span class="nd">@njit</span><span class="p">()</span>
+<span class="k">def</span> <span class="nf">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>  <span class="c1"># Device queue is inferred from x. The kernel is submitted to that queue</span>
+    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+
+<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
+    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;GPU device is not available&quot;</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Array x allocated on the device:&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>
+
+<span class="n">y</span> <span class="o">=</span> <span class="n">sum_it</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Result y is located on the device:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">device</span><span class="p">)</span>  <span class="c1"># The same device as x</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Shape of y is:&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>  <span class="c1"># 0-dimensional array</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;y=&quot;</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>  <span class="c1"># Expect 6</span>
+</pre></div>
+</div>
+</div>
+<p>In this example, you can see a custom function <code class="docutils literal notranslate"><span class="pre">sum_it()</span></code> that takes an array input. By compiling it with
+<a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a>, the queue information is derived from input argument <code class="docutils literal notranslate"><span class="pre">x</span></code>,
+which is associated with the default device (<code class="docutils literal notranslate"><span class="pre">&quot;gpu&quot;</span></code> on systems with integrated or discrete GPU) and
+dynamically compiles the kernel submitted to that queue. The result resides as a 0-dimensional array on the device
+associated with the queue, and on exit from the offload kernel it will be assigned to the tensor <code class="docutils literal notranslate"><span class="pre">y</span></code>.</p>
+</section>
+<section id="data-parallel-control-dpctl">
+<h2>Data Parallel Control - dpctl<a class="headerlink" href="#data-parallel-control-dpctl" title="Permalink to this heading">¶</a></h2>
+<p>Both <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> and <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> provide enough API versatility for programming data parallel devices but
+there are some situations when you need to use <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> advanced capabilities:</p>
+<ol class="arabic">
+<li><p><strong>Advanced device management.</strong> Both <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> and <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code> support Numpy array creation routines
+with additional parameters that specify the device on which the data is allocated and the type of memory to be used
+(<code class="docutils literal notranslate"><span class="pre">&quot;device&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;host&quot;</span></code>, or <code class="docutils literal notranslate"><span class="pre">&quot;shared&quot;</span></code>). However, if you need some more advanced device and data management
+capabilities, you need to import <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> in addition to <code class="docutils literal notranslate"><span class="pre">dpnp</span></code> and/or <code class="docutils literal notranslate"><span class="pre">numba-dpex</span></code>.</p>
+<p>One of frequent usages of <code class="docutils literal notranslate"><span class="pre">dpctl</span></code> is to query the list devices present on the system, available driver backend
+(such as <code class="docutils literal notranslate"><span class="pre">&quot;opencl&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;level_zero&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;cuda&quot;</span></code>, etc.)</p>
+<p>Another frequent usage is the creation of additional queues for the purpose of profiling or choosing an out-of-order
+execution of offload kernels.</p>
+</li>
+</ol>
+<div class="literal-block-wrapper docutils container" id="ex-04-dpctl-device-query">
+<div class="code-block-caption"><span class="caption-text"><strong>EXAMPLE 04:</strong> Get information about devices</span><a class="headerlink" href="#ex-04-dpctl-device-query" title="Permalink to this code">¶</a></div>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">dpctl</span>
+
+<span class="n">dpctl</span><span class="o">.</span><span class="n">lsplatform</span><span class="p">()</span>  <span class="c1"># Print platform information</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;GPU devices:&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the list of all GPU devices</span>
+<span class="nb">print</span><span class="p">(</span>
+    <span class="s2">&quot;Number of GPU devices&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">get_num_devices</span><span class="p">(</span><span class="n">device_type</span><span class="o">=</span><span class="s2">&quot;gpu&quot;</span><span class="p">)</span>
+<span class="p">)</span>  <span class="c1"># Get the number of GPU devices</span>
+<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Has CPU devices?&quot;</span><span class="p">,</span> <span class="n">dpctl</span><span class="o">.</span><span class="n">has_cpu_devices</span><span class="p">())</span>  <span class="c1"># Check if there are CPU devices</span>
+</pre></div>
+</div>
+</div>
+<ol class="arabic" start="2">
+<li><p><strong>Cross-platform development using Python Array API standard.</strong> If you
+program Numpy-like codes and target different hardware vendors and different tensor implementations,
+then going with <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> is a good choice for writing a portable Numpy-like code.
+The <code class="docutils literal notranslate"><span class="pre">dpctl.tensor</span></code> implements <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> for <a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a> devices. Accompanied with
+respective SYCL device, driver from different vendors, <code class="docutils literal notranslate"><span class="pre">dpctl.tensor</span></code> becomes a portable solution
+for writing numerical codes for any SYCL device.</p>
+<p>For example, some Python communities, such as
+<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/22352">Scikit-Learn* community</a>, are already establishing
+a path for having algorithms (re-)implemented using <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> .
+This is a reliable path for extending their capabilities beyond CPU only, or beyond certain GPU vendor only.</p>
+</li>
+<li><p><strong>Zero-copy data exchange between tensor implementations.</strong> Certain Python projects may have their tensor
+implementations not relying on <code class="docutils literal notranslate"><span class="pre">dpctl.tensor</span></code> or <code class="docutils literal notranslate"><span class="pre">dpnp.ndarray</span></code> tensors. However, you can still exchange data
+between these tensors not copying it back and forth through the host.
+<a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> specifies the data exchange protocol for zero-copy exchange
+between tensors through <code class="docutils literal notranslate"><span class="pre">dlpack</span></code>. Being the <a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a> implementation
+<code class="docutils literal notranslate"><span class="pre">dpctl</span></code> provides <code class="docutils literal notranslate"><span class="pre">dpctl.tensor.from_dlpack()</span></code> function used for zero-copy view of another tensor input.</p></li>
+</ol>
+</section>
+<section id="debugging-and-profiling-data-parallel-extensions-for-python">
+<h2>Debugging and Profiling Data Parallel Extensions for Python<a class="headerlink" href="#debugging-and-profiling-data-parallel-extensions-for-python" title="Permalink to this heading">¶</a></h2>
+<p><a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit.html">Intel oneAPI Base Toolkit</a> provides two tools to assist programmers to analyze performance issues in programs
+that use <strong>Data Parallel Extensions for Python</strong>. They are <a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html">Intel VTune Profiler</a> and
+<a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/advisor.html">Intel Advisor</a>.</p>
+<p>Intel © VTune ™ Profiler examines various performance aspects of a program like, the most time-consuming parts,
+efficiency of offloaded code, impact of memory sub-systems, etc.</p>
+<p>Intel © Advisor ™ provides insights on the performance of offloaded code with respect to the peak performance and
+memory bandwidth.</p>
+<p>Below you can find how to use Intel VTune Profiler and Intel Advisor with
+heterogenous programs that use <strong>Data Parallel Extensions for Python</strong>.</p>
+<section id="profiling-with-intel-vtune-profiler">
+<h3>Profiling with Intel VTune Profiler<a class="headerlink" href="#profiling-with-intel-vtune-profiler" title="Permalink to this heading">¶</a></h3>
+<p>Intel © VTune ™ Profiler provides two mechanisms to profile heterogeneous programs
+targeted to GPUs.</p>
+<ul class="simple">
+<li><p>GPU offload</p></li>
+<li><p>GPU hotspots</p></li>
+</ul>
+<p>The <em>GPU offload</em> analysis profiles the entire application (both GPU and host code) and helps to identify
+if the application is CPU- or GPU-bound. It provides information on the proportion of the execution time spent
+in GPU execution. It also provides information about various hotspots in the program. The key goal of the <em>GPU offload</em>
+analysis is to identify the parts of the program that can benefit from offloading to GPUs.</p>
+<p>The <em>GPU hotspots</em> analysis focuses on providing insights into the performance of GPU-offloaded code.
+It provides insights about the parallelism in the GPU kernel, the efficiency of the kernel, SIMD utilization,
+and memory latency. It also provides performance data regarding synchronization operations like GPU barriers and
+atomic operations.</p>
+<p>The following instructions are used to execute the two Intel VTune Profiler analyses on programs written
+using <strong>Data Parallel Extensions for Python</strong>:</p>
+<div class="literal-block-wrapper docutils container" id="id2">
+<div class="code-block-caption"><span class="caption-text"><strong>GPU Offload</strong></span><a class="headerlink" href="#id2" title="Permalink to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; vtune -collect gpu-offload -r &lt;output_dir&gt; -- python &lt;script&gt;.py &lt;args&gt;</span>
+</pre></div>
+</div>
+</div>
+<div class="literal-block-wrapper docutils container" id="id3">
+<div class="code-block-caption"><span class="caption-text"><strong>GPU Hotspots</strong></span><a class="headerlink" href="#id3" title="Permalink to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; vtune -collect gpu-hotspots -r &lt;output_dir&gt; -- python &lt;script&gt;.py &lt;args&gt;</span>
+</pre></div>
+</div>
+</div>
+<p>Intel VTune Profiler performs dynamic binary analysis on a given program to obtain insights on various
+performance characteristics. It can run on unmodified binaries with no extra requirements for program compilation.
+After collecting the data using the above commands, the Intel VTune Profiler GUI can be used to view various
+performance characteristics. In addition to the GUI, it provides mechanisms to generate reports through
+the command line and setup a web server for post processing the data.</p>
+<p>See <a class="reference external" href="https://www.intel.com/content/www/us/en/develop/documentation/vtune-help/top.html">Intel VTune Profiler User Guide</a>
+for more details.</p>
+</section>
+<section id="profiling-with-intel-advisor">
+<h3>Profiling with Intel Advisor<a class="headerlink" href="#profiling-with-intel-advisor" title="Permalink to this heading">¶</a></h3>
+<p>The primary goal of Intel © Advisor is to help you make targeted optimizations by identifying
+appropriate kernels and characterizing the performance limiting factors. It provides mechanisms
+to analyze the performance of GPU kernels against the hardware roof-line performance. Intel Advisor gives you information
+about the maximum achievable performance with the given hardware conditions and helps identify the best
+kernels for optimization. Further, it helps you to characterize if a GPU kernel is bound by
+compute capacity or by memory bandwidth.</p>
+<p>The following instructions are used to generate GPU roof-line performance graphs using Intel Advisor.</p>
+<div class="literal-block-wrapper docutils container" id="id4">
+<div class="code-block-caption"><span class="caption-text"><strong>Collect Roofline</strong></span><a class="headerlink" href="#id4" title="Permalink to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; advisor --collect=roofline --profile-gpu --project-dir=&lt;output_dir&gt; --search-dir src:r=&lt;search_dir&gt; -- &lt;executable&gt; &lt;args&gt;</span>
+</pre></div>
+</div>
+</div>
+<p>This command collects the GPU roof-line data from executing the application written using
+<strong>Data Parallel Extensions for Python</strong>.</p>
+<p>The next command generates the roof-line graph as a HTML file in the output directory:</p>
+<div class="literal-block-wrapper docutils container" id="id5">
+<div class="code-block-caption"><span class="caption-text"><strong>Generate Roofline HTML-File</strong></span><a class="headerlink" href="#id5" title="Permalink to this code">¶</a></div>
+<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">&gt; advisor --report=roofline --gpu --project-dir=&lt;output_dir&gt; --report-output=&lt;output_dir&gt;/roofline_gpu.html</span>
+</pre></div>
+</div>
+</div>
+<a class="reference internal image-reference" href="_images/advisor_roofline_gen9.png"><img alt="Advisor roofline analysis example on Gen9 integrated GPU" class="align-center" src="_images/advisor_roofline_gen9.png" style="width: 800px;" /></a>
+<p>The figure above shows the example of roof-line graph generated using Intel Advisor.
+The X-axis in the graph represents arithmetic intensity and the Y-axis represents performance in GFLOPS.
+The horizontal lines parallel to the X-axis represent the roof-line compute capacity for the given hardware.
+The cross-diagonal lines represent the peak memory bandwidth of different layers of the memory hierarchy.
+The red colored dot corresponds to the executed GPU kernel. The graph shows the performance of the kernel relative
+to the peak compute capacity and memory bandwidth. It also shows whether the GPU kernel is memory or compute
+bound depending on the roof-line that is limiting the GPU kernel.</p>
+<p>For further details on Intel Advisor and its extended capabilities, refer to the
+<a class="reference external" href="https://www.intel.com/content/www/us/en/develop/documentation/advisor-user-guide/top.html">Intel |copy| Advisor User Guide</a>.</p>
+<div class="admonition-todo admonition" id="id1">
+<p class="admonition-title">Todo</p>
+<p>Document debugging section</p>
+</div>
+</section>
+</section>
+<section id="writing-robust-numerical-codes-for-heterogeneous-computing">
+<h2>Writing Robust Numerical Codes for Heterogeneous Computing<a class="headerlink" href="#writing-robust-numerical-codes-for-heterogeneous-computing" title="Permalink to this heading">¶</a></h2>
+<p>Default primitive type (<code class="docutils literal notranslate"><span class="pre">dtype</span></code>) in <a class="reference external" href="https://numpy.org/">Numpy*</a> is the double precision (<code class="docutils literal notranslate"><span class="pre">float64</span></code>), which is supported by
+majority of modern CPUs. When it comes to program GPUs and especially specialized accelerators,
+the set of supported primitive data types may be limited. For example, certain GPUs may not support
+double precision or half-precision. <strong>Data Parallel Extensions for Python</strong> select default <code class="docutils literal notranslate"><span class="pre">dtype</span></code> depending on
+device’s default type in accordance with Python Array API Standard. It can be either <code class="docutils literal notranslate"><span class="pre">float64</span></code> or <code class="docutils literal notranslate"><span class="pre">float32</span></code>.
+It means that unlike traditional <a class="reference external" href="https://numpy.org/">Numpy*</a> programming on a CPU, the heterogeneous computing requires
+careful management of hardware peculiarities to keep the Python script portable and robust on any device.</p>
+<p>There are several hints how to make the numerical code portable and robust.</p>
+<section id="sensitivity-to-floating-point-errors">
+<h3>Sensitivity to Floating-Point Errors<a class="headerlink" href="#sensitivity-to-floating-point-errors" title="Permalink to this heading">¶</a></h3>
+<p>Floating-point arithmetic has a finite precision, which implies that only a tiny fraction of real numbers can be
+represented in floating-point arithmetic. It is almost certain that every floating-point operation
+induces a rounding error because the result cannot be accurately represented as a floating-point number.
+The <a class="reference external" href="https://standards.ieee.org/ieee/754/6210/">IEEE 754-2019 Standard for Floating-Point Arithmetic</a> sets the upper bound for rounding errors in each
+arithmetic operation to 0.5 <em>ulp</em>, meaning that each arithmetic operation must be accurate to the last bit of
+floating-point mantissa, which is an order of <span class="math notranslate nohighlight">\(10^-16\)</span> in double precision and <span class="math notranslate nohighlight">\(10^-7\)</span>
+in single precision.</p>
+<p>In robust numerical codes, these errors tend to accumulate slowly so that single precision is enough to
+calculate the result accurate to three-five decimal digits.</p>
+<p>However, there is a situation known as a <em>catastrophic cancellation</em>, when small accumulated errors
+result in a significant, or even complete, loss of accuracy. The catastrophic cancellation happens
+when two close floating-point numbers with small rounding errors are subtracted. As a result the original
+rounding errors amplify by the number of identical leading digits:</p>
+<a class="reference internal image-reference" href="_images/fp-cancellation.png"><img alt="Floating-Point Cancellation" class="align-center" src="_images/fp-cancellation.png" style="width: 327.0px; height: 141.0px;" /></a>
+<p>In the example above, green digits are accurate digits, a few trailing digits in red are inaccurate due to
+induced errors. As a result of subtraction, only one accurate digit remains.</p>
+<p>Situations with catastrophic cancellations must be carefully handled. An example where catastrophic
+cancellation happens naturally is the numeric differentiation, where two close numbers are subtracted
+to approximate the derivative:</p>
+<div class="math notranslate nohighlight">
+\[df/dx \approx \frac{f(x+\delta) - f(x-\delta)}{2\delta}\]</div>
+<p>Smaller you take <span class="math notranslate nohighlight">\(\delta\)</span> is greater the catastrophic cancellation. At the same time, bigger <span class="math notranslate nohighlight">\(\delta\)</span>
+results in bigger approximation error. Books on numerical computing and floating-point arithmetic discuss
+variety of technics to make catastrophic cancellations controllable. For more details about floating-point
+arithmetic, refer to <a class="reference external" href="https://standards.ieee.org/ieee/754/6210/">IEEE 754-2019 Standard for Floating-Point Arithmetic</a> and the article by
+<a class="reference external" href="https://www.itu.dk/~sestoft/bachelor/IEEE754_article.pdf&gt;">David Goldberg, What every computer scientist should know about floating-point arithmetic</a>.</p>
+</section>
+<section id="switching-between-single-and-double-precision">
+<h3>Switching Between Single and Double Precision<a class="headerlink" href="#switching-between-single-and-double-precision" title="Permalink to this heading">¶</a></h3>
+<ol class="arabic simple">
+<li><p>Implement your code to switch easily between single and double precision in a controlled fashion.
+For example, implement a utility function or introduce a constant that selects <code class="docutils literal notranslate"><span class="pre">dtype</span></code> for
+the rest of the <a class="reference external" href="https://numpy.org/">Numpy*</a> code.</p></li>
+<li><p>Run your code on a representative set of inputs in single and double precisions.
+Observe sensitivity of computed results to the switching between single and double precisions.
+If results remain identical to three-five digits for different inputs, it is a good sign that your code
+is not sensitive to floating-point errors.</p></li>
+<li><p>Write your code with catastrophic cancellations in mind. These blocks of code will require special
+care such as the use of extended precision or other techniques to control cancellations.
+It is likely that this part of the code requires a hardware specific implementation.</p></li>
+</ol>
+</section>
+</section>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="heterogeneous_computing.html"
+                          title="previous chapter">Heterogeneous Computing</a></p>
+  </div>
+  <div>
+    <h4>Next topic</h4>
+    <p class="topless"><a href="examples.html"
+                          title="next chapter">Examples</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/search.html b/pull/45/search.html
new file mode 100644
index 0000000..12a463c
--- /dev/null
+++ b/pull/45/search.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Search &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <script src="_static/searchtools.js"></script>
+    <script src="_static/language_data.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="#" />
+  <script src="searchindex.js" defer></script>
+  
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+       
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <h1 id="search-documentation">Search</h1>
+  
+  <noscript>
+  <div class="admonition warning">
+  <p>
+    Please activate JavaScript to enable the search
+    functionality.
+  </p>
+  </div>
+  </noscript>
+  
+  
+  <p>
+    Searching for multiple words only shows matches that contain
+    all words.
+  </p>
+  
+  
+  <form action="" method="get">
+    <input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+    <input type="submit" value="search" />
+    <span id="search-progress" style="padding-left: 10px"></span>
+  </form>
+  
+  
+  
+  <div id="search-results">
+  
+  </div>
+  
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="useful_links.html#to-do">To-Do</a></li>
+</ul>
+
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/pull/45/searchindex.js b/pull/45/searchindex.js
new file mode 100644
index 0000000..b93190c
--- /dev/null
+++ b/pull/45/searchindex.js
@@ -0,0 +1 @@
+Search.setIndex({"docnames": ["benchmarks", "demos", "examples", "heterogeneous_computing", "index", "jupyter_notebook", "notebooks/01-get_started", "notebooks/02-dpnp_numpy_fallback", "notebooks/03-mandelbrot_perfomance", "parallelism", "prerequisites_and_installation", "programming_dpep", "useful_links"], "filenames": ["benchmarks.rst", "demos.rst", "examples.rst", "heterogeneous_computing.rst", "index.rst", "jupyter_notebook.rst", "notebooks/01-get_started.ipynb", "notebooks/02-dpnp_numpy_fallback.ipynb", "notebooks/03-mandelbrot_perfomance.ipynb", "parallelism.rst", "prerequisites_and_installation.rst", "programming_dpep.rst", "useful_links.rst"], "titles": ["Benchmarks", "Demos", "Examples", "Heterogeneous Computing", "Data Parallel Extensions for Python", "Tutorials", "Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python", "Jupyter Notebook 2: Falling back to NumPy", "Examples with performance using Mandelbrot calculation", "Parallelism in Modern Data-Parallel Architectures", "Prerequisites and Installation", "Programming with Data Parallel Extensions for Python", "Useful links"], "terms": {"data": [0, 1, 2, 5, 7, 12], "parallel": [0, 1, 2, 3, 5, 7, 12], "extens": [0, 1, 2, 3, 5, 7, 12], "python": [0, 1, 2, 3, 5, 7, 8, 9, 12], "provid": [0, 4, 6, 11, 12], "set": [0, 1, 6, 7, 9, 11], "illustr": [0, 1, 3, 5, 6], "differ": [0, 3, 6, 11, 12], "aspect": [0, 3, 6, 11], "implement": [0, 3, 4, 7, 8, 11, 12], "perform": [0, 3, 4, 5, 6, 7, 9, 11, 12], "code": [0, 2, 3, 4, 6, 7, 8, 9, 12], "repres": [0, 11], "some": [0, 5, 6, 7, 11], "real": [0, 8, 11], "life": [0, 1], "numer": [0, 4, 9, 10, 12], "problem": 0, "import": [0, 2, 6, 7, 8, 11, 12], "part": [0, 11], "kernel": [0, 2, 3, 5, 7, 11], "applic": [0, 1, 5, 6, 11], "each": [0, 3, 8, 11], "i": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "sever": [0, 1, 9, 11], "variant": 0, "necessarili": [0, 3], "all": [0, 1, 2, 3, 5, 6, 8, 10, 11], "pure": 0, "typic": [0, 3, 7, 11], "slowest": [0, 8], "us": [0, 1, 2, 3, 4, 5, 6, 7, 11], "just": [0, 11, 12], "refer": [0, 1, 5, 6, 7, 11], "numpi": [0, 2, 4, 5, 6, 12], "same": [0, 2, 3, 6, 8, 9, 11], "librari": [0, 3, 4, 11, 12], "dpnp": [0, 2, 3, 4, 5, 6, 7, 8, 10], "modifi": [0, 11], "run": [0, 2, 3, 5, 7, 8, 11], "specif": [0, 6, 11], "devic": [0, 2, 4, 7, 8, 11, 12], "you": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12], "can": [0, 2, 3, 4, 6, 8, 9, 10, 11], "baselin": [0, 8], "while": [0, 2, 11], "evalu": 0, "its": [0, 3, 6, 8, 9, 10, 11], "numba": [0, 2, 3, 4, 6, 10, 12], "njit": [0, 2, 11], "arrai": [0, 2, 3, 4, 6, 7, 8, 12], "style": 0, "compil": [0, 2, 3, 4, 6, 8, 10, 11, 12], "when": [0, 3, 5, 6, 8, 9, 11], "implementat": 0, "direct": [0, 3], "loop": [0, 8, 11], "prang": [0, 8], "sometim": [0, 6], "program": [0, 3, 4, 6, 10, 12], "cumbersom": 0, "ineffici": 0, "mai": [0, 3, 6, 7, 8, 11], "lead": [0, 11], "more": [0, 1, 3, 5, 9, 11], "readabl": 0, "thu": 0, "compar": [0, 8, 9], "dpex": [0, 2, 3, 4, 10], "dpjit": [0, 2, 8, 11], "vanilla": 0, "detail": [0, 1, 3, 7, 11], "also": [0, 6, 11], "against": [0, 11], "see": [0, 5, 6, 7, 8, 9, 11], "how": [0, 6, 9, 11, 12], "much": [0, 3], "extra": [0, 6, 11], "bring": 0, "given": [0, 6, 11], "which": [0, 3, 5, 6, 7, 8, 9, 11], "close": [0, 3, 11], "cuda": [0, 11], "jit": [0, 8, 11], "model": [0, 1, 3, 6], "mlir": 0, "experiment": 0, "base": [0, 3, 6, 10, 11], "backend": [0, 6, 11], "cupi": 0, "like": [0, 6, 7, 11, 12], "compat": 0, "nativ": [0, 12], "sycl": [0, 3, 11, 12], "most": [0, 3, 7, 8, 10, 11], "have": [0, 3, 6, 7, 8, 10, 11], "dpc": [0, 3, 12], "abov": [0, 3, 11], "These": [0, 2, 3, 10, 11], "ar": [0, 1, 2, 3, 5, 6, 7, 11], "dpbench": 0, "framework": [0, 12], "allow": [0, 3, 4, 6, 9, 11], "select": [0, 2, 4, 6, 11], "hardwar": [0, 3, 10, 11, 12], "For": [0, 1, 3, 5, 6, 7, 8, 10, 11], "pleas": [0, 1, 5, 6, 7, 8], "document": [0, 1, 3, 5, 7, 11], "There": [1, 3, 11], "power": [1, 11], "thei": [1, 3, 11], "mont": 1, "carlo": 1, "pi": 1, "The": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11], "method": [1, 3, 6], "estim": 1, "valu": [1, 8], "mandelbrot": [1, 4, 5], "visual": 1, "breathtak": 1, "process": [1, 3, 6, 9, 11], "dive": 1, "famou": 1, "fractal": [1, 8], "game": 1, "evolut": 1, "conwai": 1, "": [1, 6, 7, 8, 11], "locat": [1, 2, 3, 5, 6, 7, 11], "github": [1, 2, 5], "repositori": [1, 2, 5], "individu": [1, 3], "directori": [1, 5, 11], "Their": [2, 11], "name": [2, 6, 8], "start": [2, 4, 5, 10, 11], "2": [2, 3, 4, 6, 8, 9, 11], "digit": [2, 11], "number": [2, 6, 8, 11], "follow": [2, 4, 7, 8, 9, 10, 11], "descript": [2, 12], "ani": [2, 4, 11], "order": [2, 7, 11], "howev": [2, 3, 7, 11], "new": [2, 3], "recommend": 2, "go": [2, 6, 8, 11], "enumer": 2, "command": [2, 5, 10, 11], "veri": [2, 3], "first": [2, 11], "01": [2, 11], "hello_dpnp": 2, "py": [2, 7, 8, 11], "list": [2, 5, 6, 11], "your": [2, 5, 6, 10, 11], "gpu": [2, 3, 4, 7, 8, 11], "np": [2, 6, 7, 8, 11], "x": [2, 6, 8, 11], "asarrai": [2, 3, 8, 11], "1": [2, 3, 4, 7, 8, 11], "3": [2, 4, 6, 7, 8, 11], "print": [2, 5, 6, 7, 8, 11], "alloc": [2, 3, 4, 8, 11], "y": [2, 6, 8, 11], "sum": [2, 6, 11], "result": [2, 3, 6, 7, 8, 11], "shape": [2, 6, 7, 8, 11], "0": [2, 4, 5, 6, 7, 8], "dimension": [2, 4], "expect": [2, 6, 7, 11], "6": [2, 6, 8, 11], "02": [2, 11], "type": [2, 3, 4, 5, 6, 7, 8, 9, 11], "creat": [2, 4, 6, 7, 8, 11], "empti": [2, 11], "try": [2, 6, 8, 11], "except": [2, 3, 6, 7, 8, 11], "avail": [2, 6, 9, 11], "03": [2, 11], "from": [2, 3, 5, 6, 7, 8, 10, 11, 12], "numba_dpex": [2, 4, 8, 11], "def": [2, 8, 11], "sum_it": [2, 11], "queue": [2, 4, 11], "infer": [2, 11], "submit": [2, 3, 11], "return": [2, 7, 8, 11], "04": [2, 11], "get": [2, 4, 5, 8, 11], "inform": [2, 3, 5, 6, 11], "about": [2, 3, 5, 6, 11, 12], "dpctl": [2, 3, 4, 10], "lsplatform": [2, 6, 11], "platform": [2, 6, 11], "get_devic": [2, 6, 11], "device_typ": [2, 6, 11], "get_num_devic": [2, 11], "ha": [2, 3, 6, 10, 11], "cpu": [2, 3, 4, 8, 9, 10, 11, 12], "has_cpu_devic": [2, 11], "check": [2, 6, 11], "an": [3, 4, 6, 7, 10, 11], "interpret": [3, 4], "languag": [3, 8], "impli": [3, 11], "script": [3, 7, 8, 11], "onli": [3, 7, 11], "few": [3, 6, 11], "region": [3, 11], "execut": [3, 4, 6, 7, 8, 9, 11], "That": [3, 11], "why": 3, "concept": [3, 6], "host": [3, 6, 7, 8, 11], "help": [3, 8, 11], "come": [3, 9, 11], "conceptu": 3, "diagram": [3, 9], "three": [3, 4, 11], "two": [3, 6, 7, 9, 11], "one": [3, 9, 10, 11], "attach": 3, "acceler": [3, 11], "offer": 3, "where": [3, 5, 6, 8, 11], "user": [3, 4, 5, 8, 11], "specifi": [3, 6, 8, 11], "A": [3, 7], "multipl": [3, 6, 9], "henc": 3, "pre": [3, 11], "directli": 3, "opencl": [3, 6, 8, 11, 12], "wai": [3, 6, 10, 11], "write": [3, 4, 12], "along": [3, 4, 10, 11], "One": [3, 11], "target": [3, 11, 12], "In": [3, 6, 7, 8, 9, 10, 11, 12], "case": [3, 6, 7, 10], "do": [3, 4, 6, 7, 10, 11], "need": [3, 6, 8, 10, 11], "work": [3, 10, 11], "necessari": [3, 10], "underli": [3, 11], "through": [3, 6, 11], "access": 3, "anoth": [3, 6, 7, 10, 11], "exampl": [3, 4, 5, 6, 7, 9, 10, 11], "via": [3, 7], "expens": 3, "driver": [3, 4, 6, 8, 11], "softwar": 3, "similarli": 3, "depend": [3, 9, 10, 11], "architectur": [3, 4], "exchang": [3, 11], "imposs": 3, "possibl": [3, 7], "must": [3, 7, 11], "taken": 3, "consider": 3, "On": 3, "logic": 3, "consist": [3, 4, 11], "sub": [3, 11], "singl": [3, 9], "former": 3, "programm": [3, 11], "latter": 3, "standard": [3, 4, 11, 12], "introduc": [3, 11], "usm": [3, 11], "requir": [3, 7, 10, 11], "support": [3, 4, 6, 7, 11, 12], "virtual": 3, "address": 3, "space": 3, "coher": 3, "pointer": 3, "distinct": 3, "thi": [3, 5, 6, 7, 8, 10, 11], "situat": [3, 6, 11], "stream": 3, "read": 3, "onc": 3, "fastest": 3, "crunch": 3, "happen": [3, 6, 11], "both": [3, 8, 11], "sinc": [3, 6, 7], "doe": [3, 6], "manag": [3, 11, 12], "migrat": 3, "explicitli": [3, 6, 8, 11], "slower": 3, "than": [3, 6, 8], "reason": 3, "essenti": [3, 10, 12], "premis": 3, "state": [3, 6], "resid": [3, 6, 11], "tensor": [3, 4, 11, 12], "carri": [3, 11], "input": [3, 6, 8, 11], "argument": [3, 6, 7, 8, 11], "deduc": 3, "pictur": 3, "b": [3, 9], "were": 3, "accord": [3, 11], "paradigm": 3, "c": [3, 5, 7, 8, 9, 12], "associ": [3, 7, 11], "otherwis": 3, "thrown": 3, "usag": [3, 5, 11], "belong": [3, 8], "canon": 3, "per": [3, 8], "normal": 3, "to_devic": 3, "a_new": 3, "altern": [3, 7], "As": [3, 6, 11], "said": 3, "befor": [3, 6, 7, 10], "automat": 3, "implicitli": 3, "alwai": [3, 10], "mani": [3, 6], "them": 3, "profil": [3, 4, 12], "purpos": [3, 7, 11], "control": [3, 4, 5, 12], "extend": [4, 6, 11], "capabl": [4, 6, 11], "beyond": [4, 6, 10, 11], "even": [4, 11], "higher": 4, "gain": 4, "It": [4, 5, 6, 10, 11], "foundat": [4, 11, 12], "packag": [4, 7, 8, 9, 10, 11], "subset": [4, 6], "drop": [4, 6], "replac": [4, 6, 11], "core": [4, 8, 9, 11], "function": [4, 6, 7, 11, 12], "let": [4, 6, 7, 8], "util": [4, 11], "structur": 4, "api": [4, 7, 11, 12], "creation": [4, 6, 11], "defin": [4, 7, 8], "prerequisit": [4, 8], "instal": [4, 6, 8], "modern": [4, 11], "heterogen": [4, 12], "comput": [4, 8, 9, 12], "offload": [4, 11], "unifi": 4, "share": [4, 11], "memori": [4, 6, 11], "copi": [4, 6, 7, 8, 11], "between": [4, 6, 8, 12], "addit": [4, 11], "scalar": [4, 6], "v": 4, "debug": [4, 7, 12], "robust": [4, 12], "tutori": 4, "fallback": [4, 5, 6], "calcul": [4, 5, 11], "benchmark": 4, "demo": 4, "link": 4, "To": [4, 5, 6, 7, 8, 10], "jupyt": 5, "notebook": 5, "line": [5, 6, 7, 8, 11], "prompt": 5, "server": [5, 11], "termin": 5, "includ": [5, 7, 10], "url": 5, "web": [5, 11], "default": [5, 6, 7, 11], "http": 5, "localhost": 5, "8888": 5, "08": 5, "58": 5, "24": [5, 6], "417": 5, "notebookapp": 5, "serv": 5, "local": [5, 7, 8], "catherin": 5, "activ": [5, 7], "stop": 5, "shut": 5, "down": [5, 12], "twice": 5, "skip": [5, 10], "confirm": 5, "open": [5, 8], "browser": 5, "dashboard": 5, "show": [5, 8, 11], "file": [5, 7, 8, 11], "subdirectori": 5, "wa": 5, "navig": 5, "interest": 5, "make": [6, 8, 11], "minor": [6, 8], "chang": [6, 8, 11], "statement": [6, 8], "we": [6, 7, 8], "seri": 6, "short": 6, "assum": 6, "origin": [6, 11, 12], "written": [6, 11], "noth": 6, "matric": 6, "matrix": 6, "matmul": 6, "prine": 6, "re": [6, 11], "4": [6, 7, 8], "trivial": 6, "modif": 6, "note": [6, 7], "rest": [6, 11], "lik": 6, "regular": [6, 9], "what": [6, 11, 12], "under": 6, "hood": 6, "level_zero": [6, 7, 8, 11], "actual": 6, "obvious": 6, "now": [6, 7, 8, 11], "No": 6, "know": [6, 11, 12], "becaus": [6, 7, 11], "system": [6, 10, 11], "mean": [6, 7, 8, 9, 11], "determin": 6, "oper": [6, 9, 11, 12], "our": [6, 8], "too": [6, 8, 10, 11], "attribut": [6, 8], "sure": [6, 8], "inde": 6, "deivic": 6, "precis": 6, "level": [6, 9, 11, 12], "zero": [6, 7, 8, 11], "want": [6, 7, 10, 11], "reli": [6, 11], "behavior": [6, 7, 11], "so": [6, 7, 11], "keyword": [6, 7, 11], "random": [6, 11], "gener": [6, 11], "arang": 6, "30": [6, 8], "step": [6, 8, 10], "option": [6, 7, 11], "filter": 6, "selector": 6, "string": 6, "proper": 6, "handl": [6, 11], "would": [6, 7], "reduct": [6, 11], "75": 6, "itself": 6, "among": 6, "other": [6, 8, 10, 11], "thing": 6, "verbos": 6, "5": [6, 8, 11], "intel": [6, 9, 10, 12], "r": [6, 8, 11], "hd": 6, "graphic": [6, 10], "meta": 6, "verbocitz": 6, "highest": 6, "version": [6, 10], "vendor": [6, 10, 11, 12], "corpor": 6, "num": [6, 8], "uhd": 6, "620": 6, "31": 6, "101": 6, "2111": 6, "ext_oneapi_level_zero": 6, "queri": [6, 11], "whether": [6, 11], "retriev": 6, "respect": [6, 9, 11], "object": 6, "7": [6, 7, 8, 11], "has_gpu_devic": 6, "f": [6, 7, 8, 11], "len": 6, "print_device_info": 6, "els": [6, 7, 8], "snapshot": 6, "8": [6, 7, 8, 10], "select_gpu_devic": 6, "87253657": 6, "87415047": 6, "61092713": 6, "1395424": 6, "95248436": 6, "Or": 6, "9": [6, 7, 8, 10], "l0_gpu_0": 6, "sycldevic": 6, "cannot": [6, 9, 11], "certain": [6, 7, 11], "float64": [6, 7, 11], "doubl": 6, "amount": [6, 9], "global": 6, "etc": [6, 11], "10": [6, 7, 8, 10, 11], "has_aspect_fp64": 6, "atom": [6, 11], "has_aspect_atomic64": 6, "size": [6, 9], "global_mem_s": 6, "1024": [6, 8], "mb": 6, "cach": 6, "global_mem_cache_s": 6, "kb": 6, "maximum": [6, 11], "unit": 6, "max_compute_unit": 6, "true": [6, 8], "6284": 6, "109375": 6, "512": 6, "class": [6, 8], "still": [7, 11], "develop": [7, 11], "yet": [7, 10], "reach": 7, "product": [7, 9], "qualiti": 7, "particular": 7, "gap": 7, "exist": [7, 8], "workaround": 7, "complet": [7, 10, 11], "comparison": 7, "tabl": 7, "limit": [7, 11], "dtype": [7, 8, 11], "At": [7, 11], "present": [7, 8, 11], "float32": [7, 8, 11], "int32": [7, 8], "int64": 7, "versatili": 7, "hint": [7, 11], "discourag": 7, "signific": [7, 11], "penalti": 7, "enabl": 7, "dpnp_raise_excepion_on_numpy_fallback": 7, "environ": [7, 8], "variabl": [7, 8], "take": [7, 8, 11], "n": [7, 8, 9], "200": 7, "100": 7, "dimenci": 7, "singular": 7, "element": [7, 9], "a_np": 7, "full": [7, 8], "a_dp": 7, "notimplementederror": 7, "traceback": [7, 8], "recent": [7, 8], "call": [7, 8, 9], "last": [7, 8, 9, 11], "cell": [7, 8], "gt": [7, 8], "appdata": [7, 8], "continuum": 7, "miniconda3": 7, "env": [7, 8], "ndpex": 7, "lib": [7, 8], "site": [7, 8], "dpnp_iface_arraycr": 7, "747": 7, "fill_valu": 7, "usm_typ": [7, 11], "sycl_queu": 7, "738": 7, "739": 7, "dpnp_contain": 7, "740": 7, "741": 7, "744": 7, "745": 7, "call_origin": 7, "dpnp_util": 7, "dpnp_algo_util": 7, "pyx": 7, "132": 7, "request": 7, "funtion": 7, "arg": [7, 8, 11], "20000": 7, "none": [7, 8], "39": [7, 8], "kwarg": [7, 8], "isn": 7, "t": [7, 8], "current": 7, "enviro": 7, "without": 7, "rase": 7, "attempt": 7, "unsupport": [7, 8], "full_lik": 7, "time": [7, 8, 9, 11, 12], "elaps": 7, "1000": 7, "2f": 7, "m": [7, 8], "1494": 7, "33": 7, "restart": 7, "o": [7, 8], "config": [7, 8], "__dpnp_raise_excepion_on_numpy_fallback__": 7, "2231": 7, "62": 7, "faster": [8, 9], "look": 8, "point": [8, 12], "complex": [8, 11], "plane": 8, "recurr": 8, "relat": 8, "z_": 8, "z_n": 8, "z_0": 8, "bound": [8, 11], "sequenc": 8, "word": 8, "inequ": 8, "hold": 8, "natur": [8, 11], "definit": 8, "french": 8, "mathematician": 8, "adrien": 8, "duadi": 8, "after": [8, 11], "benoit": 8, "matplotlib": 8, "build": 8, "measur": 8, "display_w": 8, "display_h": 8, "800": 8, "offset_x": 8, "offset_i": 8, "zoom": 8, "max_it": 8, "visualis": 8, "pyplot": 8, "plt": 8, "inlin": 8, "c1": 8, "c2": 8, "c3": 8, "color_by_intens": 8, "intens": [8, 11], "broadcast_to": 8, "newaxi": 8, "w": 8, "h": 8, "offset": 8, "linspac": 8, "xx": 8, "yy": 8, "1j": 8, "n_iter": 8, "2d": 8, "z": 8, "csingl": 8, "mask": 8, "initi": 8, "rang": 8, "ab": 8, "255": 8, "astyp": 8, "uint8": 8, "init_valu": 8, "asnumpi": 8, "__init__": 8, "self": 8, "draw": 8, "imshow": 8, "main": 8, "timeit": 8, "__name__": 8, "__main__": 8, "497": 8, "35": 8, "std": 8, "dev": 8, "sycl_device_filt": 8, "cpu_valu": 8, "947": 8, "19": 8, "967": 8, "15": 8, "908": 8, "If": [8, 9, 10, 11], "high": 8, "nb": 8, "threading_lay": 8, "omp": 8, "fastmath": 8, "nopython": 8, "mandel": 8, "0j": 8, "imag": 8, "color": [8, 11], "int": [8, 11], "23": 8, "875": 8, "\u00b5": 8, "mvyasank": 8, "anaconda3": 8, "my_env": 8, "decor": 8, "154": 8, "runtimewarn": 8, "ignor": 8, "warn": 8, "typingerror": 8, "89": 8, "86": 8, "88": 8, "34": 8, "84": 8, "82": 8, "83": 8, "get_ipython": 8, "run_line_mag": 8, "85": 8, "ipython": 8, "interactiveshel": 8, "2414": 8, "magic_nam": 8, "_stack_depth": 8, "2412": 8, "local_n": 8, "get_local_scop": 8, "stack_depth": 8, "2413": 8, "builtin_trap": 8, "fn": 8, "2416": 8, "below": [8, 11], "prevent": 8, "output": [8, 11], "being": 8, "displai": 8, "2417": 8, "magic": 8, "decod": 8, "output_can_be_silenc": 8, "2418": 8, "token": 8, "express": 8, "2419": 8, "getattr": 8, "magic_output_can_be_silenc": 8, "fals": 8, "1170": 8, "executionmag": 8, "1168": 8, "index": 8, "1169": 8, "time_numb": 8, "timer": 8, "1171": 8, "1172": 8, "break": 8, "158": 8, "156": 8, "gc": 8, "disabl": 8, "157": 8, "inner": 8, "159": 8, "final": 8, "160": 8, "gcold": 8, "lt": 8, "_it": 8, "_timer": 8, "74": 8, "73": 8, "dispatch": 8, "468": 8, "_dispatcherbas": 8, "_compile_for_arg": 8, "kw": 8, "464": 8, "msg": 8, "str": 8, "e": [8, 12], "rstrip": 8, "nthi": 8, "error": 8, "been": 8, "caus": 8, "465": 8, "args_str": 8, "466": 8, "patch_messag": 8, "error_rewrit": 8, "469": 8, "unsupportederror": 8, "470": 8, "someth": 8, "add": 8, "info": 8, "471": 8, "unsupported_error": 8, "409": 8, "issue_typ": 8, "407": 8, "rais": 8, "408": 8, "with_traceback": 8, "fail": 8, "dpex_dpjit_nopython": 8, "mode": 8, "pipelin": 8, "frontend": 8, "unknown": 8, "modul": 8, "temp": 8, "ipykernel_29672": 8, "2269767202": 8, "41": 8, "sourc": 8, "miss": 8, "repl": 8, "exec": 8, "dure": 8, "approach": 8, "place": 8, "experi": 8, "folliwng": 8, "love": 9, "interact": 9, "But": [9, 10], "deal": 9, "computation": 9, "heavi": 9, "compromis": 9, "commun": [9, 11], "numfocu": 9, "dedic": 9, "attent": 9, "optim": [9, 10, 11], "scienc": 9, "leverag": [9, 11], "concurr": 9, "either": [9, 11], "bigger": [9, 11], "fix": 9, "reduc": 9, "simd": [9, 11], "instruct": [9, 10, 11, 12], "special": [9, 11], "vector": 9, "width": 9, "k": 9, "simultan": 9, "wide": 9, "cisc": 9, "x86": 9, "independ": 9, "d": 9, "appropri": [10, 11], "fine": 10, "laptop": 10, "integr": [10, 11], "major": [10, 11], "window": 10, "alreadi": [10, 11], "up": 10, "date": 10, "updat": 10, "latest": 10, "compon": 10, "easiest": 10, "distribut": 10, "machin": 10, "learn": [10, 11], "manual": 10, "shown": 10, "next": [10, 11], "section": [10, 11, 12], "conda": 10, "pip": 10, "runtim": 10, "strongli": 10, "advis": 10, "cross": 11, "abstract": 11, "layer": 11, "domain": 11, "primit": 11, "storag": 11, "contrast": 11, "usm_ndarrai": 11, "ndarrai": 11, "produc": 11, "instead": 11, "math": 11, "bare": 11, "minimum": 11, "discret": 11, "deriv": 11, "routin": 11, "done": 11, "best": 11, "schedul": 11, "those": 11, "exploit": 11, "custom": 11, "By": 11, "dynam": 11, "exit": 11, "assign": 11, "enough": 11, "versatil": 11, "advanc": 11, "paramet": 11, "frequent": 11, "choos": 11, "out": 11, "good": 11, "choic": 11, "portabl": [11, 12], "accompani": 11, "becom": 11, "solut": 11, "scikit": 11, "establish": 11, "path": 11, "algorithm": [11, 12], "reliabl": 11, "project": 11, "back": 11, "forth": 11, "protocol": 11, "dlpack": 11, "Being": 11, "from_dlpack": 11, "view": 11, "oneapi": 11, "toolkit": 11, "tool": 11, "assist": 11, "analyz": [11, 12], "issu": 11, "examin": 11, "variou": 11, "consum": 11, "effici": 11, "impact": 11, "insight": 11, "peak": 11, "bandwidth": 11, "find": 11, "mechan": 11, "hotspot": 11, "analysi": [11, 12], "entir": 11, "identifi": 11, "proport": 11, "spent": 11, "kei": 11, "goal": 11, "benefit": 11, "focus": 11, "latenc": 11, "regard": 11, "synchron": 11, "barrier": 11, "analys": 11, "collect": 11, "output_dir": 11, "binari": 11, "obtain": 11, "characterist": 11, "unmodifi": 11, "gui": 11, "report": 11, "setup": 11, "post": 11, "guid": 11, "primari": 11, "character": 11, "factor": 11, "roof": 11, "give": 11, "achiev": 11, "condit": 11, "further": 11, "capac": 11, "graph": 11, "rooflin": 11, "dir": 11, "search": 11, "src": 11, "search_dir": 11, "html": 11, "roofline_gpu": 11, "figur": 11, "axi": 11, "arithmet": [11, 12], "gflop": 11, "horizont": 11, "diagon": 11, "hierarchi": 11, "red": 11, "dot": 11, "correspond": 11, "rel": 11, "especi": 11, "half": 11, "unlik": 11, "tradit": 11, "care": 11, "peculiar": 11, "keep": 11, "finit": 11, "tini": 11, "fraction": 11, "almost": 11, "everi": [11, 12], "induc": 11, "round": 11, "accur": 11, "ieee": [11, 12], "754": [11, 12], "2019": [11, 12], "upper": 11, "ulp": 11, "bit": 11, "mantissa": 11, "16": 11, "tend": 11, "accumul": 11, "slowli": 11, "five": 11, "decim": 11, "known": 11, "catastroph": 11, "cancel": 11, "small": 11, "loss": 11, "accuraci": 11, "subtract": 11, "amplifi": 11, "ident": 11, "green": 11, "trail": 11, "inaccur": 11, "due": 11, "remain": 11, "carefulli": 11, "differenti": 11, "approxim": 11, "df": 11, "dx": 11, "approx": 11, "frac": 11, "delta": 11, "smaller": 11, "greater": 11, "book": [11, 12], "discuss": 11, "varieti": 11, "technic": 11, "articl": 11, "david": [11, 12], "goldberg": [11, 12], "scientist": [11, 12], "should": [11, 12], "easili": 11, "fashion": 11, "constant": 11, "observ": 11, "sign": 11, "mind": 11, "block": 11, "techniqu": 11, "interchang": 12, "vtune": 12, "bottleneck": 12, "leve": 12, "low": 12, "advisor": 12, "advic": 12, "better": 12, "composit": 12, "free": 12, "float": 12, "scientif": 12, "paper": 12, "understand": 12, "conjunct": 12, "entri": 12}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"benchmark": 0, "demo": 1, "exampl": [2, 8], "heterogen": [3, 11], "comput": [3, 6, 11], "devic": [3, 6, 10], "offload": 3, "unifi": 3, "share": 3, "memori": 3, "follow": [3, 6], "data": [3, 4, 6, 8, 9, 10, 11], "copi": 3, "between": [3, 11], "queue": 3, "creat": 3, "addit": 3, "parallel": [4, 6, 8, 9, 10, 11], "extens": [4, 6, 8, 10, 11], "python": [4, 6, 10, 11], "tabl": 4, "content": 4, "tutori": 5, "jupyt": [6, 7], "notebook": [6, 7], "1": [6, 10], "get": 6, "start": 6, "modifi": 6, "cpu": 6, "script": 6, "run": 6, "gpu": 6, "more": 6, "alloc": 6, "advanc": 6, "control": [6, 11], "librari": [6, 8], "dpctl": [6, 11], "2": [7, 10], "fall": 7, "back": 7, "numpi": [7, 8, 11], "perform": 8, "us": [8, 12], "mandelbrot": 8, "calcul": 8, "The": 8, "set": 8, "base": 8, "numba": [8, 11], "conclus": 8, "modern": 9, "architectur": 9, "prerequisit": 10, "instal": 10, "driver": 10, "interpret": 10, "3": 10, "program": 11, "scalar": 11, "v": 11, "0": 11, "dimension": 11, "arrai": 11, "dpnp": 11, "dpex": 11, "debug": 11, "profil": 11, "intel": 11, "vtune": 11, "advisor": 11, "todo": [11, 12], "write": 11, "robust": 11, "numer": 11, "code": 11, "sensit": 11, "float": 11, "point": 11, "error": 11, "switch": 11, "singl": 11, "doubl": 11, "precis": 11, "link": 12, "companion": 12, "document": 12, "To": 12, "do": 12}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.intersphinx": 1, "nbsphinx": 4, "sphinx": 57}, "alltitles": {"Benchmarks": [[0, "id1"]], "Demos": [[1, "id1"]], "Examples": [[2, "id1"]], "Heterogeneous Computing": [[3, "id1"]], "Device Offload": [[3, "device-offload"]], "Unified Shared Memory": [[3, "unified-shared-memory"]], "Compute-Follows-Data": [[3, "compute-follows-data"]], "Copying Data Between Devices and Queues": [[3, "copying-data-between-devices-and-queues"]], "Creating Additional Queues": [[3, "creating-additional-queues"]], "Data Parallel Extensions for Python": [[4, "data-parallel-extensions-for-python"]], "Table of Contents": [[4, "table-of-contents"]], "Tutorials": [[5, "tutorials"]], "Jupyter Notebook 1: Getting started with Data Parallel Extensions for Python": [[6, "Jupyter-Notebook-1:-Getting-started-with-Data-Parallel-Extensions-for-Python"]], "Modifying CPU script to run on GPU": [[6, "Modifying-CPU-script-to-run-on-GPU"]], "More on data allocation and the Compute-Follows-Data": [[6, "More-on-data-allocation-and-the-Compute-Follows-Data"]], "Advanced data and device control with Data Parallel Control library dpctl": [[6, "Advanced-data-and-device-control-with-Data-Parallel-Control-library-dpctl"]], "Jupyter Notebook 2: Falling back to NumPy": [[7, "Jupyter-Notebook-2:-Falling-back-to-NumPy"]], "Examples with performance using Mandelbrot calculation": [[8, "Examples-with-performance-using-Mandelbrot-calculation"]], "The Mandelbrot set based on the NumPy* library": [[8, "The-Mandelbrot-set-based-on-the-NumPy*-library"]], "The Mandelbrot set based on the Data Parallel Extension for NumPy": [[8, "The-Mandelbrot-set-based-on-the-Data-Parallel-Extension-for-NumPy"]], "The Mandelbrot set on the Numba": [[8, "The-Mandelbrot-set-on-the-Numba"]], "The Mandelbrot set on the Data Parallel Extension for Numba": [[8, "The-Mandelbrot-set-on-the-Data-Parallel-Extension-for-Numba"]], "The conclusion": [[8, "The-conclusion"]], "Parallelism in Modern Data-Parallel Architectures": [[9, "parallelism-in-modern-data-parallel-architectures"]], "Prerequisites and Installation": [[10, "id1"]], "1. Device Drivers": [[10, "device-drivers"]], "2. Python Interpreter": [[10, "python-interpreter"]], "3. Data Parallel Extensions for Python": [[10, "data-parallel-extensions-for-python"]], "Programming with Data Parallel Extensions for Python": [[11, "programming-with-data-parallel-extensions-for-python"]], "Scalars vs. 0-Dimensional Arrays": [[11, "scalars-vs-0-dimensional-arrays"]], "Data Parallel Extension for Numpy - dpnp": [[11, "data-parallel-extension-for-numpy-dpnp"]], "Data Parallel Extension for Numba - numba-dpex": [[11, "data-parallel-extension-for-numba-numba-dpex"]], "Data Parallel Control - dpctl": [[11, "data-parallel-control-dpctl"]], "Debugging and Profiling Data Parallel Extensions for Python": [[11, "debugging-and-profiling-data-parallel-extensions-for-python"]], "Profiling with Intel VTune Profiler": [[11, "profiling-with-intel-vtune-profiler"]], "Profiling with Intel Advisor": [[11, "profiling-with-intel-advisor"]], "Todo": [[11, "id1"], [12, null]], "Writing Robust Numerical Codes for Heterogeneous Computing": [[11, "writing-robust-numerical-codes-for-heterogeneous-computing"]], "Sensitivity to Floating-Point Errors": [[11, "sensitivity-to-floating-point-errors"]], "Switching Between Single and Double Precision": [[11, "switching-between-single-and-double-precision"]], "Useful links": [[12, "id1"]], "Companion documentation": [[12, "id2"]], "To-Do": [[12, "to-do"]]}, "indexentries": {}})
\ No newline at end of file
diff --git a/pull/45/useful_links.html b/pull/45/useful_links.html
new file mode 100644
index 0000000..bbb1c53
--- /dev/null
+++ b/pull/45/useful_links.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html>
+
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
+
+    <!-- Google tag (gtag.js) -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVSVYMBQ0W"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag(){dataLayer.push(arguments);}
+        gtag('js', new Date());
+        gtag('config', 'G-KVSVYMBQ0W');
+    </script>
+    
+    <title>Useful links &#8212; Data Parallel Extensions for Python* 0.1 documentation</title>
+    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+    <link rel="stylesheet" type="text/css" href="_static/sdc.css" />
+    
+    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
+    <script src="_static/doctools.js"></script>
+    <script src="_static/sphinx_highlight.js"></script>
+    <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
+    <script type="text/javascript" src="_static/sidebar.js"></script>
+    <script type="text/javascript" src="_static/copybutton.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="prev" title="Demos" href="demos.html" />
+    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
+
+  </head><body>
+<div class="topbar">
+  <a class="brand" title="Intel Python projects" href="other_intel_python_projects.html"></a>
+  <a class="brand_sdc" title="Documentation Home" href="index.html"></a>
+
+  <ul>
+    <li><a class="exampleslink" title="Examples" href="examples.html"></a></li>
+    <li><a class="issueslink" title="Issues" href="https://community.intel.com/t5/Intel-Distribution-for-Python/bd-p/distribution-python"></a></li>
+    <li><a class="emaillink" title="Email" href="mailto:scripting@intel.com"></a></li>
+    <li><a class="homelink" title="GitHub" href="https://github.com/IntelPython/DPEP"></a></li>
+    <li>
+      
+      
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+      
+    </li>
+  </ul>
+</div>
+
+<div class="related">
+    <h3>Navigation</h3>
+    <ul>
+      <li class="right">
+	<a href="demos.html" title="Demos">
+	  &laquo; previous
+	</a>
+	
+      </li>
+      <li>
+	<a href="index.html">Data Parallel Extensions for Python* 0.1 documentation</a>
+	 &#187;
+      </li>
+      
+      <li>Useful links</li> 
+    </ul>
+</div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <span class="target" id="useful-links"></span><section id="id1">
+<h1>Useful links<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h1>
+<table class="docutils align-default" id="id2">
+<caption><span class="caption-text"><strong>Companion documentation</strong></span><a class="headerlink" href="#id2" title="Permalink to this table">¶</a></caption>
+<colgroup>
+<col style="width: 25.9%" />
+<col style="width: 74.1%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head"><p>Document</p></th>
+<th class="head"><p>Description</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p><a class="reference external" href="https://intelpython.github.io/dpnp/">Data Parallel Extension for Numpy*</a></p></td>
+<td><p>Documentation for programming NumPy-like codes on data-parallel devices</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a></p></td>
+<td><p>Documentation for programming Numba codes on data-parallel devices as you program Numba on CPU</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://intelpython.github.io/dpctl/latest/index.html">Data Parallel Control</a></p></td>
+<td><p>Documentation how to manage data and devices, how to interchange data between different tensor implementations,
+and how to write data parallel extensions</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html">Intel VTune Profiler</a></p></td>
+<td><p>Performance profiler supporting analysis of bottlenecks from function leve down to low level instructions.
+Supports Python and Numba</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/advisor.html">Intel Advisor</a></p></td>
+<td><p>Analyzes native and Python codes and provides the advice for better composition of heterogeneous algorithms</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://data-apis.org/array-api/">Python* Array API Standard</a></p></td>
+<td><p>Standard for writing portable Numpy-like codes targeting different hardware vendors and frameworks
+operating with tensor data</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.khronos.org/sycl/">SYCL*</a></p></td>
+<td><p>Standard for writing C++-like codes for heterogeneous computing</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://www.apress.com/gp/book/9781484255735">DPC++</a></p></td>
+<td><p>Free e-book on how to program data-parallel devices using Data Parallel C++</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.khronos.org/opencl/">OpenCl*</a></p></td>
+<td><p>OpenCl* Standard for heterogeneous programming</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://standards.ieee.org/ieee/754/6210/">IEEE 754-2019 Standard for Floating-Point Arithmetic</a></p></td>
+<td><p>Standard for floating-point arithmetic, essential for writing robust numerical codes</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://www.itu.dk/~sestoft/bachelor/IEEE754_article.pdf&gt;">David Goldberg, What every computer scientist should know about floating-point arithmetic</a></p></td>
+<td><p>Scientific paper. Important for understanding how to write robust numerical code</p></td>
+</tr>
+<tr class="row-odd"><td><p><a class="reference external" href="https://numpy.org/">Numpy*</a></p></td>
+<td><p>Documentation for Numpy - foundational CPU library for array programming. Used in conjunction with
+<a class="reference external" href="https://intelpython.github.io/dpnp/">Data Parallel Extension for Numpy*</a>.</p></td>
+</tr>
+<tr class="row-even"><td><p><a class="reference external" href="https://numba.pydata.org/">Numba*</a></p></td>
+<td><p>Documentation for Numba - Just-In-Time compiler for Numpy-like codes. Used in conjunction with
+<a class="reference external" href="https://intelpython.github.io/numba-dpex/latest/index.html">Data Parallel Extension for Numba*</a>.</p></td>
+</tr>
+</tbody>
+</table>
+</section>
+<section id="to-do">
+<h1>To-Do<a class="headerlink" href="#to-do" title="Permalink to this heading">¶</a></h1>
+<div class="admonition-todo admonition">
+<p class="admonition-title">Todo</p>
+<p>Document debugging section</p>
+</div>
+<p class="todo-source"><a class="reference internal" href="programming_dpep.html#id1"><em>original entry</em></a></p>
+</section>
+
+
+            <div class="clearer"></div>
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper"><h3>Table of Contents</h3>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="prerequisites_and_installation.html">Prerequisites and Installation</a></li>
+<li class="toctree-l1"><a class="reference internal" href="parallelism.html">Parallelism in Modern Data-Parallel Architectures</a></li>
+<li class="toctree-l1"><a class="reference internal" href="heterogeneous_computing.html">Heterogeneous Computing</a></li>
+<li class="toctree-l1"><a class="reference internal" href="programming_dpep.html">Programming with Data Parallel Extensions for Python</a></li>
+<li class="toctree-l1"><a class="reference internal" href="examples.html">Examples</a></li>
+<li class="toctree-l1"><a class="reference internal" href="jupyter_notebook.html">Tutorials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="benchmarks.html">Benchmarks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="demos.html">Demos</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Useful links</a></li>
+<li class="toctree-l1"><a class="reference internal" href="#to-do">To-Do</a></li>
+</ul>
+
+<form action="search.html" method="get">
+  <input type="text" name="q" placeholder="Search" />
+  <input type="hidden" name="check_keywords" value="yes" />
+  <input type="hidden" name="area" value="default" />
+</form>
+  <div>
+    <h4>Previous topic</h4>
+    <p class="topless"><a href="demos.html"
+                          title="previous chapter">Demos</a></p>
+  </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+<footer class="footer">
+  <p class="pull-right"> &nbsp;
+    <a href="#">Back to Top</a></p>
+  <p>
+    &copy; Copyright 2020-2023, Intel Corporation.<br/>
+    Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 7.0.1. &nbsp;
+  </p>
+</footer>
+  </body>
+</html>
\ No newline at end of file
