超线程代码示例

时间:2013-09-16 15:38:50

标签: c multithreading architecture hyperthreading

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

1 个答案:

答案 0 :(得分:4)

超线程性能取决于很多因素,很难估计。

简要解释超线程:

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

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

但这又取决于你的操作系统如何安排线程到超线程。从操作系统的角度来看,每个超线程都是一个逻辑CPU。因此,完全由调度程序决定放在那里以及何时放置。

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

要回答您的实际问题:您无法直接将代码部署到超线程上。操作系统会为您做到这一点。您可以为用户态线程设置调度关联,但仍然需要调度程序来实际部署线程。这对程序员来说是透明的。一个好的调度程序将首先在核心上均匀地部署您的代码,并且只有在所有核心都忙的情况下才会使用超线程。

您要查找的用户空间syscallssched_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;
}