![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Delphi puede. Pero hay un limite fisico de cuantos es posiles por nucleo, y otra cosa muy distinta es que tan facil sea de hacerlo. Comparado con lenguajes con soporte nativo a todo esto (ej: Erlang, que puede hacer miles por thread) ir mas alla de 3/4 empieza a ponerse bien dificil - mas si hay que meterle locks y todo eso-
Es como todo. Uno puede hacer OO con C plano, pero no es tan simple que con un lenguaje OO. Uno puede hacer programacion funcional con C plano, pero se llegan a limites tecnicos y de estilo...
__________________
El malabarista. |
#2
|
||||
|
||||
Me he perdido? Dices que delphi no soporta de forma nativa los threads?
![]() Hombre, mas facil que crear un Objeto y asignarle que sea de tipo Thread en delphi... no se, no me parece muy dificil XD. A parte de eso, lo de los 48 nucleos no es tan grande ni tan potente ni tan moderno ni tan dificil de programar. Existen las GPUs que se pueden programar desde hace un par de años, y esas tienen mas de 48 nucleos XD.
__________________
Donde Trabajo ahora --> http://cct-inc.co.jp/ |
#3
|
||||
|
||||
No he dicho que no soporta, sino que delphi (al igual que java, c#, c++, etc) tiene un soporte complejo y/o pobre al respecto.
El manejo tradicional de threads es muy similar al de la memoria manual. Hay que preocuparse por un montón de cosas (como hacer locks, evitar deadlocks, liberar y asignar recursos, etc) y en general, su API/librería son incompatibles con multihilos (ie: VCL, o librerías de bases de datos, etc). Esto implica que 1)Es algo que rara vez lo usan los programadores 2)Introducirlo en un proyecto tiende a ser para un caso puntual y limitado 3)Es muy difícil hacer un código de estos sin errores y de alto desempeño y 4) Hay que saber elegir y usar el codigo compatible o reescribir y cambiar porciones para poder lograrlo. En apariencia, es Cita:
__________________
El malabarista. |
#4
|
||||
|
||||
Definitivamente no XD.
Todos esos "problemas" y ese "monton de cosas que hay que hay que hacer" que dices que hay que hacer son exactamente los mismos que a la programación para un solo núcleo XD. No me digas que los Threads es algo que rara vez usamos los programadores... eso seria hace 10 años.... Porque cualquier tarea compleja que no se haga en segundo plano con un Thread te va a congelar la ventana, cosa que a los usuarios no les gusta mucho la verdad... Por no hablar de interconexion a varias bases de datos en distintas webs (un thread por cada conexion), o de un server (un thread por cada socket), etc... Cita:
Cita:
Cita:
Cita:
Todo ello te lo resumo de forma facil para que veas que se puede usar y hacer: SKYPE Si no sabes a que me refiero, mirate el club por informacion de skype ![]()
__________________
Donde Trabajo ahora --> http://cct-inc.co.jp/ |
#5
|
||||
|
||||
No se porque el foro no permite la edicion de un post :S
Bueno, que eso, que no te lo tomes a mal mi respuesta. Que ya se sabe que los post son muy impersonales y no llevan sentimientos ni como esta dicho y demas y la gente se lo puede tomar a mal XD
__________________
Donde Trabajo ahora --> http://cct-inc.co.jp/ |
#6
|
||||
|
||||
No se permite modificar pasado 30 minutos. Puedes escribir un nuevo post si lo necesitas.
|
#7
|
||||
|
||||
Cita:
Algunos articulos sobre el tema: (Este fue el primer campanazo del que me entere) http://www.gotw.ca/publications/concurrency-ddj.htm (Nota que esta es una discusion de porque los Threads son considerados como dañinos, y que en general se deben evitar de ser posible) http://c2.com/cgi/wiki?ThreadsConsideredHarmful Cita:
Me arriesgare a suponer que lo de multi-hilos, por los comentarios que expones, se concentra en hacer un GUI que no se congele y no se va mas lejos que tener unas pocas tareas, y que esto ademas, es ppalmente programar asíncronamente, ej: Ejecuta este SQL en este hilo, voy haciendo otras cosas, luego recibo el resultado y actualizo la GUI. Este es el modelo mas común ahora y mas simple de todos (en cuanto a tener multihilos). De hecho, es un modo de programación simple porque todo lo asincrónico se puede escribir sequencial, se puede colocar en un queue y es solo cosa de tener callbacks y todo eso. Es ligeramente mas difícil que la secuencial, pero no mas difícil que la programación por eventos. Cita:
http://www.futurechips.org/tips-for-...ogramming.html La programacion multi-hilos/cores implica: 1- Una cosa es poder lanzar n-tareas en un hilo/proceso aparte, y esperar su resultado (osea asincrónico y relativamente facil). Este modelo tiende a ser ineficiente porque no utiliza los cores de la CPU de forma optima. Es una derivacion de la programacion sequencial, ligeramente dificil de depurar y de hacer bien (con 1-4 tareas de fondo, pan comido, una vez empiezas a tener decenas, cientos.....) 2- La capacidad de paralelizar una tarea (ie: si tarea A toma 100sec con 1 core, deberia tomar 25secs con 4). Jodidamente difícil de hacer a veces, porque por razones físicas y teóricas un montón de cosas no se pueden paralelizar. 3- Comunicacion y coordinacion entre tareas. AQUI es donde estan, por mucho, los ppales dolores de cabeza. Dependiendo de la dificultad de esa comunicacion, y de cuantos bloqueos hayan, sera mas o menos dificil de hacer y depurar 4-Limpieza de tareas y recursos vivos. Matar hilos es cosa maluca, y complicada de hacer correctamente bien. Cita:
http://synopse.info/forum/viewtopic.php?id=57 Obvio, ese es lo que ven quienes hacen a synapse, no quienes lo usan. El problema es que cuando los que lo usan empiezan a subir de nivel, se van a enfrentar a problemas para los cuales no están preparados. Esto no es especifico de Delphi. Con obj-c/Coccoa que tiene un soporte superior para este paradigma, es casi igual de dificil. Lo mismo C#, y Java, etc. El principal problema es de la comunicacion, y el manejo de estado http://gregbeech.com/blog/threading-...-state-is-hard Cuando se hace programación asincrónica, quizás no se tope uno con eso, porque se envia el objeto/datos a la tarea de fondo y se recibe otro objeto/datos (o no se modifica por fuera de la tarea) y por eso todo sale fácil. ------------------------------------------------ Hasta aquí todavía puede que uno se sacuda la cabeza y no le vea el alboroto a todo esto, aparte de unos cuantos tipos que dicen que es difícil, pero que a uno no le parece tanto. Es como todo. Cuando lo que se usa en assembler uno no le ve cual es la gracia de un lenguaje de mayor nivel. Cuando obj-c gano la posibilidad de no manejar manualmente la memoria, había un MONTON de gente que decía "y que problema hay con hacerlo manual?" y así por el estilo. Existe un limite a cuantos threads se pueden crear (http://blogs.technet.com/b/markrussi...8/3261309.aspx =55,000 en 64bits) aunque realistamente es MUCHO menor. En contraste, algo como erlang puede manejar 268'435.456.
__________________
El malabarista. |
#8
|
||||
|
||||
matabyte,
Todo lo que comenta mamcx es lo que yo siempre he tenido entendido del manejo de Threads, sin embargo me llama mucho la atención el siguiente comentario: Cita:
2- ¿Con que criterio selecciono un núcleo del procesador sobre otro en Delphi en programación Multi-Threads?. Gracias de antemano ![]() Nelson. |
#9
|
||||
|
||||
La funcion para elegir la mascara de afinidad (AffinityMask) O elegir el núcleo que deseas que utilice un Thread es el siguiente:
SetProcessAffinityMask Ejemplos tienes bastantes: http://edn.embarcadero.com/article/27267 http://stackoverflow.com/questions/9...-one-processor http://msdn.microsoft.com/es-es/libr...=vs.85%29.aspx etc... El criterio de uso depende del programa/aplicación que estés programando, cada programa es un mundo! ![]() Y si no, siempre puedes lanzar tus threads sin la mascara de afinidad y que se ocupe el OS de repartir entre los núcleos disponibles los Threads. Ultimamente los OS realizan bien esa tarea ![]() Y Si, he usado bastante los multi-nucleos con multi-threads para procesar grandes cantidades de datos de forma paralela durante meses y meses. ![]() Si bien hay un limite a lo que puedes "exprimir" a los núcleos: -Por muchos nucleos y procesos que lances, la suma de los datos de todos ellos en un momento dado no podrá superar la velocidad maxima de tu memoria y/o disco duro, por lo que para computo de datos tiene el limite del disco duro y/o memoria. -La sincronizacion de los datos de todos los Threads requiere un tiempo (a menos que sean procesos totalmente independientes, en ese caso estaríamos hablando ya de programas individuales lanzados por otro programa...). Por desgracia, por mucho que aumenten los nucleos creo que poco vamos a notar si no se pre-cargan los datos a memoria (en cuyo caso el tiempo de carga disminuye el performance total de tener tantos nucleos). Vamos, volviendo al inicio del post, me parece una tonteria 48 nucleos a menos que los vayas a usar para algo como prediccion del tiempo o simulaciones matemáticas. El tamaño que tendrías que tener de memoria RAM para aprovechar esa cantidad de núcleos yo lo pondría por los 100Gb para que tuviera un buen rendimiento. Mas núcleos si, pero si no los usamos correctamente es una perdida de energía tremenda ![]() ![]()
__________________
Donde Trabajo ahora --> http://cct-inc.co.jp/ |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
procesadores de tres nucleos de AMD | gmontes | Noticias | 10 | 18-01-2008 06:00:05 |
Windows tiene problemas para gestionar procesadores con varios núcleos | Casimiro Notevi | Noticias | 19 | 29-05-2007 20:19:52 |
Apple vende los primeros Mac con procesador intel | gmontes | Noticias | 0 | 12-01-2006 16:55:10 |
![]() |
|