Discussion:
partir en hilos.
(demasiado antiguo para responder)
Manzanita
2004-02-09 22:07:29 UTC
Permalink
Saludos.

Voy a empezar una aplicación de cálculo que quería dividir en varios
hilos. Algunas partes del algoritmo modifican los datos, otras partes sólo
leen y sé los mecanismos de sincronización que debo usar. Lo que no sé es
el criterio que debo seguir para dividir el cálculo en varios hilos. ¿
Debería hacer toda la aplicación en un sólo thread y luego dividirla según
vea el tiempo que tarda cada parte (no lo puedo saber a priori porque uso
librerías de terceros para algunos de los algoritmos)?. Supongo que si
algunos hilos tienen menos carga (están esperando a menudo en las llamadas
que los suspenden a la espera de que otros hilos terminen su trabajo y los
pongan en modo alertable), el rendimiento será menor debido al mayor número
de cambios de contexto.

Cualquier ayuda acerca de cómo planear una aplicación multihilo me
sería de ayuda.

Gracias por adelantado.
Mikel Irazabal
2004-02-10 09:29:29 UTC
Permalink
Post by Manzanita
Cualquier ayuda acerca de cómo planear una aplicación multihilo me
sería de ayuda.
Si lo que quieres es hacer un programa de cálculo, no te recomendaría
usar más que unos 8 procesos/hilos (no merece más que uno por cada
posible procesador, y 8 es ser muy optimista).

En el caso de que haces la aplicación multiproceso para evitar esperas
por E/S de disco, red o lo que fuera, quizá si te merezca hacer más
hilos/procesos.

Por cierto, si mal no recuerdo, creo que en una aplicación multihilo, en
un momento dado, sólo puede haber un hilo por proceso, por lo que aunque
tu programa sea multihilo no aprovechará multiples procesadores. Para
eso deberías hacerlo multiproceso y usar memoria compartida.

(Informate, quizá me equivoque...)

Hasta otra,

Mikel
Martin J. Sanchez
2004-02-10 11:05:49 UTC
Permalink
On Tue, 10 Feb 2004 10:29:29 +0100, Mikel Irazabal
Post by Mikel Irazabal
Por cierto, si mal no recuerdo, creo que en una aplicación multihilo, en
un momento dado, sólo puede haber un hilo por proceso, por lo que aunque
tu programa sea multihilo no aprovechará multiples procesadores. Para
eso deberías hacerlo multiproceso y usar memoria compartida.
Hombre si solo se acepta un hilo por proceso, entonces no estamos en
un sistema multi-hilo...

Si te refieres a que no se usa mas de un procesador en un multi-hilo,
eso es por culpa de algunos SOs. como linux. Pero por ejemplo en
NT/2000 aprovecharas todos los procesadores.

Un saludo,
Martin.
Mikel Irazabal
2004-02-10 12:09:52 UTC
Permalink
Post by Martin J. Sanchez
Hombre si solo se acepta un hilo por proceso, entonces no estamos en
un sistema multi-hilo...
Lo que quería decir es que no se admiten más de un hilo ejecutándose en
un instante (en diferentes procesadores), pero si más de un hilo por
proceso.


Pensaba que se hace esto por un problema de acceso a datos:

Los hilos comparten los datos estáticos del proceso, por lo que puede
haber problemas si más de un hilo accede a ellos simultáneamente. Para
compartir datos de esta manera hace falta algún tipo de cerrojo/semaforo.

Pensaba que los sistemas operativos suelen solventar ese problema
dejando un sólo thread simultáneo por proceso.

¿Pensaba mal?
Post by Martin J. Sanchez
Si te refieres a que no se usa mas de un procesador en un multi-hilo,
eso es por culpa de algunos SOs. como linux. Pero por ejemplo en
NT/2000 aprovecharas todos los procesadores.
Lo decía por Win9x, aunque quizá entendí mal lo que pone en la entrada
CreateThread del MSDN.
Martin J. Sanchez
2004-02-10 12:49:56 UTC
Permalink
On Tue, 10 Feb 2004 13:09:52 +0100, Mikel Irazabal
Post by Mikel Irazabal
Post by Martin J. Sanchez
Si te refieres a que no se usa mas de un procesador en un multi-hilo,
eso es por culpa de algunos SOs. como linux. Pero por ejemplo en
NT/2000 aprovecharas todos los procesadores.
Lo decía por Win9x, aunque quizá entendí mal lo que pone en la entrada
CreateThread del MSDN.
es que win9x no es mutiprocesador.

