首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超线程代码示例

超线程代码示例
EN

Stack Overflow用户
提问于 2013-09-16 15:38:49
回答 1查看 3.3K关注 0票数 4

是否有一些示例代码可以说明Intel的超线程性能?它是完全可以从用户空间访问的,还是由CPU为程序员透明地完成所有工作?这是给C,Linux的。

EN

回答 1

Stack Overflow用户

发布于 2013-09-16 15:47:03

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

简单地解释一下超线程:

  • 每个核心有一个以上的寄存器集,但没有额外的执行单元。
  • 超线程的调度或多或少是均匀的。

因此,只有当运行在同一核心上的两个线程使用不同的执行单元,并且每个线程都有太多的adata依赖项时,超线程才能真正获得额外的性能。例如,一个线程只执行整数运算,另一个只执行浮点数。然后,您可以看到额外的性能,因为您每个周期使用更多的执行单元。

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

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

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

您要寻找的用户控制syscalls集亲和力np

下面的示例代码将在逻辑CPU 0和1上部署两个线程,如果启用了第一个套接字的第一个逻辑核,这两个超级线程将对应于第一个套接字的第一个逻辑核心上的两个超线程。不过,真正把它们放在那里还是要由调度程序来决定的。如果那些超线程很忙,那么您的代码就会休眠:

代码语言:javascript
复制
#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;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18831996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档