Pregunta

Estoy tratando de optimizar el tiempo de compilación de un gran proyecto de VC ++. Mi procesador es un Core i7 950 (4 núcleos, 8 subprocesos, ya que es compatible con la tecnología Intel Hyper-Threading).

En Microsoft Visual Studio 2010, si va a Herramientas> Opciones> Proyectos y soluciones> Configuración del proyecto de VC ++> Cumplimiento máximo de C ++ simultáneo

puede seleccionar el máximo de núcleos de CPU que se utilizarán para la compilación paralela de C ++. Selecciono 0 allí (para que se usen todos mis núcleos), lo que produce exactamente los mismos resultados que cuando uso 4 u 8.

Ahora, si abro el Administrador de tareas mientras compilo el proyecto, puedo ver que se están ejecutando 4 subprocesos de compilación paralelos (en los procesos tienen la descripción: Controlador del compilador de Microsoft C / C ++), y que el uso total de la CPU es un poco menos del 50% todo el tiempo.

Entonces mi pregunta es:

¿Es posible tener 8 subprocesos de compilación en paralelo en un procesador de cuatro núcleos e hiperprocesos? Si esto no es posible, ¿es posible de alguna manera usar cerca del 100% de la potencia del procesador durante la compilación?

Esto me ahorrará una gran cantidad de tiempo.

Muchas gracias de antemano

Nicolás

¿Fue útil?

Solución

Esto me ahorrará una gran cantidad de tiempo.

No, no lo haría. Hyperthreading es útil cuando tiene que ejecutar diferentes tipos de tareas que utilizan recursos complementarios dentro de la CPU. Por ejemplo, un hilo usa mucho punto flotante y el otro no. Mientras que el primero está haciendo matemáticas de punto flotante, el resto de la CPU está disponible para el otro subproceso.

Por razones obvias, muchos subprocesos de compilación quieren los mismos recursos internos de CPU. Todo lo que lograrías es tener el doble de subprocesos peleando por la memoria caché y los recursos de la CPU. Una mayor contención de caché haría la vida más lenta, no más rápida.


Bueno, lo anterior explica por qué no obtendrá GRANDES ganancias con el código Hyperthreading y homogéneo. La sabiduría convencional para la creación en paralelo es establecer el número de trabajos en uno más que el número de núcleos, asumiendo que 1 / N procesos probablemente está realizando E / S de disco. Por supuesto, eso es para el make de Unix donde un trabajo hace mucho procesamiento de archivos make además de la compilación real.

Si giró la perilla hasta 8 y no vio ningún cambio (tenga en cuenta, podría ser un cambio negativo en el rendimiento por las razones explicadas anteriormente) en el uso de CPU informado por el Administrador de tareas, probablemente se deba a que las interdependencias en su solución están forzando ciertas tareas de compilación para ejecutarse secuencialmente. Si una tarea se basa en la salida de otra (los encabezados precompilados a menudo causan esto), entonces eso limita la cantidad de trabajos simultáneos; incluso si tuviera un sistema de 16 núcleos, no obtendría más paralelismo del que permite la estructura del proyecto.

Otros consejos

Podría ser que solo tiene una limitación de disco en lugar de una limitación de CPU.

Creo que esto es un problema con Visual Studio.Intente ejecutar sus archivos MAKE con "jom", el clon paralelo de nmake.Debería ver un aumento del 35% al usarlo sobre msvc llamado para compilar con 4 núcleos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top