Un saludo,
Martin.
Manzanita
2004-02-11 00:19:09 UTC
Permalink
Post by Mikel Irazabal
Post by Martin J. Sanchez
Hombre si solo se acepta un hilo por proceso, entonces no estamos en
un sistema multi-hilo...
Lo que quería decir es que no se admiten más de un hilo ejecutándose en
un instante (en diferentes procesadores), pero si más de un hilo por
proceso.
Los hilos comparten los datos estáticos del proceso, por lo que puede
haber problemas si más de un hilo accede a ellos simultáneamente. Para
compartir datos de esta manera hace falta algún tipo de
cerrojo/semaforo.

Hola Mikel.

Al menos w2000 hace lo siguiente: cuando un procesador va a leer de
memoria, lee dependiendo de si es Alpha o intel 64 o 32 bytes. A éso se
le llama una línea de caché. Si el hilo escribe en esa línea de caché
todas las demás líneas de caché de los demás procesadores que están
accediendo al mismo dato quedan invalidadas y deben cargarse de nuevo.
Para solventar ésto en la medida de lo posible, puedes indicar al
compilador que alinee una variable en memoria según el tamaño de la cache
de línea (en vc++ es _declspec(align x)). Con ésto las escrituras en los
datos provocarán muchas menos invalidaciones de caché.

char i;
class _declspec(align 32) T {/*...*/} t;

Aquí una escritura en la variable t no provocará un invalidación en
otro procesador que esté leyendo el contenido de i.
Post by Mikel Irazabal
Pensaba que los sistemas operativos suelen solventar ese problema
dejando un sólo thread simultáneo por proceso.
¿Pensaba mal?
Pues no lo sé, desde luego un proceso debe tener al menos un
thread, pero como te han respondido ya, windows 2000 tiene soporte para
varios procesadores, y además cualquier hilo puede ejecutarse en
cualquier procesador.

Saludos.
Post by Mikel Irazabal
Post by Martin J. Sanchez
Si te refieres a que no se usa mas de un procesador en un multi-hilo,
eso es por culpa de algunos SOs. como linux. Pero por ejemplo en
NT/2000 aprovecharas todos los procesadores.
Lo decía por Win9x, aunque quizá entendí mal lo que pone en la entrada
CreateThread del MSDN.
Mikel Irazabal
2004-02-11 08:30:06 UTC
Permalink
Post by Manzanita
pero como te han respondido ya, windows 2000 tiene soporte para
varios procesadores, y además cualquier hilo puede ejecutarse en
cualquier procesador.
Entiendo. Gracias.

Mikel
José Luis
2004-02-10 14:09:35 UTC
Permalink
Post by Martin J. Sanchez
On Tue, 10 Feb 2004 10:29:29 +0100, Mikel Irazabal
Post by Mikel Irazabal
Por cierto, si mal no recuerdo, creo que en una aplicación multihilo, en
un momento dado, sólo puede haber un hilo por proceso, por lo que aunque
tu programa sea multihilo no aprovechará multiples procesadores. Para
eso deberías hacerlo multiproceso y usar memoria compartida.
Hombre si solo se acepta un hilo por proceso, entonces no estamos en
un sistema multi-hilo...
Si te refieres a que no se usa mas de un procesador en un multi-hilo,
eso es por culpa de algunos SOs. como linux. Pero por ejemplo en
NT/2000 aprovecharas todos los procesadores.
Caramba!, no sabía que se hubiera organizado un concurso de decir
barbaridades. A ver si a la próxima avisais antes, aunque no creo que
llegue nunca a vuestro nivel.

En dos palabras, tre-mendo.

Saludos aburmados
José Luis
Martin J. Sanchez
2004-02-10 16:35:55 UTC
Permalink
Post by José Luis
Post by Martin J. Sanchez
Si te refieres a que no se usa mas de un procesador en un multi-hilo,
eso es por culpa de algunos SOs. como linux. Pero por ejemplo en
NT/2000 aprovecharas todos los procesadores.
Caramba!, no sabía que se hubiera organizado un concurso de decir
barbaridades. A ver si a la próxima avisais antes, aunque no creo que
llegue nunca a vuestro nivel.
En dos palabras, tre-mendo.
Uy! perdon!.

El soporte smp de linux es una joya :-P

