Linux で C または C++ からプロセスの CPU アフィニティを設定する方法は?

sched_setaffinity(2) を使用する必要があります .

たとえば、CPU 0 と 2 のみで実行するには:

#define _GNU_SOURCE
#include <sched.h>

cpu_set_t  mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask);
CPU_SET(2, &mask);
int result = sched_setaffinity(0, sizeof(mask), &mask);

(0 最初のパラメーターは現在のプロセスを意味するため、制御したい他のプロセスの場合は PID を指定します)。

sched_getcpu(3) も参照してください .


プロセス レベルで sched_setaffinity を使用するか、個々のスレッドに対して pthread_attr_setaffinity_np を使用します。


何が起こっているのかを理解するために多くの努力をしてきたので、私のような人々を助けるためにこの回答を追加します (私は gcc を使用します) Linux mint のコンパイラ)

#include <sched.h> 
cpu_set_t  mask;

inline void assignToThisCore(int core_id)
{
    CPU_ZERO(&mask);
    CPU_SET(core_id, &mask);
    sched_setaffinity(0, sizeof(mask), &mask);
}
int main(){
    //cal this:
    assignToThisCore(2);//assign to core 0,1,2,...

    return 0;
}

ただし、次のオプションをコンパイラ コマンドに追加することを忘れないでください:-D _GNU_SOURCE オペレーティング システムが特定のコアにプロセスを割り当てる可能性があるため、この GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=2,3" を追加できます。 /etc/default にある grub ファイルに そして実行 sudo update-grub 端末で必要なコアを予約します

更新: より多くのコアを割り当てたい場合は、次のコードに従ってください:

inline void assignToThisCores(int core_id1, int core_id2)
{
    CPU_ZERO(&mask1);
    CPU_SET(core_id1, &mask1);
    CPU_SET(core_id2, &mask1);
    sched_setaffinity(0, sizeof(mask1), &mask1);
    //__asm__ __volatile__ ( "vzeroupper" : : : ); // It is hear because of that bug which dirtied the AVX registers, so, if you rely on AVX uncomment it.
}