Saludos!
tengo la siguiente duda:
¿Como puededo asignar un hilo de procesamiento para que trabaje en un núcleo determinado del procesador?
Saludos!
tengo la siguiente duda:
¿Como puededo asignar un hilo de procesamiento para que trabaje en un núcleo determinado del procesador?
DdS
Hola dds, lo que necesitas se llama OpenMP, es una interfaz de programación para calculo paralelo que trabaja con memoria compartida, preferentemente en computadoras multicore.
No se porque queres asignar una función a un núcleo en particular, pero te recomiendo que tengas cuidado con eso porque si le erras a la carga de cada núcleo lo vas a sobrecargar y posiblemente caliente más un núcleo que otro acarreando diversos problemas.
Sin embargo OpenMP es muy bueno y muy recomendable de usar, es super eficiente y su utilización se puede apreciar en gran medida, pero como te decia antes, dejando que el mismo código decida como separar la carga. Aunque a veces le erra y tenes que actuar vos como programador para evitar problemas de sobrecarga de un núcleo.
Deberias escribir algo como esto, no lo tomes tal cual porque estoy medio oxidado en estos asuntos pero puedo enviarte codigo si lo queres ver!
Aqui te envio como hacer para que un hilo en particular haga algo unicamente.
Saludos y espero te haya servido!Código:#include <omp.h> #include <stdio.h> #include <stdlib.h> int main (int argc, char *argv[]) { int nthreads, tid; //variable n de hilos y ID de cada hilo #pragma omp parallel private(nthreads, tid) { /* Obtener numero de hilo */ tid = omp_get_thread_num(); /*Cada hilo en particular tiene un numero distinto por más que sea el mismo código, es medio dificil de entender al principio*/ printf("Hola mundo desde el proceso = %d\n", tid); /* Solo el hilo master hace lo siguiente */ if (tid == 0) //De la misma forma podrias poner cualquier otra tid { nthreads = omp_get_num_threads(); printf("Numero de threads = %d\n", nthreads); } } /* Aqui se juntan todos lo hilos y vuelve a ser secuencial el código */ }
No dudes en consultar de nuevo
Última edición por hectoritr; 06/11/2011 a las 12:37
dds (01/11/2011)
Buenas, al ver tu mensaje me pico la curiosidad y estuve buscando un poco por la MSDN a ver si había alguna api para hacer lo que quieres, y encontré SetThreadAffinityMask que creo que es ideal para lo que quieres, siempre y cuando crees los threads con CreateThread de windows.
Espero que te sirva de ayuda, Saludos.
dds (06/11/2011)
Pues se muy poco del tema, pero talves te interese hecharle un vistazo a CUDA
MID - Mecahtronics Intelligent Design
mecatronica.mid@gmail.com
Hola dds! Pudiste hacer lo que querias?
Saludos y gracias por su respuesta !
Ya mismo me pongo a probar , por ahora solo he estado jugando con las prioridades del proceso. SetThreadAffinityMask parece justamente lo que estaba buscando !
DdS
Saludos!
estuve probando con las prioridades del proceso y el hilo, y a verdad no obtuve ningún resultado apreciable en los tiempos de ejecución. las funciones que utilice son :
SetPriorityClass(Proceso,REALTIME_PRIORITY_CLASS)
SetThreadPriority(GetCurrentThread(),THREAD_PRIORI TY_TIME_CRITICAL)
si se nota la diferencia levemente en el resto de los programas abiertos, funcionan un poco mas lento.
en cuanto a SetThreadAffinityMask lo probé y anda bien , el tema es que el efecto es contrario :
en vez de mejorar el tiempo de ejecución lo empeora! salvo por supuesto que se utilice "3" en la mascara ( que asigna el hilo a ambos procesadores)que en definitiva es como no utilizar la función.
DdS
Yo la verdad es que no se para que quieres limitar un hilo a un solo núcleo, lo que esta claro, es que windows intenta optimizar todos los hilos para que funcionen lo mas rápido posible con todos los núcleos disponibles. Si tu le dices a windows que cierto hilo solo puede utilizar un núcleo veo bastante normal que disminuya el rendimiento. Piensa que tu hilo solo utilizara una parte del procesador, pero esto no limita a todos los demás procesos y hilos a utilizar ese núcleo.
En cuanto a SetPriorityClass y SetThreadPriority si los pones al máximo solo notaras la diferencia cuando tengas otros procesos que se coman la cpu y no tengan al máximo su prioridad.
Quizás si explicas un poco lo que estas haciendo te podemos ayudar mejor.
Saludos
Saludos!
lo que ocurre es que tengo 4 hilos. uno ingresa datos desde una cámara al máximo frame rate de esta, el resto de los hilos van realizando procesamientos sucesivos sobre el cuadro, como si fuera una linea de montaje.
lo que quería probar es que si en una maquina de cuatro núcleos hago correr en forma paralela los 4 hilos, estos se ejecutarían en un tiempo menor y mas estable.
Sucede que, como en una linea de montaje, el tiempo de cada hilo debe ser lo mas exacto y parecidos posible. Sino tengo un cuello de botella.
DdS
Hola dds, lo que quieres hacer es un caso ideal para hacerlo con OpenMP como te comente más arriba! En serio es un muy bueno ejemplo, lo que podrías hacer y corregime si me equivoco es lo siguiente, asignar un núcleo a la captura de la imagen, y luego si procesas la imagen en forma de matriz como seguramente lo haces, paraleliza el procesamiento entre los tres núcleos restante, como una imagen supone una carga constante si divides bien el trabajo no tendrás cuellos de botella, salvo en la captura de la imagen!
Como paralelizas el trabajo? Le asignas un tercio de la matriz imagen a cada núcleo y luego juntas el trabajo al final de procesamiento, por esos debes darle un poquito menos de trabajo a tu núcleo master, para que procese su parte y luego junte cada chunk (porcion de matriz) de los slave.
Si lo logras implementarlo vas a notar un gran diferencia en el tiempo de procesamiento y en la fluidez de la imagen!
PD: pregunta de curioso nomas, que procesamiento le queres hacer a la señal?
PD2:No dudes en preguntar lo que no se entienda de mi comentario!
Saludos!!
Héctor!