是否有一些示例代码可以说明Intel的超线程性能?它是完全可以从用户空间访问的,还是由CPU为程序员透明地完成所有工作?这是给C,Linux的。
发布于 2013-09-16 15:47:03
超线程的性能取决于许多因素,很难估计。
简单地解释一下超线程:
因此,只有当运行在同一核心上的两个线程使用不同的执行单元,并且每个线程都有太多的adata依赖项时,超线程才能真正获得额外的性能。例如,一个线程只执行整数运算,另一个只执行浮点数。然后,您可以看到额外的性能,因为您每个周期使用更多的执行单元。
但这又取决于操作系统如何将线程调度到超线程上。从操作系统的角度来看,每个超线程都是一个逻辑CPU。因此,这完全取决于调度程序在哪里放置什么以及何时放置。
在实践中,超线程最多会给你10%-20%的额外性能。在我们的HPC上,我们已经关闭了它们(主要是出于许可的原因)。
要回答您的实际问题:您不能直接将代码部署到超线程上。操作系统会帮你的。您可以为您的用户线程设置调度亲缘关系,但实际部署线程仍然完全取决于调度程序。这对程序员来说是透明的。一个好的调度器会首先在内核上均匀地部署您的代码,并且只有在所有内核都很忙的情况下才会使用超线程。
您要寻找的用户控制syscalls是集亲和力和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;
}https://stackoverflow.com/questions/18831996
复制相似问题