carstenbauer / ThreadPinning.jl

Readily pin Julia threads to CPU-threads
https://carstenbauer.github.io/ThreadPinning.jl/
MIT License
106 stars 7 forks source link
high-performance-computing julia multithreading thread-affinities

ThreadPinning.jl

Readily pin Julia threads of multithreaded and distributed Julia applications to CPU-threads

Documentation Build Status Quality
SciML Code Style

Most notably, ThreadPinning.jl allows you

There is dedicated support for pinning Julia threads in distributed Julia applications that use MPI.jl or Distributed.jl.

What is this about? (10 minutes)

Check out my lightning talk that I gave as part of JuliaCon 2023 at MIT.

Quick Demo

julia> using ThreadPinning

julia> pinthreads(:cores)

julia> threadinfo(; color=false)
Hostname:       PerlmutterComputeNode
CPU(s):         2 x AMD EPYC 7763 64-Core Processor
CPU target:     znver3
Cores:          128 (256 CPU-threads due to 2-way SMT)
NUMA domains:   8 (16 cores each)

Julia threads:  16

CPU socket 1
  0,_, 1,_, 2,_, 3,_, 4,_, 5,_, 6,_, 7,_, 
  8,_, 9,_, 10,_, 11,_, 12,_, 13,_, 14,_, 15,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_

CPU socket 2
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_, 
  _,_, _,_, _,_, _,_, _,_, _,_, _,_, _,_

# = Julia thread, # = Julia thread on HT, # = >1 Julia thread

(Mapping: 1 => 0, 2 => 1, 3 => 2, 4 => 3, 5 => 4, ...)

Installation

The package is registered. Hence, you can simply use

] add ThreadPinning

to add the package to your Julia environment.

Note that only Linux is fully supported. On other operating systems, all pinning calls (e.g. pinthreads) will turn into no-ops but things like threadinfo() should work (with limitations).

Documentation

For more information, please find the documentation here.