sched_setaffinity を使用して現在のプロセスをコア 7 で実行するには、次のようにします。
cpu_set_t my_set; /* Define your cpu_set bit mask. */
CPU_ZERO(&my_set); /* Initialize it all to 0, i.e. no CPUs selected. */
CPU_SET(7, &my_set); /* set the bit that represents core 7. */
sched_setaffinity(0, sizeof(cpu_set_t), &my_set); /* Set affinity of tihs process to */
/* the defined mask, i.e. only 7. */
詳細については、http://linux.die.net/man/2/sched_setaffinity &http://www.gnu.org/software/libc/manual/html_node/CPU-Affinity.html を参照してください。
最小限の実行可能な例
この例では、アフィニティを取得して変更し、sched_getcpu()
で有効になっているかどうかを確認します。 .
main.c
#define _GNU_SOURCE
#include <assert.h>
#include <sched.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void print_affinity() {
cpu_set_t mask;
long nproc, i;
if (sched_getaffinity(0, sizeof(cpu_set_t), &mask) == -1) {
perror("sched_getaffinity");
assert(false);
}
nproc = sysconf(_SC_NPROCESSORS_ONLN);
printf("sched_getaffinity = ");
for (i = 0; i < nproc; i++) {
printf("%d ", CPU_ISSET(i, &mask));
}
printf("\n");
}
int main(void) {
cpu_set_t mask;
print_affinity();
printf("sched_getcpu = %d\n", sched_getcpu());
CPU_ZERO(&mask);
CPU_SET(0, &mask);
if (sched_setaffinity(0, sizeof(cpu_set_t), &mask) == -1) {
perror("sched_setaffinity");
assert(false);
}
print_affinity();
/* TODO is it guaranteed to have taken effect already? Always worked on my tests. */
printf("sched_getcpu = %d\n", sched_getcpu());
return EXIT_SUCCESS;
}
GitHub アップストリーム。
コンパイルして実行:
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
出力例:
sched_getaffinity = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
sched_getcpu = 9
sched_getaffinity = 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sched_getcpu = 0
つまり、
- 最初は、16 個のコアがすべて有効になっていて、プロセスはコア 9 (10 番目のコア) でランダムに実行されていました
- アフィニティを最初のコアのみに設定した後、プロセスは必然的にコア 0 (最初のコア) に移動しました
このプログラムを taskset
まで実行するのも楽しいです。 :
taskset -c 1,3 ./a.out
次の形式の出力が得られます:
sched_getaffinity = 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
sched_getcpu = 2
sched_getaffinity = 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sched_getcpu = 0
したがって、最初から親和性が制限されていることがわかります.
これが機能するのは、taskset
子プロセスによってアフィニティが継承されるためです。 は forking です:子 fork プロセスによる CPU アフィニティの継承を防ぐにはどうすればよいですか?
nproc
sched_getaffinity
を尊重します デフォルトでは次のようになっています:Python を使用して CPU の数を確認する方法
Python:os.sched_getaffinity
および os.sched_setaffinity
参照:Python を使用して CPU の数を調べる方法
Ubuntu 16.04 でテスト済み。
qsubを使用してシェルスクリプトを実行すると、「予期しないファイルの終わり」および「関数定義のインポートエラー」エラーが発生する
コンパイル時に「SDL.h no such file or directory found」