是否有一些示例代码可以说明英特尔的超线程性能?它是否可以从用户空间访问,或者该CPU是否为程序员透明地完成所有工作?这适用于C,Linux。
答案 0 :(得分:4)
超线程性能取决于很多因素,很难估计。
简要解释超线程:
因此,如果在同一核心上运行的两个线程使用不同的执行单元并且其自身的每个线程将具有太多的adata依赖性,那么您只能从超线程中获得额外的性能。例如,一个线程只执行整数运算,另一个只执行浮点运算。然后,您可以看到额外的性能,因为每个周期使用的执行单元更多。
但这又取决于你的操作系统如何安排线程到超线程。从操作系统的角度来看,每个超线程都是一个逻辑CPU。因此,完全由调度程序决定放在那里以及何时放置。
在实践中,超线程将为您提供最多10-20%的额外性能。在我们的HPC上,我们已将其关闭(主要是出于许可原因)。
要回答您的实际问题:您无法直接将代码部署到超线程上。操作系统会为您做到这一点。您可以为用户态线程设置调度关联,但仍然需要调度程序来实际部署线程。这对程序员来说是透明的。一个好的调度程序将首先在核心上均匀地部署您的代码,并且只有在所有核心都忙的情况下才会使用超线程。
您要查找的用户空间syscalls
为sched_setaffinity和pthread_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;
}