Y por cierto, eso de cambiar el follow a es.comp.lenguajes.c++ sin
avisar, no esta muy bien.

Un saludo,
Martin.
Tito
2004-02-13 19:57:33 UTC
Permalink
Post by Martin J. Sanchez
Si te refieres a que no se usa mas de un procesador en un multi-hilo,
eso es por culpa de algunos SOs. como linux. Pero por ejemplo en
NT/2000 aprovecharas todos los procesadores.
Que yo sepa, Linux no es multihilo. Corregidme si me equivoco, pues no soy
un experto en el tema.

Solaris, por ejemplo, si tiene un sistema de hilos propietario, que se puede
cubrir con su correspondiente API de hilos Posix.

Saludos,
Tito
znôrt
2004-02-10 18:30:00 UTC
Permalink
Post by Manzanita
Saludos.
Voy a empezar una aplicación de cálculo que quería dividir en varios
hilos. Algunas partes del algoritmo modifican los datos, otras partes sólo
leen y sé los mecanismos de sincronización que debo usar. Lo que no sé es
el criterio que debo seguir para dividir el cálculo en varios hilos. ¿
Debería hacer toda la aplicación en un sólo thread y luego dividirla según
vea el tiempo que tarda cada parte
Y cómo se supone que vas a hacer eso en ejecución? SI te entiendo bien
tú quieres reorganizar los hilos a tiempo real en función de unas
medidas ad hoc que vas haciendo. Lo veo complicadísimo. Normalmente,
cuando diseñas algo como un hilo, ya es en un hilo, hilo se queda, y
en ese mismo hilo se ejecuta, independientemente de las condiciones
del sistema en ese momento.

La "división" es altamente dependiente de lo que tu programa haga, y
eso no lo sabemos. Así que, unas simples ideas:

Lo primero que deberías plantearte es "porqué quieres dividir" el
algoritmo en hilos. Seguramente eso te sugerirá el cómo, es decir, te
conducirá hacia un diseño correcto. Debes ver cada hilo como una
unidad funcional de ejecución en tu programa, y hacerte a la idea de
que funcionan a su bola, es decir, en paralelo con los otros. Esto
puede ser una ilusión, pero conceptualmente es así.

En este sentido, lo que te puedo decir respecto a cómo organizar los
hilos es que si, puedes tener un hilo de escritura, otro de lectura, y
otro de cálculo, y seguramente otro de control. Es una forma posible,
a falta de más datos.

Hasta aquí la cuestión de diseño de los hilos.

Luego, hablas de carga de CPU o de disco. Eso en realidad tiene poco
que ver con hilos. Los hilos se usan para implementar una forma de
concurrencia, no para distribuir cargas de CPU, aunque esto puede ser
una aplicación de los hilos. Por supuesto, esto sólo tendría sentido
en un sistema con varios procesadores. Es el caso? Si es que si, dinos
qué plataforma, y ya veremos si sé contestarte :-)

Si es que no, recuerda que un procesador procesa en cada momento
exactamente 1 hilo de 1 proceso, así que difíclmente vas a poder
balancear cargas con eso ;-)

saludos
znôrt
César
2004-02-10 23:05:22 UTC
Permalink
Estoy de acuerdo con znort, el tipo de división que se haga depende y
debe ser diseñada para cada problema concreto.

Sin embargo, en problemas de cálculo "pesados" sí que se suelen dividir
éstos en varios hilos.
Por poner un ejemplo, en una multiplicación de matrices N*N se podrían
hacer N hilos que multiplicasen cada uno una fila de la matriz 1 por la
matriz
2. Es sólo un ejemplo, no me he parado a pensar mucho en la eficiencia.

También hay herramientas, como la librería MPI que te permite
repartir la carga entre varios procesadores; fue usada por ejemplo en Deep
Blue, la máquina que ganó a Kasparov y que tenía pila de procesadores,
para balancear un algoritmo de tipo minimax. En este caso también se
podría utilizar entre varios ordenadores conectados en red.

Respecto al problema de Linux, estoy casi seguro de que éste SO
sólo permite tener un hilo de un proceso ejecutándose a la vez, ya
que todos los hilos que crea un proceso forman parte del mismo.
No ocurre así con otras versiones de Unix que mapean cada hilo en un
proceso distinto.
Me parece que no me he explicado muy bien :) Tal vez habría que
postear la pregunta en un grupo de Linux.

