SB-CPU-AFFINITY #
   hacking, October 29th 2008
Those wanting control over which CPUs threads run on (and are also lucky enough to be running SBCL on Linux) can give SB-CPU-AFFINITY a try.
Usage:
(asdf:oos 'asdf:load-op :sb-cpu-affinity)
(use-package :sb-cpu-affinity)
(with-cpu-affinity-mask (mask)
  (print mask))
(with-cpu-affinity-mask (mask :save t)
  ;; Remove all
  (clear-cpu-affinity-mask mask)
  ;; Set CPU 0.
  (setf (cpu-affinity-p 0 mask) t))
(with-cpu-affinity-mask (mask)
  (print mask))
(with-cpu-affinity-mask (mask :save t)
  ;; Only odd CPUs in mask.
  (dotimes (cpu (cpu-count))
    (setf (cpu-affinity-p cpu mask) (oddp cpu))))
(with-cpu-affinity-mask (mask)
  (print mask))
Caveat: memory malloc'ed for the CPU masks (per call to GET-CPU-AFFINITY-MASK or WITH-CPU-AFFINITY-MASK) is never released currently, as doing that causes glibc to complain about a double-free, and breaks SBCL. That's a leak of 128 bytes each time — but so long as you only set the affinity mask once per worker thread (and use pooling), it should be a non-issue.
If someone has an insight as to why this is so, and what should be done about it... I'd love to hear.