Skip to content

Add NumPy optimization guide#36

Open
vchamarthi wants to merge 7 commits into
intel:mainfrom
vchamarthi:main
Open

Add NumPy optimization guide#36
vchamarthi wants to merge 7 commits into
intel:mainfrom
vchamarthi:main

Conversation

@vchamarthi

Copy link
Copy Markdown

Adds a new tuning guide documenting how to run NumPy with Intel® oneMKL-backed performance (BLAS/LAPACK plus optional FFT/random/umath patching), and links it from the repository’s main README

Changes:

  • Add software/numpy/README.md with installation, activation patterns, verification steps, and benchmark summaries for oneMKL-backed NumPy.
  • Update the root README.md table of contents to include the new NumPy guide.

CC @xaleryb @jharlow-intel @napetrov for addition review

Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
@david-cortes-intel

Copy link
Copy Markdown
Contributor

Overall comment: this guide recommends setting the IOMP threading layter for MKL, but pretty much every other PyPI package outside of Intel-distributed NumPy will bundle LibGOMP and could potentially cause incompatibilities.

Perhaps it could recommend setting MKL_THREADING_LAYER=GNU instead.

Comment thread software/numpy/README.md
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md
@david-cortes-intel

Copy link
Copy Markdown
Contributor

Comment again that the guide specifically mentions AVX-512 as the highest level of SIMD instructions, but that will become outdated soon as hardware with avx10.2 gets released.

Comment thread software/numpy/README.md
Comment thread software/numpy/README.md Outdated
| `MKL_DYNAMIC` | `FALSE` | Disable automatic thread scaling |
| `KMP_AFFINITY` | `granularity=fine,compact,1,0` | Pin threads to physical cores (Intel OpenMP only) |

`KMP_AFFINITY` is an Intel OpenMP setting, so it applies only when oneMKL is on the Intel runtime (`MKL_THREADING_LAYER=INTEL`); under the GNU layer use `GOMP_CPU_AFFINITY` or `numactl` instead. `KMP_AFFINITY=granularity=fine,compact,1,0` is appropriate for single-socket systems or when running one process per socket. On multi-socket systems without `numactl` it may bind threads across sockets; verify the actual binding with `KMP_AFFINITY=verbose`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about OMP_PROC_BIND?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oneMKL has a detailed guide for working with Intel OpenMP under different scenarios: https://www.intel.com/content/www/us/en/docs/onemkl/developer-guide-linux/2026-0/improving-performance-with-threading.html.

KMP_AFFINITY has existed in Intel OpenMP before the OpenMP spec introduced OMP_PROC_BIND and KMP_AFFINITY takes precedence over the OMP_PROC_BIND variables.
Reference: https://www.intel.com/content/www/us/en/docs/dpcpp-cpp-compiler/developer-guide-reference/2025-2/supported-environment-variables.html (check OMP_PROC_BIND)

Comment thread software/numpy/README.md Outdated
| Variable | Recommended value | Effect |
|---|---|---|
| `MKL_THREADING_LAYER` | `GNU` (mixed env) or `INTEL` (all-Intel) | Select MKL's OpenMP runtime; see note below |
| `MKL_NUM_THREADS` | physical core count | Cap MKL thread count |

@david-cortes-intel david-cortes-intel Jun 25, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this guaranteed to work as intended if you set MKL_NUM_THREADS to number of physical cores, then bind the threads to numbers from the system, but don't specify something like OMP_PLACES=threads? Wouldn't it potentially end up using hyperthreads if the system enumerates them in an interleaved order?

@vmalia vmalia Jul 14, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This behavior depends on MKL_DYNAMIC as described in https://www.intel.com/content/www/us/en/docs/onemkl/developer-guide-linux/2026-0/mkl-dynamic.html.

The default value of MKL_DYNAMIC is TRUE,
regardless of OMP_DYNAMIC, whose default value may be FALSE.

When MKL_DYNAMIC is TRUE, Intel® oneAPI Math Kernel Library (oneMKL)
may use fewer OpenMP threads than the maximum number you specify.

For example, MKL_DYNAMIC set to TRUE enables optimal choice of
the number of threads in the following cases:

- If the requested number of threads exceeds the number of physical cores
  (perhaps because of using the Intel® Hyper-Threading Technology),
  Intel® oneAPI Math Kernel Library (oneMKL) scales down the number of
  OpenMP threads to the number of physical cores.

This means if MKL_DYNAMIC=FALSE, user-side thread-binding is respected by oneMKL and hyperthreading can take place.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch,
@vmalia thanks for pitching in,

