4

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

4

1 回答 1

5

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

简单解释一下超线程:

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

因此,如果在同一个内核上运行的两个线程使用不同的执行单元并且它自己的每个线程将具有太多的数据依赖关系,那么您只有真正从超线程中获得额外的性能。例如,一个线程只做整数运算,另一个只做浮点运算。然后您可以看到额外的性能,因为您在每个周期使用了更多的执行单元。

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

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

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

syscalls您正在寻找的用户空间控制是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;
}
于 2013-09-16T15:47:03.203 回答