2009-03-07 15 views
6

Escribí un programa de subprocesos múltiples que hace algunos cálculos pesados ​​de CPU con muchas operaciones de coma flotante. Más específicamente, es un programa que compara las secuencias de animación cuadro por cuadro. Es decir. compara datos de fotograma de la animación A con todos los fotogramas de la animación B, para todos los fotogramas de la animación A. Realizo esta operación intensiva para diferentes animaciones en paralelo, por lo que el programa puede estar trabajando en par AB, par BC y par CA en paralela. El programa está utilizando QtConcurrent y una función de "mapa" que mapea un contenedor con movimientos en una función. QtConcurrent administra el grupo de subprocesos para mí, estoy trabajando en el procesador Intel Quad Core, por lo que genera 4 subprocesos.Cómo reducir el uso de CPU de un programa?

Ahora, el problema es que mi proceso destruye mi CPU. El uso es 100% constante y en realidad obtengo una pantalla azul de la muerte si ejecuto mi programa en un conjunto de movimientos lo suficientemente grande (falta de página en el área no paginada). Sospecho que esto se debe a que mi computadora está overclockeada. Sin embargo, ¿podría ser por la forma en que codifiqué mi programa? Algunas herramientas de Benchamrking muy intensas que usé para probar la estabilidad de mi máquina nunca se estrellaron en mi PC. ¿Hay alguna manera de controlar cómo mi programa usa mi CPU para reducir la carga? ¿O tal vez estoy malinterpretando mi problema?

+0

Es la respuesta más obvia ... Pero, como dije, algunos puntos de referencia complejos y juegos de computadora nunca bloquean mi PC. ¿Cómo es que nunca bloquean mi PC? – sneg

+0

sneg: Debido a un hecho bastante fundamental sobre la ejecución de su computadora (o cualquier otra) más allá de las especificaciones para las que fue diseñada: Los resultados son * impredecibles *. Ninguna prueba única puede garantizar la estabilidad de su computadora. Desconecte y vea si eso soluciona el problema. Lo más probable es que lo haga. – jalf

+0

Respuesta simple, ¿cuántos otros programas ejecuta que ejecutan la CPU y la mayor parte de la memoria de su computadora al 100% durante un período de tiempo prolongado? Las posibilidades son, ninguna. –

Respuesta

5

Aquí hay algunas respuestas excelentes.

Solo agregaría, desde el punto de vista de haber realizado muchos ajustes de rendimiento, a menos que cada hilo se haya optimizado de forma agresiva, es probable que tenga mucho espacio para la reducción del ciclo.

Para hacer una analogía con una carrera de coches de larga distancia, hay dos maneras de tratar de ganar:

  1. hacer que el coche vaya más rápido
  2. realizar menos paradas y lateral viajes

En mi experiencia, la mayoría del software como el primero escrito está bastante lejos de tomar la ruta más directa, especialmente ya que el software se vuelve grande.

Para encontrar ciclos desperdiciados en su programa, como dijo Kenneth Cochran, nunca adivine. Si arreglas algo sin haber demostrado que es un problema, estás invirtiendo en una suposición.

La forma más popular de encontrar problemas de rendimiento es utilizar perfiladores.

Sin embargo, hacer esto mucho, y mi método es el siguiente: http://www.wikihow.com/Optimize-Your-Program%27s-Performance

+0

Gracias por una buena conclusión sobre este tema, Mike. Tuve problemas para seleccionar la respuesta porque todos eran igualmente útiles y todos me dieron algo en qué pensar. Su respuesta, sin embargo, da un buen cierre. – sneg

+0

Gracias por una buena pregunta. Hay ideas tontas sobre el rendimiento que infecta al mundo, y tu pregunta arroja luz. –

9

Las PC de overclocking pueden provocar todo tipo de problemas extraños. Si sospecha que esa es la causa raíz de su problema, intente sincronizarlo en rangos razonables y vuelva a intentar sus pruebas.

También podría ser algún tipo de error de memoria bastante extraño donde corrompe su RAM de forma que Windows (supongo que ese sistema operativo, debido a BSOD) ya no puede recuperarse (muy poco probable, pero quién sabe).

Otra posibilidad que se me ocurre es que tiene algún error en la implementación de threading que mata las ventanas.

Pero al principio, me vería en el overclocking-tema ...

+0

"Supongo que OS, debido a BSOD": por el nombre, ¿no? ¿No es que se estrelló? : D –

+0

BSOD = Pantalla azul de la muerte, utilizada principalmente para la pantalla azul de error en los sistemas operativos Windows, así que supuse Windows por el nombre. El comportamiento de bloqueo no sería un buen indicador para Windows en estas condiciones, ya que cada sistema operativo se bloqueará si el hardware se opera más allá de sus límites. – Kosi2801

-1

creo que la pantalla azul de la muerte es causada cuando la región de memoria del kernel se corrompe. Por lo tanto, el uso de subprocesos múltiples para llevar a cabo operaciones paralelas no podría ser la razón de esto.

Bueno, si está creando múltiples hilos cada uno llevando pesadas operaciones de punto flotante, entonces definitivamente su utilización de CPU alcanzará hasta el 100%.

Sería mejor si puede dormir un poco en cada hilo para que el otro proceso tenga alguna posibilidad. También puede intentar reducir la prioridad de los hilos.

1