Un saludo, César.
Tito
2004-02-13 20:17:22 UTC
Permalink
Post by César
Respecto al problema de Linux, estoy casi seguro de que éste SO
sólo permite tener un hilo de un proceso ejecutándose a la vez, ya
que todos los hilos que crea un proceso forman parte del mismo.
Por eso la biblioteca de hilos de Posix se implementa como "green threads"
(me parece que se llama así a esto, corregidme). Es el código del propio
hilo el que se encarga de la planificación de "hilos verdes". Lo que pienso
ahora es que, con este sistema, el código de estos hilos no deberían usar
llamadas que provoquen un bloqueo, ¿no?, porque entonces no sé cómo haría el
hilo para hacer la planificación... No sé si me explico...
Post by César
No ocurre así con otras versiones de Unix que mapean cada hilo en un
proceso distinto.
Solaris, por ejemplo.

Saludos,
Tito
RETECAL nos tima - MechaKaiser
2004-02-14 19:43:37 UTC
Permalink
Post by Tito
Post by César
Respecto al problema de Linux, estoy casi seguro de que éste SO
sólo permite tener un hilo de un proceso ejecutándose a la vez, ya
que todos los hilos que crea un proceso forman parte del mismo.
Por eso la biblioteca de hilos de Posix se implementa como "green
threads" (me parece que se llama así a esto, corregidme).
en mi libro de sistemas operativos habla de LWP lightweight process
Post by Tito
Es el código
del propio hilo el que se encarga de la planificación de "hilos
verdes". Lo que pienso ahora es que, con este sistema, el código de
estos hilos no deberían usar llamadas que provoquen un bloqueo, ¿no?,
porque entonces no sé cómo haría el hilo para hacer la
planificación... No sé si me explico...
Todos los hilos se bloquean. Desde este punto de vista, el sistema es una
mierda, salvo para usos concretos. Pero si hacemos que los hilos sean tb de
sistema (hilos de usuario y de sistema) quizás podamos ahorrarnos el
problema, como comentas más abajo con solaris
Post by Tito
Post by César
No ocurre así con otras versiones de Unix que mapean cada hilo en un
proceso distinto.
Solaris, por ejemplo.
Saludos,
Tito
José Luis
2004-02-14 21:40:37 UTC
Permalink
Post by Tito
Post by César
Respecto al problema de Linux, estoy casi seguro de que éste SO
sólo permite tener un hilo de un proceso ejecutándose a la vez, ya
que todos los hilos que crea un proceso forman parte del mismo.
Por eso la biblioteca de hilos de Posix se implementa como "green threads"
(me parece que se llama así a esto, corregidme). Es el código del propio
hilo el que se encarga de la planificación de "hilos verdes". Lo que
pienso ahora es que, con este sistema, el código de estos hilos no
deberían usar llamadas que provoquen un bloqueo, ¿no?, porque entonces no
sé cómo haría el hilo para hacer la planificación... No sé si me
explico...
Te explicas a medias pero hace por lo menos 67 años bisiestos que Linux dejó
de usar los green-threads. De hecho, la última vez que recuerdo haber
compilado con green-threads fué la libc.5.3.12 en el 96. Por entonces
salieron las primeras versiones de la linuxthreads que posteriormente
fueron incorporadas a la glibc. El soporte para "threads" fué metido en el
kernel 2.0, si la memoria no me falla, así que ya ha ce mucho tiempo.

Efectivamente, el problema de los green es que si un hilo se bloquea se
bloquean todos. Copio a continuación, un pequeño párrafo extraído de la
página 185 del libro "Sistemas Operativos" (4ª edición) de William
Stallings (lo mismo te lo podría decir yo, pero no quiero que nadie me
acuse de mentiroso o de desinformado, por eso recurro a algo que cualquiera
puede comprobar):

----------------------------------------
En Linux se crea un nuevo proceso copiando los atributos del proceso actual.
Un nuevo proceso puede ser "clonado" para que comparta recursos, como
archivos, gestores de señal o memoria virtual. Cuando dos procesos
comparten la misma memoria virtual, operan como hilos dentro de un único
proceso. Sin embargo, no hay definido un tipo de datos independiente para
un hilo. Así pues, Linux no diferencia entre hilo y proceso.
----------------------------------------

