Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Og. en 11 Mayo 2010, 06:40 am



Título: Como aprovechar un doble núcleo?
Publicado por: Og. en 11 Mayo 2010, 06:40 am
Pues esa es mi duda, que tengo que hacer para que un código en C++ aproveche el hecho de que tenga un procesador de doble núcleo?

Saludos y gracias :)


Título: Re: Como aprovechar un doble núcleo?
Publicado por: Eternal Idol en 11 Mayo 2010, 08:09 am
Podes crear un hilo, el S.O. se encarga del resto aunque si queres forzarlo podes especificar la afinidad de cada hilo con un procesador.

Windows, SetProcessAffinityMask:
http://msdn.microsoft.com/en-us/library/ms686223(VS.85).aspx


Título: Re: Como aprovechar un doble núcleo?
Publicado por: Littlehorse en 11 Mayo 2010, 08:13 am
Es un tema bastante extenso como para preguntarlo en forma tan abierta. Tenes que especificar, como mínimo, sobre que sistemas.

En principio, para programas relativamente sencillos los threads es todo lo que necesitas. Tal vez en programas mas complejos el mantenimiento de los threads y el futuro desarrollo puede dificultarse bastante, ya que el hecho de usar multithreading acarrea problemas como las race conditions, aunque eso lo podes solucionar usando mutexes. De esta forma también traes a escena otros problemas como los deadlocks y los livelocks, solucionables, pero mas desde el lado del análisis del algoritmo que desde la parte practica.
En todo caso si vas por el lado del multithreading, a mi me gusta boost por varias razones, pero supongo que con una o dos búsquedas encontraras análisis mas extensos que lo que yo te pueda decir ahora en un solo post.

Para analizar si necesitas usar o no usar threads, primero hay que saber no solo sus grandes problemas si no también sus beneficios, como por ejemplo compartir recursos, lo cual no requiere mucho trabajo extra ya que comparten el mismo espacio de direcciones del proceso. Ademas son mas simples en el sentido que hay menos complejidad interna por thread que por proceso individual, lo cual obviamente impacta en el rendimiento.

Como ultimo sobre threads, cada sistema los trata de manera distinta y en pos de poder optimizar el rendimiento, primero necesitas saber como funciona el sistema en el cual quieres trabajar (Por ejemplo, con que prioridad trata el sistema a determinados threads)

Otro acercamiento al problema es el multiproceso, que a grandes rasgos es todo lo contrario al multithreading en cuanto a ventajas y desventajas, pero por ahora dejo el post aca si no se hace demasiado largo. Ten en cuenta que hay varios acercamientos al tema, no solo estos dos, y cada uno tiene sus ventajas y desventajas y obviamente a pesar que pueda gustarme a mi o a cualquiera una u otra forma, depende mas que nada del escenario de la aplicacion que de los gustos de cada programador.

Algunos links que tenia por ahí guardados:

  • Parallel computing (http://en.wikipedia.org/wiki/Parallel_computing)
  • Threads   (http://en.wikipedia.org/wiki/Thread_%28computer_science%29)
  • Parallel programming with C++ (http://weblogs.asp.net/kennykerr/archive/2007/12/11/parallel-programming-with-c-a-new-series.aspx)

Si tenes dudas ya sabes.

Saludos!