我在寫2個進程的linux C程序。我將在不同的機器上運行該程序。如何編程以便不同的進程在不同的CPU內核上運行?
這些機器可能有多個CPU核心。
當我運行程序時,系統會爲不同的進程分配不同的CPU內核嗎?或者我需要編寫一些代碼以充分利用CPU內核?
我在寫2個進程的linux C程序。我將在不同的機器上運行該程序。如何編程以便不同的進程在不同的CPU內核上運行?
這些機器可能有多個CPU核心。
當我運行程序時,系統會爲不同的進程分配不同的CPU內核嗎?或者我需要編寫一些代碼以充分利用CPU內核?
如果您希望將線程/進程固定到特定的CPU,那麼您必須使用系統調用sched_setaffinity(2)
或調用pthread_setaffinity_np(3)
庫。 Linux中的每個核心都有自己的虛擬CPU ID。
這些調用允許您設置允許的CPU掩碼。
否則,它將由調度程序的離題運行來運行你感覺就像運行它們的線程。
但都不能保證你的進程並行運行。除非您實時運行,否則只有調度程序才能決定。
下面是一些示例代碼:
#include <sched.h>
int run_on_cpu(int cpu) {
cpu_set_t allcpus;
CPU_ZERO(&allcpus);
sched_getaffinity(0, sizeof(cpu_set_t), &allcpus);
int num_cpus = CPU_COUNT(&allcpus);
fprintf(stderr, "%d cpus available for scheduling\nAvailable CPUs: ", num_cpus);
size_t i;
for (i = 0; i < CPU_SETSIZE; i++) {
if (CPU_ISSET(i, &allcpus))
fprintf(stderr, "%zu, ", i);
}
fprintf(stderr, "\n");
if (CPU_ISSET(cpu, &allcpus)) {
cpu_set_t cpu_set;
CPU_ZERO(&cpu_set);
CPU_SET(cpu, &cpu_set);
return pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpu_set);
}
return -1;
}
我不確定誰降低了這個答案,但這是一個公平的答案。如果有人想在特定的CPU上固定一個任務,這是要走的路,除非你不希望調度程序決定。 +1 –
@rakib乾杯。我從來沒有理解人們如何在不至少評論什麼是錯誤的情況下降低投票率。 –
是,除非做一些事情,以防止它,內核會調度進程到所有核心。要在單個程序中使用多個內核,通常使用多個線程(儘管有時可能會隱含這種內核,例如使用OpenMp)。 –