c++ - que - Comparación de rendimiento Hyper-Threading
hyper threading traduccion (4)
He escrito un proyecto que usa algunas funciones básicas en openssl como RAND_bytes y des_ecb_encrypt ... Mi computadora tiene i7-2600 (4 núcleos y 8 CPU lógicas). Cuando ejecuto mi proyecto con 4 hilos, costará 10 segundos. Cuando lo ejecuto con 8 hilos, también cuesta 10 segundos.
Al usar RDRAND
(lo que RAND_bytes
hará en este caso), el bus es el factor limitante. Deberías alcanzar un pico de alrededor de 800MB / seg. No importa cuántos hilos tenga: el bus no puede transferir datos lo suficientemente rápido. Vea la instrucción y las instrucciones de Intel revisadas .
Si usó AES, entonces podría ver una mejor aceleración sobre las observaciones de DES / 3DES. Su Ivy Bridge tiene AES-NI
y puede alcanzar casi 1.3 ciclos / byte, y eso debería ser aproximadamente el doble o triple AES es software. Para asegurarse de que está utilizando las instrucciones AES-NI
, debe usar las interfaces EVP_*
.
Encontré aquí que me dice que hyper-threading no me da una mejora en algunas situaciones. Además, encontré aquí darme algunos resultados intuitivos.
Creo que @selalerer y @Mats Petersson respondieron tu pregunta. El problema no escala linealmente y hay una aceleración máxima que encontrarás. Intel afirma que es alrededor del 30%.
La arquitectura más nueva de Intel favorece la ejecución fuera de servicio sobre la ejecución de Hyper-Threading porque se supone que es más eficiente. Lea sobre los núcleos del procesador Silvermont.
Pero si desea una inmersión profunda formal, entonces vea un libro sobre ingeniería informática. Aquí está el libro que usamos cuando lo estudié en la universidad: Computer Organization and Design (probablemente ya esté un poco anticuado).
Sin embargo, he tratado de escribir algunas pruebas simples y encontré algunos ejemplos simples que mostrarán hyper-threading que no me dará una mejoría aparente.
OpenSSL también tiene una aplicación de evaluación comparativa. Vea el código fuente en <openssl source>/apps/speed.c
.
Además, las aplicaciones de evaluación comparativa tienen sus propias personalidades. Es posible que una prueba de esfuerzo de encriptación no revele las diferencias predominantemente como espera verlas. Ver, por ejemplo, Benchmarking Tools .
He escrito un proyecto que usa algunas funciones básicas en openssl
como RAND_bytes
y des_ecb_encrypt
.
Mi computadora tiene i7-2600 (4 núcleos y 8 CPU lógica). Cuando ejecuto mi proyecto con 4 hilos, costará 10 segundos. Cuando lo ejecuto con 8 hilos, también cuesta 10 segundos.
Lo que quiero decir es que hyper-threading no me da ninguna mejora en el rendimiento. En Linux, el resultado del experimento es el mismo.
Encontré aquí que me dice que hyper-threading no me da una mejora en algunas situaciones. Además, encontré aquí darme algunos resultados intuitivos.
Sin embargo, he tratado de escribir algunas pruebas simples y encontré algunos ejemplos simples que mostrarán hyper-threading que no me dará una mejoría aparente. Lamentablemente, no lo encuentro.
Entonces, mi pregunta es que si hay algunas pruebas simple
muestra que el hyper-threading no me dará ninguna mejora en el rendimiento.
El subprocesamiento Hyper aprovecha el hecho de que la CPU tiene muchos componentes y cuando se usa uno, cuando no hay subprocesamiento, los otros simplemente permanecen inactivos. Puede intentar escribir dos tipos de subprocesos, uno haciendo cálculos enteros (que con suerte usará la ALU) y otro haciendo aritmética de coma flotante (que con suerte usará la FPU).
No probé esto por mi cuenta, pero parece que en ese caso, el hyper threading debería mejorar el rendimiento.
Para mostrar lo contrario, puede usar solo un tipo de subprocesos (ya sea que los subprocesos solo realicen operaciones enteras o que los subprocesos solo realicen operaciones de coma flotante).
También puede ser que su prueba sea defectuosa, pero para saber si ese es el caso, necesitaremos más información sobre esa prueba.
Los siguientes son detalles y resultados de mis puntos de referencia de MP para Linux y Windows, que pueden comportarse de manera diferente. No mucho HT, pero las pruebas de Linux incluyen Atom (1 núcleo 2 hilos) y Windows tiene Core i7 resultados (4 + 4).
http://www.roylongbottom.org.uk/linux%20multithreading%20benchmarks.htm
http://www.roylongbottom.org.uk/quad%20core%208%20thread.htm
Haga su elección, dependiendo de lo que quiera probar si HT proporciona un mejor o peor rendimiento. Los siguientes son los resultados de RandMem en i7 (Linux parece mejor con esta prueba). Para i7, también debe considerar Turbo Boost que podría ser más bajo con varios subprocesos.
CPUs MBytes Per Second Using Threads Gain At Threads
/HTs 1 2 4 6 8 2 4 6 8
Serial RD
Core i7 4/8 L1 11458 22661 37039 43717 46374 2.0 3.2 3.8 4.0
930 L2 10380 20832 32853 41711 42839 2.0 3.2 4.0 4.1
#### MHz L3 8828 17743 29610 38414 40330 2.0 3.4 4.4 4.6
Win 764 RAM 4266 8712 17347 24946 25589 2.0 4.1 5.8 6.0
Serial RW
Core i7 4/8 L1 15282 13724 16240 16209 18379 0.9 1.1 1.1 1.2
930 L2 12223 18216 25326 28104 27047 1.5 2.1 2.3 2.2
#### MHz L3 10234 19266 21931 24450 26351 1.9 2.1 2.4 2.6
Win 764 RAM 4533 7656 13876 14543 13390 1.7 3.1 3.2 3.0
Random RD
Core i7 4/8 L1 11266 22548 38174 45592 47141 2.0 3.4 4.0 4.2
930 L2 6233 12463 20059 24986 25667 2.0 3.2 4.0 4.1
#### MHz L3 3499 6915 9211 10002 9531 2.0 2.6 2.9 2.7
Win 764 RAM 459 909 1241 1398 1364 2.0 2.7 3.0 3.0
Random RW
Core i7 4/8 L1 14375 3027 2780 2901 3297 0.2 0.2 0.2 0.2
930 L2 5887 4555 6117 6693 7281 0.8 1.0 1.1 1.2
#### MHz L3 3104 4604 4721 5047 4933 1.5 1.5 1.6 1.6
Win 764 RAM 428 860 899 948 1026 2.0 2.1 2.2 2.4
#### 2.8 GHz running at up to 3.06 GHz via Turbo Boost, dual channel 1066 MHz DDR3 RAM
Luego, el punto de referencia de MP Whetstone que muestra ganancias reales
MWIPS MFLOP MFLOP MFLOP COS EXP FIXPT IF EQUAL
CPU MHz 1 2 3 MOPS MOPS MOPS MOPS MOPS
Core i7 1 Thrd #### 3115 1065 886 738 79.3 39.7 2447 2936 1154
Core i7 Win7 #### 21690 8676 7621 5844 531 291 16643 12027 5034
Quad Core Thread 1 1091 1027 728 66.4 36.5 2050 1501 629
Plus HT Thread 2 1089 1037 742 66.0 36.5 2090 1507 630
Thread 3 1090 946 742 66.8 36.5 2069 1534 631
Thread 4 1092 1037 727 66.6 36.6 2031 1501 630
Thread 5 1042 959 736 66.4 36.5 1912 1483 630
Thread 6 1091 874 723 66.6 36.1 2049 1507 629
Thread 7 1090 867 725 65.6 36.3 2094 1516 631
Thread 8 1091 874 722 66.3 36.3 2350 1476 624
Gain % 696 815 860 792 670 733 680 410 436
Puede encontrar que hyperthreading ayuda más en el código que utiliza grandes cantidades de memoria, por lo que el procesador se bloquea con regularidad en la recuperación de la memoria.
En mi experiencia, es bastante difícil encontrar un "código simple" que muestre los beneficios de hyperthreading. Tiende a ser ejemplos más complejos que muestran el beneficio. Aún así, es probable que el beneficio no sea el doble que el de "no hyperthreading". Cuente con obtener quizás una mejora del 20-30%.