Es muy fácil culpar al hardware. Le sugiero que intente ejecutar su programa en un sistema diferente y vea cómo resulta eso con los mismos datos.

Probablemente tenga un error.

+0

Un programa que causa un bloqueo del sistema no es normal. Una aplicación nunca debería ser capaz de bloquear el sistema operativo. Si no es hardware, es más probable que sea un error en el sistema operativo. – dreamlax

+0

En mi experiencia BSOD depende de errores en el sistema operativo y/o error en los controladores del kernel. Por lo tanto, no creo que el sistema operativo funcione mal con una aplicación que funcione perfectamente. ¿Cuál es la parte menos probada aquí? Yo diría que la aplicación no es el hardware o el sistema operativo. –

+0

Mi punto es que un error en el sistema operativo habilita una aplicación de mal funcionamiento para el sistema BSOD, pero tal vez no sería BSOD si la aplicación no tenía un error. –

4

Sospecho que esto se debe a que mi computadora está overclockeada.

Definitivamente es posible. Intente configurarlo a la velocidad normal por un tiempo.

podría ser debido a la forma en que codifiqué mi programa?

Es poco probable que un programa que se ejecute en modo de usuario cause un BSOD.

2

El overclocking es la causa más probable de la inestabilidad.Con cualquier algoritmo de uso intensivo de la CPU, habrá algunos problemas con la CPU. El overclocking no obstante, encontraría un buen perfilador de rendimiento para encontrar cuellos de botella de rendimiento. Nunca adivine dónde está el problema. Podría pasar meses optimizando algo que no tiene un efecto real sobre el rendimiento o que incluso podría disminuir el peor rendimiento.

5

el tipo de operación que ha descrito ya es altamente paralelizable. Ejecutar más de un trabajo en realidad puede dañar rendimiento. La razón de esto es porque la memoria caché de cualquier procesador tiene un tamaño limitado, y cuanto más se intenta hacer al mismo tiempo, menor será el tamaño de cada caché de la caché.

También puede consultar las opciones con su GPU para absorber parte de la carga de procesamiento. Las GPU modernas son mucho más eficientes para la mayoría de los tipos de transformación de video que las CPU de generaciones similares.

-1

Si está en la plataforma Windows, ponga después de un trabajo una llamada para informar a la CPU que desea hacer la CPU a otros procesos. Hacer una llamada a la función dormir así:

Slepp (0);

0

Con la ausencia del código de error BSOD (útil para buscar) es un poco más difícil para ayudarle con éste.

Puede tratar de volver a colocar físicamente la memoria ((sacarla y soltarla). Yo, y algunos otros que sé, han funcionado en algunas máquinas donde esto era necesario. Por ejemplo, una vez intenté actualizar OS X en una máquina y siguió chocando ... finalmente saqué la memoria y la dejé caer de nuevo y todo estaba bien.

0

Dormir (1); reducirá el uso de CPU a la mitad. Me encontré con el mismo problema al trabajar con un algoritmo intensivo de CPU

+2

Solo si su unidad de trabajo tiene 1 ms de longitud y no está utilizando varios hilos. Si es así, también reducirá su * velocidad * a la mitad. –

4

Supongo que no está ejecutando una máquina de 3 núcleos (o 4, dado el 100% de uso), y la paralelización perjudicará activamente su rendimiento si utiliza más hilos que núcleos . Haga solo un hilo por CPU cor e, y haga lo que haga, nunca tenga acceso a los datos por diferentes hilos al mismo tiempo. Los algoritmos de bloqueo de caché en la mayoría de las CPU multinúcleo acabarán con su rendimiento. En este caso, en una CPU N-core que procesa animaciones en L, usaría el subproceso 1 en los fotogramas 0- (L/N), el subproceso 2 en los fotogramas (L/N) - (2 * L/N),. .. hilo N en marcos ((N-1) * L/N) -L. Haga las diferentes combinaciones (A-B, B-C, C-A) en secuencia para que no rompa su caché, también, debería ser más simple de codificar.

Como nota al margen? Real cálculo como debe utilizar 100% CPU, significa que va tan rápido como puede.

+0

Gracias por el consejo, Simon. Definitivamente voy a echar un vistazo a las formas en que puedo hacer que mi programa sea más amigable con la memoria caché – sneg

1

Analice el uso de operaciones SIMD. Creo que querrías SSE en este caso. A menudo son un mejor primer paso que la paralelización, ya que son más fáciles de corregir y proporcionan un impulso considerable a la mayoría de los tipos de operaciones de álgebra lineal.

Una vez que lo obtiene utilizando SIMD, entonces busque paralelizar. Suena como si estuvieras golpeando la CPU también, por lo que tal vez podrías dormir un poco en vez de ocupado, tal vez, y asegúrate de que estás limpiando o reutilizando los hilos correctamente.

+0

Solo como una nota al margen, intenté usar las operaciones SIMD. Pero luego intenté compilar usando la bandera/arch: sse2. El rendimiento se veía muy similar, así que supongo que el compilador hace un buen trabajo al usar el conjunto de instrucciones extendido. – sneg

0

Si su procesador tiene dos núcleos o más se puede ir al administrador de tareas e ir a los procesos y haga clic derecho sobre el nombre del programa y haga clic Set affinity y configura el programa para usar menos núcleos.

Tardará más tiempo en realizar las acciones que está solicitando pero provocará una disminución SIGNIFICATIVA en el uso de la CPU.

Cuestiones relacionadas