cubecl-cpu 0.11.0-pre.1

CPU runtime for CubeCL
use std::mem;

use super::CoreId;
use libc::{
    CPU_ISSET, CPU_SET, CPU_SETSIZE, SYS_gettid, cpu_set_t, sched_getaffinity, sched_setaffinity,
    syscall,
};

pub fn get_active_cores() -> impl Iterator<Item = CoreId> {
    let affinity_mask = get_affinity_mask();

    (0..CPU_SETSIZE as usize)
        .filter(move |i| unsafe { CPU_ISSET(*i, &affinity_mask) })
        .map(CoreId)
}

pub fn set_for_current(core_id: CoreId) {
    let mut set = new_cpu_set();
    let tid = unsafe { syscall(SYS_gettid) } as libc::id_t;
    unsafe { libc::setpriority(libc::PRIO_PROCESS, tid, 0) };
    unsafe { CPU_SET(core_id.0, &mut set) };
    unsafe { sched_setaffinity(0, mem::size_of::<cpu_set_t>(), &set) };
}

fn get_affinity_mask() -> cpu_set_t {
    let mut set = new_cpu_set();
    unsafe { sched_getaffinity(0, mem::size_of::<cpu_set_t>(), &mut set) };
    set
}

fn new_cpu_set() -> cpu_set_t {
    unsafe { std::mem::zeroed::<cpu_set_t>() }
}