如何编程使不同的进程在不同的CPU核心上运行?

3
我正在编写一个带有两个进程的 Linux C 程序。我将在不同的机器上运行该程序。
这些机器可能有多个 CPU 核心。
当我运行程序时,系统会为不同的进程分配不同的 CPU 核心吗?还是我需要编写一些代码以充分利用 CPU 核心?

2
是的,除非采取措施防止它,否则内核将进程调度到所有核心上。要在单个程序中使用多个核心,通常需要使用多个线程(尽管有时可能是隐式的,例如使用OpenMp)。 - Jerry Coffin
1个回答

3
如果您希望将线程或进程固定到特定的 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_
1
@rakib 干杯。我从来不明白人们怎么能在没有至少评论错误的情况下就投反对票。 - Sergey L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接