Esto significa básicamente, que así como otros sistemas tienen como unidad
básica de ejecución el thread, Linux tiene el proceso, y los threads son
solo un tipo "especial" de procesos. En cualquier caso, como un thread *ES*
un proceso, cualquier thread puede ir a parar a cualquier CPU disponible.
Esto sin tener en cuenta otras consideraciones de eficiencia, como la
afinidad de un thread a una CPU. De no ser así, el soporte de Java sería
penoso y la SMP daría poco juego.
Post by Tito
Post by César
No ocurre así con otras versiones de Unix que mapean cada hilo en un
proceso distinto.
Solaris, por ejemplo.
Esto si es un galimatías. Un thread en Solaris es un objeto susceptible de
ser planificado por el scheduler, mientras que el proceso mantiene la
noción de recursos asignados a él, sean del thread que sean. La diferencia
en Linux es la ya explicada: para el scheduler todo son procesos, aunque
compartan todos los recursos como si fueran threads.

Hasta Solaris 8 el sistema tenía un esquema más complejo y flexible de
threads, pero en la 9 ya han pasado a un esquema 1:1, lo mismo que se hace
en las nuevas librerías de threads para Linux con el kernel 2.6. Algunos
creadores de distribuciones han portado ese modelo al kernel 2.4 para sus
sistemas. Y programas tan gordos como Oracle, utilizan threads en Linux.

De todas formas, desde mi humilde punto de vista no hay sistema comparable
al esquema de Solaris que, técnicamente es el mejor. También es cierto que
el mismo Solaris que se ejecuta en una estación de trabajo Blade 100 se
instala y ejecuta en una Sun Fire 15K con 106 procesadores. Es decir, que
de SMP los señores de Sun saben un rato.....

Espero que hayan quedado claros algunos puntos para alegría de unos y
decepción de otros. ;)

Saludos
José Luis
Martin J. Sanchez
2004-02-16 05:25:57 UTC
Permalink
On Fri, 13 Feb 2004 21:17:22 +0100, "Tito"
Post by Tito
Post by César
Respecto al problema de Linux, estoy casi seguro de que éste SO
sólo permite tener un hilo de un proceso ejecutándose a la vez, ya
que todos los hilos que crea un proceso forman parte del mismo.
Por eso la biblioteca de hilos de Posix se implementa como "green threads"
(me parece que se llama así a esto, corregidme). Es el código del propio
hilo el que se encarga de la planificación de "hilos verdes". Lo que pienso
ahora es que, con este sistema, el código de estos hilos no deberían usar
llamadas que provoquen un bloqueo, ¿no?, porque entonces no sé cómo haría el
hilo para hacer la planificación... No sé si me explico...
Post by César
No ocurre así con otras versiones de Unix que mapean cada hilo en un
proceso distinto.
Solaris, por ejemplo.
Bien no estoy muy puesto en Linux, pero esto es lo que tengo entendido
respecto a su soporte de threads y en especial SMP:

En Linux existen dos tipos de threads: threads de espacio de usuario y
treads de espacio de kernel.

El soporte para threads de espacio de usuario, se realiza a traves de
una libreria de usuario que proporciona mecanismos de multitarea
cooperativa. Estas funciones provocan el cambio de ejecucion entre
las distintas tareas definidas dentro del proceso. Por ejemplo, un
thread puede enviar una señal provocando que un planificador provoque
un cambio de tarea, o un timer puede provocar que el planificador de
la ejecucion a un thread en algun otro momento. El cambio de tarea se
produce a traves de una simple manipulacion de pila, por que solo se
realiza dentro de determinados contextos. con lo que el costo de
conmutacion de tarea es bajo.
El kernel no tiene conocimiento de estos threads. Si un thread no cede
el control, no se producira la conmutacion de tarea. Ademas si un
thread de usuario se bloquea en la espera de algun recurso, el bloqueo
se produce para todos los threads dentro del proceso. Tambien debido a
esto, estos threads no correran de forma simultanea en mas de una CPU,
aunque haya mas de una CPU disponible.
Creo recordar, que los pthreads en Linux se implementan con threads de
usuario.

Los threads de espacio de kernel de linux, se parecen mas a los
threads de NT o Solaris, proporcionan multi-tarea pre-emptive y se
aprovechan de arquitecturas multi-procesador. Sin embargo en Linux se
opto por una solucion un tanto extraña. El cambio consistio en
proporcionar una version de fork en la que se duplicaba el proceso y
se podia especificar que recursos se compartian con el proceso padre,
dando lugar a un modelo sencillo de implementar, pero lento y menos
flexible. Por ejemplo, la conmutacion a un thread de espacio de kernel
(un proceso mas en linux), implica un cambio del contexto entero de
proceso. De la misma forma. un thread de este tipo no tiene capacidad
para definir la afinidad de procesador u otras cualidades que se
observan en sistemas donde los threads poseen su propia identidad.
El planificador de Linux se encarga de repartir el trabajo procurando
evitar cambios de CPU que provoquen demasiada carga.

