超线程代码示例

Der*_*unk 4 c architecture multithreading hyperthreading

是否有一些示例代码可以说明英特尔的超线程性能?它是否可以从用户空间访问,或者 CPU 是否为程序员透明地完成所有工作?这是针对 C、Linux 的。

Ser*_* L. 5

超线程性能取决于许多因素并且难以估计。

简单解释一下超线程:

  • 每个内核有多个寄存器组,但没有额外的执行单元
  • 超线程或多或少均匀地调度

因此,如果运行在同一个内核上的两个线程使用不同的执行单元,并且每个线程本身都有太多的 adata 依赖项,那么您才能真正从超线程中获得额外的性能。例如,一个线程仅执行整数操作,另一个线程仅执行浮点操作。然后您可以看到额外的性能,因为您每个周期使用更多的执行单元。

但这反过来又取决于您的操作系统如何将线程调度到超线程上。从操作系统的角度来看,每个超线程都是一个逻辑 CPU。所以完全取决于调度程序在那里放置什么以及何时放置。

在实践中,超线程最多可以为您提供 10-20% 的额外性能。在我们的 HPC 上,我们已经关闭了它们(主要是出于许可原因)。

回答您的实际问题:您不能自己直接将代码部署到超线程上。操作系统将为您做到这一点。您可以为用户态线程设置调度关联,但实际部署线程仍然完全取决于调度程序。这对程序员是透明的。一个好的调度器会首先在内核上均匀地部署您的代码,并且只有在所有内核都忙时才使用超线程。

syscalls您正在寻找的用户空间 coltrol是sched_setaffinitypthread_setaffinity_np

下面的示例代码将在逻辑 CPU 0 和 1 上部署两个线程,如果启用了超线程,它们将对应于第一个套接字的第一个逻辑核心上的两个超线程。仍然由调度程序实际将它们放在那里。如果这些超线程很忙,那么您的代码将休眠:

#define _GNU_SOURCE
#include <pthread.h>
#include <sched.h>
#include <stdlib.h>

void * my_thread(intptr_t cput_o_run_on) {
    cpuset_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(cput_o_run_on, &cpuset);

    pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset);

    // force a rescheduling
    sched_yield();

    // do something useful

    return NULL;
}

int main() {
    pthread_t thread;

    pthread_create(&thread, NULL, my_thread, 0);
    pthread_create(&thread, NULL, my_thread, 1);

    for (;;);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)