[C con Clase] Uso CPU

Programante programante en gmail.com
Dom Oct 10 01:56:52 CEST 2010


 El 01/10/10 13:58, Pau Manent escribió:
> Hola a todos
>
> Mi problema, y supongo que le de muchos, es que cuando ejecuto un
> programa que he hecho en C++, estre utiliza toda la potencia del CPU,
> lo que puede inducir errores en cálculos largos y complicados.
¿De dónde sacas la noción de que puede inducir errores?
Utiliza toda la CPU precisamente para acabar antes. Si por hacerlo da
resultados erróneos es que está mal fabricada y deberían devolverte el
dinero (Intel gastó millones hace unos cuantos años reemplazando CPUs
que había vendido que fallaban en unas pocas divisiones).
Si lo que quieres es asegurarte de que el resultado es correcto,
deberías hacer el cálculo varias veces, incluso en diferentes
ordenadores. Pero a no ser que estés haciendo un sistema crítico como
conducir un tren no merece la pena.

> Mi pergunta es si alguien sabe de alguna libreria, función o algun
> procedimiento de programación para que el programa sólo use una
> determinada potencia del CPU.
Más común es querer que el programa no utilice toda la CPU *para poder
hacer otras cosas mientras tanto*. Esto se consigue bajando la prioridad
del proceso.
Esto en Unix podrías hacerlo con nice(10); y en Windows con
SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS);

> Y otra cosa, es possible programar con dos núcleos, es decir, yo tengo
> un AMD x64 sempron (32+32bits), pero al ejecutar un programa sólo usa
> un micro, el otro no hace nada. Seria posible utilizar ambos a la vez
> para ejecutar subrutinas distintas?
Sí. Tendrías que ejecutarlas en hilos diferentes.

Un código como:
int numero1 = calculo1();
int numero2 = calculo2();

cout << "El resultado es " << ( numero1 + numero2 ) << endl;

Se podría convertir en algo como:
hilo1 = crear_hilo( calculo1 );
hilo2 = crear_hilo( calculo2 );

esperar_fin_hilo( hilo1 );
esperar_fin_hilo( hilo2 );

int numero1 = resultado_hilo( hilo1 );
int numero2 = resultado_hilo( hilo2 );

cout << "El resultado es " << ( numero1 + numero2 ) << endl;

En este caso crearíamos dos hilos y tendríamos un tercero esperando por
ambos (también podría ejecutar él mismo calculo2).
O podríamos tener un número de hilos fijos e ir pasándoles trabajos
(worker pool).

Lo que hay que tener muy en cuenta es que los hilos no pueden modificar
*nada* que lea el otro, ya que podrían interferir dando resultados
incorrectos (tiene que hacerse creando una sección crítica, para que se
pare antes de leer si el otro está escribiendo).
Tampoco podría llamarse a la pseudo-función resultado_hilo() de un hilo
que aún no hubiera terminado el cálculo, etc.





Más información sobre la lista de distribución Cconclase