Linux ha introducido soporte para SMP en el kernel 2.0. El problema es
que para evitar incosistencias en sus estructuras internas, un sistema
central de bloqueo impedia a distintos procesos entrar en modo kernel
a la vez, y esto aunque las tareas fuesen compatibles (un proceso
espere una lectura de disco y otro por ejemplo envie datos a la
pantalla o a la red). Asi que el kernel secuencia los accesos de los
procesos al entrar en el, independientemente de lo que hagan. Algunos
defensores a ultranza de Linux mantenian que esto no era tan
importante por que el bus PCI ya estaba suficientemente ocupado ;-),
pero el caso es que solo se aprovechaban los multiples procesadores si
un programa estaba haciendo calculo intensivo sin acceder a nada mas.

El problema se ha resuelto en parte a partir de la 2.1 del kernel, se
mejoro el mecanismo de bloqueo, y aqui las interrupciones, manejadores
de señales, y algunas rutinas de I/O tienen sus propios bloqueos. Pero
esto tiene todavia que mejorar mucho, y es culpa sobre todo de una
arquitectura monolitica e insuficiente granularidad.

En NT la unidad de ejecucion es el thread. Todos los threads son
objetos gestionables por el kernel, proporcionado multitarea
pre-emptive con lo que se evita que un thread acapare el uso del
procesador. Ya que NT soporta SMP, el planificador repartira los
threads entre los procesadores disponibles (aunque un thread puede
definir una afinidad de procesador, la cual especifica en que
procesador ejecutar el thread).
Un proceso se compone de uno o varios threads y una serie de recursos
asignados y compartidos por los threads del mismo proceso. Un thread
puede definir atributos de forma independiente al proceso y a otros
threads.
En NT el concepto de threads de usuario de Linux se implementa a
traves de fibras. Y al igual que en Solaris, existen APIs que permite
mapear fibras a theads.

En Solaris, se combinan threads de usuario y threads de kernel. El
sistema mapea un grupo de threads de usuario en threads del kernel.
Una comparativa entre este sistema y el de NT se puede encontrar en:
http://www.usenix.org/publications/library/proceedings/usenix-nt98/full_papers/zabatta/zabatta_html/zabatta.html

Aqui sin embargo no se tiene en cuenta librerias que bajo NT hace
exactamente lo mismo: mapear fibras en threads.

Un saludo,
Martin

Manzanita
2004-02-10 23:57:29 UTC
Permalink
Post by znôrt
Post by Manzanita
Saludos.
Voy a empezar una aplicación de cálculo que quería dividir en varios
hilos. Algunas partes del algoritmo modifican los datos, otras partes
sólo leen y sé los mecanismos de sincronización que debo usar. Lo que
no sé es el criterio que debo seguir para dividir el cálculo en varios
hilos. ¿ Debería hacer toda la aplicación en un sólo thread y luego
dividirla según vea el tiempo que tarda cada parte
Y cómo se supone que vas a hacer eso en ejecución? SI te entiendo bien
tú quieres reorganizar los hilos a tiempo real en función de unas
medidas ad hoc que vas haciendo. Lo veo complicadísimo. Normalmente,
cuando diseñas algo como un hilo, ya es en un hilo, hilo se queda, y
en ese mismo hilo se ejecuta, independientemente de las condiciones
del sistema en ese momento.
Los compiladores suelen traer instrucciones para saber el tiempo
transcurrido entre un conjunto de instrucciones, había pensado en
realizar la aplicación en un solo hilo para ver estos tiempos y poder
repartir la carga de forma equilibrada en varios hilos. Después añadiría
todos los objetos de sincronización.
Post by znôrt
La "división" es altamente dependiente de lo que tu programa haga, y
Lo primero que deberías plantearte es "porqué quieres dividir" el
algoritmo en hilos. Seguramente eso te sugerirá el cómo, es decir, te
conducirá hacia un diseño correcto. Debes ver cada hilo como una
unidad funcional de ejecución en tu programa, y hacerte a la idea de
que funcionan a su bola, es decir, en paralelo con los otros. Esto
puede ser una ilusión, pero conceptualmente es así.
En este sentido, lo que te puedo decir respecto a cómo organizar los
hilos es que si, puedes tener un hilo de escritura, otro de lectura, y
otro de cálculo, y seguramente otro de control. Es una forma posible,
a falta de más datos.
Pues se trata del cálculo de las soluciones de un sistema no lineal
por el método de Newton-Rapshow para un programa de electricidad, había
pensado en tener varios hilos para:

