2013-09-16 2 views
4

Есть ли пример кода, который иллюстрирует производительность Intel Hyperthreading? Является ли это вообще доступным из пользовательского пространства, или этот процессор делает всю работу прозрачно для программиста? Это для C, Linux.Пример примера гиперпотока

ответ

4

Характеристики Hyperthreading зависят от многих факторов и их сложно оценить.

Просто коротко объяснить Hyperthreading:

  • Каждое ядро ​​имеет более чем один набор регистров, но никаких дополнительных исполнительных блоков
  • В hyperthreads запланированы более или менее равномерно

Таким образом, только вы действительно получают дополнительную производительность из hyperthreads, если два потока, выполняющиеся на одном ядре, используют разные исполнительные элементы и каждый поток на своем собственном уровне, будут иметь слишком много зависимостей adata. Например, один поток имеет целые операторы, а другой - только с плавающей запятой. Затем вы можете увидеть дополнительную производительность, потому что вы используете больше единиц исполнения за цикл.

Но это, в свою очередь, зависит от того, как ваша ОС расписала потоки на гиперпотоки. С точки зрения ОС каждый гиперпоток является логическим процессором. Так что это полностью зависит от планировщика, что положить туда и когда.

На практике hyperthreads даст вам максимум 10-20% дополнительной производительности. На нашей HPC мы отключили их (по причинам лицензирования, в основном, хотя).

Чтобы ответить на ваш реальный вопрос: вы не можете самостоятельно развернуть код на hyperthreads самостоятельно. ОС сделает это за вас. Вы можете настроить сходство с расписанием для своих потоков пользователей, но для планировщика по-прежнему нужно развернуть потоки. Это делается прозрачно для программиста. Хороший планировщик будет разворачивать ваш код равномерно сначала на ядрах и только прибегать к гиперпотокам, если все ядра заняты.

Пользовательский coltrol syscalls, который вы ищете, является sched_setaffinity и pthread_setaffinity_np.

В следующем примере кода будут развернуты два потока логических процессоров 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; 
} 
Смежные вопросы