2010-06-16 11 views
5

No estoy seguro de si esto pertenece a Stackoverflow o Superuser, pero pensé que podría preguntar aquí.¿Cómo usar todos los núcleos en Windows 7?

Tengo una aplicación basada en consola escrita en C que actualmente demora aproximadamente una hora en Windows 7 de 64 bits. El administrador de tareas informa que la aplicación está utilizando solo el 25% de la CPU disponible. Me gustaría reducir el tiempo de ejecución al aumentar el uso de la CPU.

¿Hay alguna manera de dejar que la aplicación use los cuatro núcleos (la computadora portátil tiene Core i5) en lugar de solo una? Supongo que el administrador de tareas informa el 25% porque solo se asigna un núcleo al programa.

Respuesta

15

Sin volver a escribir la aplicación para que tenga varios hilos, no, no puede cambiar el comportamiento de la aplicación. Lo único que puede hacer es si la aplicación puede procesar rangos de datos de entrada, luego puede iniciar 4 instancias de la aplicación con diferentes rangos de datos de entrada para procesar y combinar los resultados después de que hayan terminado.

Imagínese haciendo una animación en 3D y el procesador es de un solo subproceso, pero puede especificar iniciar y marcos de los extremos. Tiene 100 fotogramas para renderizar iniciaría 4 instancias y especificará rangos de fotogramas de inicio y final 0 - 25, 26 - 50, 51 - 75, 76 - 100. Luego combinaría todas las salidas en su final archivo de película.

+3

+1 porque esto definitivamente funcionará en algunos casos. Un caso clásico está funcionando con datos secuenciales en un archivo de big data. Divida el archivo en 4 archivos más pequeños, ejecute el programa 4 veces y termine en 15 minutos en lugar de una hora. –

+0

¡Sí! ¡Inteligente! Siempre me olvido de eso. –

4

Podrías utilizar el hilo OpenMP o POSIX, recomendaría OpenMP porque tiene una estructura bastante básica que, dependiendo de tu programa, puede hacer que la implementación sea rápida y fácil.

+0

Esto requiere una reescritura. :) – BobbyShaftoe

7

Las aplicaciones deben escribirse de manera multiproceso para poder utilizar varios núcleos. No hay forma de que una sola aplicación con subprocesos utilice varios núcleos.

+1

nunca digas nunca, dividir la entrada es casi siempre una posibilidad –

3

En este momento no hay herramientas estándar para convertir un programa C arbitrario a un programa multiproceso. Por lo tanto, si como desarrollador no escribe explícitamente código multiproceso, no espere que su programa use más de un núcleo a la vez, a menos que invoque una función de biblioteca de terceros que esté escrita usando subprocesamiento.

Lo máximo que puede hacer (si es relevante en su caso) para utilizar mejor su CPU es cortar su entrada en N fragmentos y ejecutar el programa varias veces en cada fragmento, luego hacer algo para combinar las entradas una vez que estén todo listo.

2

Pedatinamente hablando, su aplicación ya está utilizando todos los núcleos. No hay un núcleo específico asignado al proceso, como dices arriba (a menos que hagas un esfuerzo explícito para vincular tu proceso a un núcleo específico).

El proceso utiliza todos los núcleos, pero los usa secuencialmente: se ejecuta un poco en un núcleo, luego se ejecuta un poco más en otro núcleo y así sucesivamente. Es decir. en promedio, el tiempo de CPU que consuma su aplicación se distribuye de manera uniforme en todos los núcleos del sistema. Como solo se utiliza un núcleo en un momento dado, la carga de la CPU nunca cruzará el límite del 25% (aparentemente su sistema tiene 4 núcleos).

Si quieres cruzar el límite del 25%, usted tiene que ser capaz de utilizar dos o más núcleos simultáneamente, lo que significa que al menos una parte del código tiene que ejecutar en paralelo . Para hacer eso, la aplicación debe estar escrita específicamente para ejecutarse en paralelo.Una aplicación ordinaria de un solo subproceso nunca hará eso por sí misma.

+1

Esto no es completamente cierto. Este compilador/máquina virtual (http://sourceforge.net/apps/mediawiki/ildjit/index.php?title=Main_Page) es capaz de paralelizar el código CLI (de un solo hilo) (pero también otros lenguajes). Y el sistema operativo intenta mantener la misma aplicación en el mismo núcleo para evitar el vaciado de caché. – Luca

+2

Windows 7 intenta realmente mantener un proceso afín a la CPU en la que se ejecuta durante el mayor tiempo posible, el planificador es completamente diferente al comportamiento degenerado que se mostró en XP y antes que NT –

+0

Sí, pero sinceramente esto es un muchas palabras y realmente no agrega mucho para responder la pregunta. :) – BobbyShaftoe

Cuestiones relacionadas