+ La representación de gráficos mientras se realiza el algoritmo.
+ Un hilo que se encargue de los eventos de usuario.
+ Varios hilos de cálculo para la estabilidad del algoritmo,
cálculo de coeficientes, etc. Por supuesto ésto se podría realizar en un
sólo hilo, pero quiero aplicar lo que he leído de sincronización de
hilos.

Lo de el hilo de escritura, lectura y control no lo entiendo bien,
si se trata de un so con soporte smp, un hilo de escritura podría
invalidar las caches de las restantes cpus. Así que si te entiendo bien,
piensas que se deberían distribuir los hilos no según su tiempo de
proceso sino según su cometido. Pero ésto, en un sistema monoprocesador,
¿no disminuiría el rendimiento si la carga de cpu en cada hilo fuese muy
distinta?.
Post by znôrt
Luego, hablas de carga de CPU o de disco. Eso en realidad tiene poco
que ver con hilos. Los hilos se usan para implementar una forma de
concurrencia, no para distribuir cargas de CPU, aunque esto puede ser
una aplicación de los hilos. Por supuesto, esto sólo tendría sentido
en un sistema con varios procesadores. Es el caso? Si es que si, dinos
qué plataforma, y ya veremos si sé contestarte :-)
Es para windows 2000 profesional, así que, como ves, sólo es un
procesador. Pero me gustaría realizarla en varios hilos para probrarla en
otros sitios y comparar los resultados. Y porque creo que el algoritmo en
sí y el programa se adaptan bien para ser realizados en varios hilos.
Post by znôrt
Si es que no, recuerda que un procesador procesa en cada momento
exactamente 1 hilo de 1 proceso, así que difíclmente vas a poder
balancear cargas con eso ;-)
Si la carga está mal repartida, los hilos no consumirán su time-
slice y quedarán suspendidos en la llamada a una función de
sincronización (WaitForSingleObject, WaitForMultipleObject), supongo que
éso afectará al rendimiento (empeorándolo) debido al mayor número de
cambios de contexto, ¿no?.

Gracias y un saludo.
Tito
2004-02-13 20:35:04 UTC
Permalink
Post by Manzanita
Post by znôrt
Post by Manzanita
Saludos.
Voy a empezar una aplicación de cálculo que quería dividir en varios
hilos. Algunas partes del algoritmo modifican los datos, otras partes
sólo leen y sé los mecanismos de sincronización que debo usar. Lo que
no sé es el criterio que debo seguir para dividir el cálculo en varios
hilos. ¿ Debería hacer toda la aplicación en un sólo thread y luego
dividirla según vea el tiempo que tarda cada parte
Y cómo se supone que vas a hacer eso en ejecución? SI te entiendo bien
tú quieres reorganizar los hilos a tiempo real en función de unas
medidas ad hoc que vas haciendo. Lo veo complicadísimo. Normalmente,
cuando diseñas algo como un hilo, ya es en un hilo, hilo se queda, y
en ese mismo hilo se ejecuta, independientemente de las condiciones
del sistema en ese momento.
No lo veo tan complicado. Si puedes repartir partes del trabajo (datos de
entrada) entre hilos, y piensas un mecanismo de control, que vaya creando o
destruyendo hilos dinámicamente según el rendimiento que se obtenga, no
debería ser demasiado difícil.