if you set MKL_DYNAMIC=FALSE (which this guide's table currently recommends), that automatic scale-down is off and oneMKL respects

Comment thread software/numpy/README.md Outdated
The speedup arrives in two parts that activate differently, and the distinction matters for the rest of this guide:

- **Linear algebra (BLAS and LAPACK)** turns on automatically once oneMKL is the backend. `np.dot`, `np.matmul`, and `np.linalg.*` route to it with no code change.
- **FFT, random, and vectorized math** come from three separate packages (`mkl_fft`, `mkl_random`, `mkl_umath`). These do not activate on import; you switch them on explicitly in code.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could link to the github repositories of those packages.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good addition!

Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md
print(f"speedup : {stock_ms / mkl_ms:.1f}x")
```

Measured on AWS, Intel® Xeon® 6975P-C, 16 cores / 32 threads (HT on), 1 socket, Ubuntu 26.04 LTS. Numbers vary by hardware.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have these numbers been through PDT?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are example sippets and freshly measured (FFT on the AWS Xeon 6975P-C) but have not been through PDT.
where as the benchmarking results section displayed numbers are been through the PCR review process and approved and published on IDP page - https://www.intel.com/content/www/us/en/developer/tools/oneapi/distribution-for-python.html

Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
| `MKL_DYNAMIC` | `FALSE` | Disable automatic thread scaling |
| `KMP_AFFINITY` | `granularity=fine,compact,1,0` | Pin threads to physical cores (Intel OpenMP only) |

`KMP_AFFINITY` is an Intel OpenMP setting, so it applies only when oneMKL is on the Intel runtime (`MKL_THREADING_LAYER=INTEL`); under the GNU layer use `GOMP_CPU_AFFINITY` or `numactl` instead. `KMP_AFFINITY=granularity=fine,compact,1,0` is appropriate for single-socket systems or when running one process per socket. On multi-socket systems without `numactl` it may bind threads across sockets; verify the actual binding with `KMP_AFFINITY=verbose`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is KMP_AFFINITY=verbose supposed to be tacked on to KMP_AFFINITY=granularity=fine,compact,1,0? What does that look like?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verbose can be paired with the KMP_AFFINITY,
KMP_AFFINITY=verbose,granularity=fine,compact,1,0

Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated

---

## Benchmark results

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have these numbers all been through PDT?

Comment thread software/numpy/README.md Outdated

**`mkl_random` is not a drop-in for `numpy.random`.** The same seed produces a different sequence. Do not swap it into code that depends on reproducible random values.

**AMX does not apply to standard NumPy operations.** NumPy's `float32` and `float64` operations use oneMKL's AVX-512 code paths. AMX tiles only activate for bfloat16 GEMM, which NumPy does not call natively.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
**AMX does not apply to standard NumPy operations.** NumPy's `float32` and `float64` operations use oneMKL's AVX-512 code paths. AMX tiles only activate for bfloat16 GEMM, which NumPy does not call natively.
**AMX does not apply to standard NumPy operations, even when using oneMKL.** NumPy's `float32` and `float64` operations use oneMKL's AVX-512 code paths. AMX tiles only activate for int8/bfloat16 GEMM, which NumPy does not call natively.

Is that correction accurate? My understanding is that AMX accelerates int8/bf16 GEMMs and even with oneMKL, NumPy operations will not use AMX.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct on both, verified. AMX's TMUL unit accelerates INT8 and BF16 GEMM, and NumPy's float32/float64 operations don't use those paths even with oneMKL.

Comment thread software/numpy/README.md Outdated
Comment thread software/numpy/README.md Outdated
@vchamarthi
vchamarthi requested a review from adgubrud July 17, 2026 07:26
Comment thread software/numpy/README.md
conda activate idp_env
```

Pin python version to match your project if you need a specific interpreter. NumPy comes from conda-forge; the Intel channel supplies the `mkl_fft`/`mkl_random`/`mkl_umath` extensions and Intel's latest oneMKL builds. To add oneMKL to an *existing* environment that already has conda-forge NumPy installed, swap its BLAS to the MKL variant and add the extensions in place (this re-links the NumPy you already have, it does not reinstall NumPy). Intel-channel packages are built to be compatible with conda-forge but not with the Anaconda defaults channel:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why does it need to pull them from the intel repository? They are also available in conda-forge:
https://anaconda.org/channels/conda-forge/packages/mkl_random/overview

Comment thread software/numpy/README.md
Use `--index-url`, not `--extra-index-url`: Intel's index is a partial mirror, and with `--extra-index-url` pip would see PyPI's higher-numbered OpenBLAS wheel and install that instead. Packages Intel does not mirror (for example `threadpoolctl`, used for [verification](#verifying-onemkl-is-active)) install normally from PyPI in a separate step. The Intel wheels target Linux and Windows; if `pip` reports no matching distribution, check that your platform and Python version are covered on the index.

Whichever path you take, choose the OpenMP threading layer and set it **before anything imports NumPy or MKL**. The variable is read once at MKL load time, so exporting it after the import has no effect. Which value to pick is explained under [Threads and NUMA](#threads-and-numa); the safe default for a typical pip or mixed environment is:
Whichever path you take, choose the OpenMP threading layer and set it **before anything imports NumPy, SciPy or MKL**. The variable is read once at MKL load time, so exporting it after the import has no effect. Intel OpenMP gives the best oneMKL performance on Intel hardware and is the recommended starting point; the environment-specific cases are covered under [Threads and NUMA](#threads-and-numa):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This part is not very descriptive. It could be more explicit about all-Intel vs. mixture of packages.

Comment thread software/numpy/README.md

```bash
export MKL_THREADING_LAYER=GNU # share one OpenMP runtime (libgomp) with other packages
export MKL_THREADING_LAYER=INTEL # Intel OpenMP (libiomp5): best oneMKL performance

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is the default and setting it like this doesn't change anything. CC @vmalia .

Comment thread software/numpy/README.md
### Linear Algebra: BLAS and LAPACK

This is the lever you get for free. Once oneMKL is the backend, `np.dot`, `np.matmul`, `np.linalg.*`, and everything built on them (covariances, distances, decompositions) run on oneMKL's BLAS and LAPACK with no code change and nothing to activate. These kernels dispatch at runtime to an optimized code path for the CPU's instruction set (e.g., AVX-512 on current Xeons). This is the largest single contributor to the geomean in [Benchmark results](#benchmark-results).
This is the lever you get for free. Once oneMKL is the backend, `np.dot`, `np.matmul`, `np.linalg.*`, and everything built on them (covariances, distances, decompositions) run on oneMKL's BLAS and LAPACK with no code change and nothing to activate. These kernels dispatch at runtime to an optimized code path for the CPU's instruction set (e.g., AVX-512 on current Xeons). This is the largest single contributor to the geomean speedup in [Benchmark results](#benchmark-results).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Has redundant comma after 'e.g.'.

Comment thread software/numpy/README.md
> **Reproducibility note:** `mkl_random` and `numpy.random` produce different sequences from the same seed. If your tests or simulations depend on specific random values, do not swap them.

`brng='MT19937'` selects the Mersenne Twister generator, matching `numpy.random`'s default algorithm. `method='BoxMuller'` is the faster of oneMKL's two normal-sampling methods; the alternative `'ICDF'` (inverse CDF) is slower but more accurate in the tails.
`brng='MT19937'` selects the Mersenne Twister generator, matching `numpy.random`'s default algorithm. For normal sampling, [`'BoxMuller'`](https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform) is the faster method and the reason it is used here; the alternative [`'ICDF'`](https://en.wikipedia.org/wiki/Inverse_transform_sampling) (inverse-CDF sampling) is slower but maps each uniform to a normal one-to-one, which some workloads prefer for tail fidelity. For raw generation speed, keep `'BoxMuller'`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NumPy's and SciPy's default is Ziggurat. I don't think that can be described as ICDF, and it involves a variable amount of random bit draws per output normal number.

Comment thread software/numpy/README.md
Alternatively, to partition a single generator instead of using the `MT2203` family, `skipahead(n)` advances a stream by `n` steps so each worker starts at a non-overlapping offset:

```python
block = 1_000_000

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think something like 2^63-1 (INT64_MAX) would be a more reasonable number. Can also be obtained programmatically from numpy np.iinfo(np.int64).

Comment thread software/numpy/README.md
`KMP_AFFINITY` is an Intel OpenMP setting, so it applies only when oneMKL is on the Intel runtime (`MKL_THREADING_LAYER=INTEL`); under the GNU layer use `GOMP_CPU_AFFINITY` or `numactl` instead. `KMP_AFFINITY=granularity=fine,compact,1,0` is appropriate for single-socket systems or when running one process per socket. On multi-socket systems without `numactl` it may bind threads across sockets; verify the actual binding with `KMP_AFFINITY=verbose`.
`KMP_AFFINITY` is an Intel OpenMP setting, so it applies only when oneMKL is on the Intel runtime (`MKL_THREADING_LAYER=INTEL`). For a runtime-agnostic alternative that also works under LLVM and GNU, use the standard OpenMP controls `OMP_PROC_BIND=close` and `OMP_PLACES=cores`; `OMP_PLACES=cores` is what keeps threads off hyperthread siblings, which core-count alone does not guarantee. In `KMP_AFFINITY=granularity=fine,compact,1,0`, `granularity=fine` pins each thread to a single logical CPU, `compact` places threads on adjacent cores, and the trailing `1,0` are the permute and offset ([Intel reference](https://www.intel.com/content/www/us/en/docs/dpcpp-cpp-compiler/developer-guide-reference/2025-0/thread-affinity-interface.html)). This is appropriate for single-socket systems or when running one process per socket; on multi-socket systems without `numactl` it may bind threads across sockets. To see the actual binding at startup, prepend `verbose`: `KMP_AFFINITY=verbose,granularity=fine,compact,1,0`.

`MKL_DYNAMIC` [defaults to `TRUE`](https://www.intel.com/content/www/us/en/docs/onemkl/developer-guide-linux/2026-0/mkl-dynamic.html), and while it is on, oneMKL scales the thread count down to the number of physical cores when a higher count is requested, which keeps work off hyperthread siblings automatically. Setting `MKL_DYNAMIC=FALSE` fixes the thread count and honors your binding as-is, so pair it with `OMP_PLACES=cores` (or `numactl`) to ensure threads land on distinct physical cores rather than hyperthreads.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important to mention that it needs to be paired with MKL_NUM_THREADS, otherwise it will still end up using all threads.

Comment thread software/numpy/README.md
The one situation that hurts performance is loading two OpenMP runtimes in the same process, for example oneMKL on Intel OpenMP (`libiomp5`) alongside a package that bundles GNU's `libgomp`. Two runtimes over-subscribe the cores. `MKL_THREADING_LAYER` controls oneMKL's runtime only; it does not stop another package from loading its own. When your environment already standardizes on one OpenMP runtime, match oneMKL to it:

In conda, the runtime is selected through the `_openmp_mutex` metapackage. To pin LLVM's LibOMP (the upstreamed continuation of Intel OpenMP) on Linux:
- With LLVM's LibOMP present, use `MKL_THREADING_LAYER=INTEL`: oneMKL runs its Intel threading layer on LibOMP and the `KMP_*` controls apply.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't it also set MKL_THREADING_LAYER=GNU when coupled with LLVM-OMP libraries? CC @vmalia

Comment thread software/numpy/README.md
- With LLVM's LibOMP present, use `MKL_THREADING_LAYER=INTEL`: oneMKL runs its Intel threading layer on LibOMP and the `KMP_*` controls apply.
- If other packages in the process pull in `libgomp` (some pip-installed scientific packages do), `MKL_THREADING_LAYER=GNU` selects oneMKL's GNU threading layer so the process shares a single runtime.

Platform defaults differ. Linux pip stacks often bundle `libgomp`; conda environments select the runtime through the `_openmp_mutex` metapackage (default LLVM LibOMP on recent conda-forge). On Windows conda, NumPy/SciPy/MKL resolve `llvm-openmp`, and oneMKL there reports the `intel` threading layer. To pin LLVM's LibOMP on Linux:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Default on linux is GOMP, unless MKL from conda-forge is installed, which switches it to LLVM-OMP. Not sure if the packages from the intel channel also set the OMP mutex though.

@david-cortes-intel

Copy link
Copy Markdown
Contributor

@jharlow-intel @vchamarthi If following the advise from this guide with intel packages, it ends up pulling GOMP instead of LLVM-OMP. Is that intended behavior? Are the intel packages meant to set the OMP mutex to LibOMP like the conda-forge ones do? See log below

Details
❯ mamba create -n intelenv -c https://software.repos.intel.com/python/conda -c conda-forge --override-channels intelpython3_full
⚠ Shard Index for https://software.repos.intel.com/python/conda/linux-64 not available, falling back to flat repodata
Using Flat Repodata for https://software.repos.intel.com/python/conda/linux-64            ✔ Done (0.0 sec)
⚠ Shard Index for https://software.repos.intel.com/python/conda/noarch not available, falling back to flat repodata
Using Flat Repodata for https://software.repos.intel.com/python/conda/noarch              ✔ Done (0.0 sec)
Using Cached Shard Index for conda-forge/linux-64                                                   ✔ Done
Using Cached Shard Index for conda-forge/noarch                                                     ✔ Done
Fetching and Parsing Packages' Shards                                                     ✔ Done (1.6 sec)
Using Cached Shard Index for conda-forge/linux-64                                                   ✔ Done
Using Cached Shard Index for conda-forge/noarch                                                     ✔ Done
Fetching and Parsing Packages' Shards                                                     ✔ Done (0.3 sec)
Parsing Packages' Records                                                                 ✔ Done (4.2 sec)

Resolving Environment                                                                     ✔ Done (2.2 sec)

Transaction

  Prefix: /localdisk2/mkl/dcortes/miniforge3/envs/intelenv

  Updating specs:

   - intelpython3_full


  Package                       Version  Build                  Channel                                     Size
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  Install:
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────

  + _openmp_mutex                   4.5  20_gnu                 conda-forge                               Cached
  + blas                          1.0.0  3_intelmkl             software.repos.intel.com/python/conda        8kB
  + bzip2                         1.0.8  hda65f42_9             conda-forge                               Cached
  + ca-certificates           2026.5.20  hbd8a1cb_0             conda-forge                               Cached
  + common_cmplr_lib_rt        2026.1.0  intel_235              software.repos.intel.com/python/conda       18kB
  + common_cmplr_lic_rt        2026.1.0  intel_235              software.repos.intel.com/python/conda       18kB
  + cpython                      3.14.5  py314hd8ed1ab_100      conda-forge                               Cached
  + dal                        2026.0.0  h74c4b1a_1017          conda-forge                                 19MB
  + dpcpp-cpp-rt               2026.1.0  intel_235              software.repos.intel.com/python/conda       19kB
  + dpcpp_cpp_rt               2026.1.0  intel_235              software.repos.intel.com/python/conda       18kB
  + dpctl                        0.22.1  py314ha278afc_0        software.repos.intel.com/python/conda      820kB
  + dpnp                         0.20.0  py314hf5c4441_0        software.repos.intel.com/python/conda       14MB
  + fortran_rt                 2026.1.0  intel_235              software.repos.intel.com/python/conda       18kB
  + icu                            78.3  h33c6efd_0             conda-forge                               Cached
  + impi_rt                   2021.18.1  intel_9                software.repos.intel.com/python/conda       73MB
  + intel-cmplr-lib-rt         2026.1.0  intel_235              software.repos.intel.com/python/conda       28MB
  + intel-cmplr-lib-ur         2026.1.0  intel_235              software.repos.intel.com/python/conda        8MB
  + intel-cmplr-lic-rt         2026.1.0  intel_235              software.repos.intel.com/python/conda       19kB
  + intel-fortran-rt           2026.1.0  intel_235              software.repos.intel.com/python/conda      585kB
  + intel-gpu-ocl-icd-system      1.0.0  h6b64f20_2             software.repos.intel.com/python/conda       15kB
  + intel-opencl-rt            2026.1.0  intel_235              software.repos.intel.com/python/conda       78MB
  + intel-openmp               2026.1.0  intel_235              software.repos.intel.com/python/conda       35MB
  + intel-sycl-rt              2026.1.0  intel_235              software.repos.intel.com/python/conda       84MB
  + intelpython3_full          2026.0.0  py314_4                software.repos.intel.com/python/conda       24kB
  + ipp                        2026.0.1  intel_51               software.repos.intel.com/python/conda       58MB
  + ipp-license                2026.0.1  intel_51               software.repos.intel.com/python/conda       15kB
  + joblib                        1.5.3  pyhd8ed1ab_0           conda-forge                               Cached
  + ld_impl_linux-64             2.45.1  default_hbd61a6d_102   conda-forge                               Cached
  + libblas                    3.2026.0  3_intelmkl             software.repos.intel.com/python/conda        8kB
  + libcblas                   3.2026.0  3_intelmkl             software.repos.intel.com/python/conda        9kB
  + libexpat                      2.8.1  hecca717_0             conda-forge                               Cached
  + libffi                        3.5.2  h3435931_0             conda-forge                               Cached
  + libgcc                       15.2.0  he0feb66_19            conda-forge                               Cached
  + libgfortran                  15.2.0  h69a702a_19            conda-forge                               Cached
  + libgfortran5                 15.2.0  h68bc16d_19            conda-forge                               Cached
  + libgomp                      15.2.0  he0feb66_19            conda-forge                               Cached
  + libhwloc                     2.13.0  default_he001693_1000  conda-forge                               Cached
  + libiconv                       1.18  h3b78370_2             conda-forge                               Cached
  + liblapack                  3.2026.0  3_intelmkl             software.repos.intel.com/python/conda        9kB
  + liblapacke                 3.2026.0  3_intelmkl             software.repos.intel.com/python/conda        9kB
  + liblzma                       5.8.3  hb03c661_0             conda-forge                               Cached
  + libmpdec                      4.0.0  hb03c661_1             conda-forge                               Cached
  + libsqlite                    3.53.1  h0c1763c_0             conda-forge                               Cached
  + libstdcxx                    15.2.0  h934c35e_19            conda-forge                               Cached
  + libuuid                      2.42.1  h5347b49_0             conda-forge                               Cached
  + libxml2                      2.15.3  h49c6c72_0             conda-forge                               Cached
  + libxml2-16                   2.15.3  hca6bf5a_0             conda-forge                               Cached
  + libzlib                       1.3.2  h25fd6f3_2             conda-forge                               Cached
  + mkl                        2026.1.0  intel_236              software.repos.intel.com/python/conda      143MB
  + mkl-dpcpp                  2026.1.0  intel_236              software.repos.intel.com/python/conda       16kB
  + mkl-service                   2.7.2  py314h3e0429d_0        conda-forge                                 76kB
  + mkl_fft                       2.2.1  py314h63f28aa_0        conda-forge                                184kB
  + mkl_random                    1.4.1  py314h84c5ace_0        conda-forge                                403kB
  + mkl_umath                     0.4.3  py314h93feb13_0        software.repos.intel.com/python/conda      169kB
  + ncurses                         6.6  hdb14827_0             conda-forge                               Cached
  + numpy                         2.4.6  py314h2b28147_0        conda-forge                               Cached
  + onemkl-license             2026.1.0  intel_236              software.repos.intel.com/python/conda       30kB
  + onemkl-sycl-blas           2026.1.0  intel_236              software.repos.intel.com/python/conda       12MB
  + onemkl-sycl-datafitting    2026.1.0  intel_236              software.repos.intel.com/python/conda        1MB
  + onemkl-sycl-dft            2026.1.0  intel_236              software.repos.intel.com/python/conda        3MB
  + onemkl-sycl-lapack         2026.1.0  intel_236              software.repos.intel.com/python/conda        6MB
  + onemkl-sycl-rng            2026.1.0  intel_236              software.repos.intel.com/python/conda       15MB
  + onemkl-sycl-sparse         2026.1.0  intel_236              software.repos.intel.com/python/conda       15MB
  + onemkl-sycl-stats          2026.1.0  intel_236              software.repos.intel.com/python/conda        4MB
  + onemkl-sycl-vm             2026.1.0  intel_236              software.repos.intel.com/python/conda       14MB
  + openssl                       3.6.2  h35e630c_0             conda-forge                               Cached
  + packaging                      26.2  pyhc364b38_0           conda-forge                               Cached
  + python                       3.14.5  habeac84_100_cp314     conda-forge                               Cached
  + python-gil                   3.14.5  h4df99d1_100           conda-forge                               Cached
  + python_abi                     3.14  8_cp314                conda-forge                               Cached
  + readline                        8.3  h853b02a_0             conda-forge                               Cached
  + scikit-learn                  1.8.0  np2py314hf09ca88_1     conda-forge                               Cached
  + scikit-learn-intelex       2026.0.0  py314_intel_1010       software.repos.intel.com/python/conda        2MB
  + scipy                        1.17.1  py314hf07bd8e_0        conda-forge                               Cached
  + setuptools                   82.0.1  pyh332efcf_0           conda-forge                               Cached
  + tbb                        2023.0.0  hab88423_2             conda-forge                               Cached
  + tbb4py                     2023.0.0  py314hdd39d97_2        conda-forge                                 79kB
  + tcm                           1.5.0  intel_489              software.repos.intel.com/python/conda      724kB
  + threadpoolctl                 3.6.0  pyhecae5ae_0           conda-forge                               Cached
  + tk                           8.6.13  noxft_h366c992_103     conda-forge                               Cached
  + tzdata                        2025c  hc9c84f9_1             conda-forge                               Cached
  + umf                           1.1.0  intel_340              software.repos.intel.com/python/conda      140kB
  + zstd                          1.5.7  hb78ec9c_6             conda-forge                               Cached

  Summary:

  Install: 83 packages

  Total download: 617MB

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants