私は。。をしようとしています:
プロセッサのピン留めと同時に16コピーを実行します(コアごとに2コピー)
特定の機能、たとえば機能1が終了した後、プロセッサのピン留め(コアごとに2コピー)とプロセッサコアの最も遠いコアへのフリップと同時に8コピーを実行します。
私が直面している問題は、最も遠いプロセッサをどのように選択するかです。
Sched_getaffinityとsched_setaffinityの使用を提案した友人もいますが、良い例は見つかりません。
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_ [set | get] affinityのcpusetsizeパラメーターとしてCPU_SETSIZEを使用しないでください。名前は誤解を招く可能性がありますが、これは間違っています。 makro CPU_SETSIZEは(man 3 cpu_setを引用)「cpu_set_tに格納できる最大CPU数より1大きい値」です。あなたは使用する必要があります
sched_setaffinity(0, sizeof(cpu_set_t), &my_set);
代わりに。
実行可能な最小限の例
この例では、アフィニティを取得して変更し、 sched_getcpu()
で有効になっているかどうかを確認します。
#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);
} else {
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;
}
コンパイルして実行する:
gcc -std=c99 main.c
./a.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
つまり、次のことを意味します。
このプログラムを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
がフォークしている子プロセスによって継承されるために機能します。 子フォークされたプロセスによるCPUアフィニティの継承を防ぐ方法は?
nproc
は、以下に示すように、デフォルトでsched_getaffinity
を尊重します。 Pythonを使用してCPUの数を確認する方法
Ubuntu 16.04でテスト済み、 GitHubアップストリーム 。