De todos modos, en el caso de cálculo intensivo, sin bloqueos de
entrada/salida, no tiene sentido utilizar más hilos de ejecución que cuantos
procesadores de dispone, claro.
Post by Manzanita
Los compiladores suelen traer instrucciones para saber el tiempo
transcurrido entre un conjunto de instrucciones, había pensado en
realizar la aplicación en un solo hilo para ver estos tiempos y poder
repartir la carga de forma equilibrada en varios hilos. Después añadiría
todos los objetos de sincronización.
Post by znôrt
La "división" es altamente dependiente de lo que tu programa haga, y
Lo primero que deberías plantearte es "porqué quieres dividir" el
algoritmo en hilos. Seguramente eso te sugerirá el cómo, es decir, te
conducirá hacia un diseño correcto. Debes ver cada hilo como una
unidad funcional de ejecución en tu programa, y hacerte a la idea de
que funcionan a su bola, es decir, en paralelo con los otros. Esto
puede ser una ilusión, pero conceptualmente es así.
En este sentido, lo que te puedo decir respecto a cómo organizar los
hilos es que si, puedes tener un hilo de escritura, otro de lectura, y
otro de cálculo, y seguramente otro de control. Es una forma posible,
a falta de más datos.
Pues se trata del cálculo de las soluciones de un sistema no lineal
por el método de Newton-Rapshow para un programa de electricidad, había
+ La representación de gráficos mientras se realiza el algoritmo.
+ Un hilo que se encargue de los eventos de usuario.
+ Varios hilos de cálculo para la estabilidad del algoritmo,
cálculo de coeficientes, etc. Por supuesto ésto se podría realizar en un
sólo hilo, pero quiero aplicar lo que he leído de sincronización de
hilos.
En cuanto a los hilos que se encargan de la E/S, totalmente de acuerdo. Por
cierto, no está de más que el hilo de representación de gráficos y de
eventos de usuario sea el mismo si comparten componentes gráficos...

En cuanto a los hilos que se encargan del cálculo: Si es por hacer un
ejercicio de programación concurrente, vale. Si es por practicidad no lo
hagas si no dispones de varios procesadores.
Post by Manzanita
Lo de el hilo de escritura, lectura y control no lo entiendo bien,
si se trata de un so con soporte smp, un hilo de escritura podría
invalidar las caches de las restantes cpus. Así que si te entiendo bien,
piensas que se deberían distribuir los hilos no según su tiempo de
proceso sino según su cometido. Pero ésto, en un sistema monoprocesador,
¿no disminuiría el rendimiento si la carga de cpu en cada hilo fuese muy
distinta?.
Post by znôrt
Luego, hablas de carga de CPU o de disco. Eso en realidad tiene poco
que ver con hilos. Los hilos se usan para implementar una forma de
concurrencia, no para distribuir cargas de CPU, aunque esto puede ser
una aplicación de los hilos.
Pero bueno, ya estamos otra vez con las paradojas, ¿znôrt?
Hay que ver cómo te mola llevarte la contraria a ti mismo, y dentro de la
misma frase. Dices:
"Los hilos no se usan para distribuir cargas de CPU, aunque esto puede ser
una aplicación de los hilos".
Mi no entenderrrr... ???
Post by Manzanita
Post by znôrt
Por supuesto, esto sólo tendría sentido
en un sistema con varios procesadores. Es el caso? Si es que si, dinos
qué plataforma, y ya veremos si sé contestarte :-)
Es para windows 2000 profesional, así que, como ves, sólo es un
procesador. Pero me gustaría realizarla en varios hilos para probrarla en
otros sitios y comparar los resultados. Y porque creo que el algoritmo en
sí y el programa se adaptan bien para ser realizados en varios hilos.
Si puedes hacer el experimento de correr tu aplicación en sistemas
multiprocesador, ánimo y al toro.
Piensa como dividir tu problema en hilos y ponte a ello.
Post by Manzanita
Post by znôrt
Si es que no, recuerda que un procesador procesa en cada momento
exactamente 1 hilo de 1 proceso, así que difíclmente vas a poder
balancear cargas con eso ;-)
¿Por qué?

Por cierto, y disculpas si ya me estoy poniendo demasiado puntualizador:
"equilibrar", y no "balancear".
Me gustan muy poco los false friends.
Post by Manzanita
Si la carga está mal repartida, los hilos no consumirán su time-
slice y quedarán suspendidos en la llamada a una función de
sincronización (WaitForSingleObject, WaitForMultipleObject), supongo que
éso afectará al rendimiento (empeorándolo) debido al mayor número de
cambios de contexto, ¿no?.
Sígue contándonos tus avances... ¿En qué tipo de arquitectura paralela vas a
correr tu aplicación?

Por cierto, no me he puesto a buscar en Google, pero puedes mirarte por ahí
a ver qué te cuentan del esquema clásico de programación concurrente que, si
no recuerdo mal, se llama "Master-Workers" o algo así. Seguro que te
aportará ideas.

Saludos,
Tito
Loading...