Ejecución de simulación con hyperthreading duplica el tiempo de ejecución

Yo uso una simulación escrita en python / numpy / cython. Como necesito promediar muchas ejecuciones de simulación, uso el módulo de multiprocesamiento para ejecutar todas las ejecuciones de simulación individuales en lotes.

En la oficina tengo una estación de trabajo i7-920 con HT. En casa tengo un i5-560 sin. Pensé que podría ejecutar el doble de instancias de la simulación en cada lote en la oficina y reducir mi tiempo de ejecución a la mitad. Sorprendentemente, el tiempo de ejecución de cada instancia individual se duplicó en comparación con el tiempo que lleva en mi estación de trabajo doméstica. Eso, ejecutar 3 instancias de simulación en paralelo en casa tomaría, digamos 8 minutos, mientras que ejecutar 6 instancias en la oficina tomará aproximadamente 15 minutos. Usando ‘cat / proc / cpuinfo’ verifiqué ‘hermanos’ = 8 y ‘cpu cores’ = 4, entonces HT está habilitado.

No estoy al tanto de ninguna ley de “conservación del tiempo de ejecución total” (aunque desde el punto de vista científico podría ser bastante interesante :)), y el hecho de que alguien aquí pueda arrojar algo de luz sobre este dilema.

Tal vez los cambios de contexto producen más sobrecarga, causados ​​por 6 procesos de cálculo masivo y solo 4 núcleos reales. Si los procesos compiten por cpu-ressources, pueden usar ineficientes cpu-caches.

Si solo habilitas 4 en lugar de 6 core, ¿cuál es el resultado?

Hyperthreading puede ser bueno para algunos tipos de carga de trabajo. Los cálculos numéricos intensos no son uno de estos: cuando desee realizar algunos cálculos de números, es mejor que desactive la función de subprocesamiento. Lo que HyperTreading proporciona es un “cambio de contexto libre” entre tareas, pero la CPU tiene solo tantas unidades de ejecución.

En este caso, puede empeorar las cosas, porque el sistema operativo no puede saber qué procesos se ejecutan en núcleos separados (donde obtendrían un rendimiento completo), y cuáles están en el mismo núcleo, solo en diferentes “hipervínculos”.

(En realidad, apostaría a que el kernel de Linux puede proporcionar una manera para que uno tenga un control preciso sobre eso, pero el módulo de multiprocesamiento de Python solo lanzará procesos adicionales que usarán la asignación de recursos predeterminada).

Línea inferior: desactive la función HT si puede, al menos hará uso completo de los 4 núcleos.

Los otros casi le han dado una idea sobre el problema, solo quiero contribuir vinculando este artículo que explica un poco más sobre cómo funciona la HT y cuáles son las implicaciones para el rendimiento de un progtwig de múltiples hebras: http: // software. intel.com/en-us/articles/performance-insights-to-intel-hyper-threading-technology/

con mi estación de trabajo HP (16 núcleos / cpu, utilizando hyper-threading a 32 procesadores), activando hyper-threading incluso en Python roto cuando ejecuto la simulación numérica, el código de error es 0x000005, esto me desconcertó durante mucho tiempo hasta que activé HT Off, y la simulación funciona bien! tal vez usted podría verificar y comparar el tiempo de ejecución para ambos HT está activado y desactivado