Foro sobre Java SE > Hardware para desarrollo ligero
Un excelente tutorial sobre concurrencia. En su introducción aclara tus dudas sobre el uso de múltiples núcleos.
http://tutorials.jenkov.com/java-concurrency/index.html
Muchas gracias por el enlace. Aparentemente, el autor afirma que los distintos hilos de Java usan múltiples núcleos, sin entrar en muchos más detalles. La falta de detalles me mosquea, :-) y decidí buscar por si había algo más concretos sobre el tema... ¡y vaya si hay! Lo de Stackoverflow es la leche, encuentras de todo ahí. :-)
De todo lo que encontré, esto es lo que más completo me pareció:
http://stackoverflow.com/questions/1223072/how-do-i-optimize-for-multi-core-and-multi-cpu-computers-in-java
Hay varias respuestas interesantes. La primera introduce cuestiones relacionadas con la sobrecarga debido al cambio de contexto y los problemas de usar varios hilos con operaciones de E/S. Otra pone de relevancia que algunos sistemas operativos intentan mantener en el mismo core los distintos hilos de una misma aplicación, para que se beneficien del mismo espacio de caché, por ejemplo. Finalmente, otro establece que no es posible decirle a Java que intente dividir las tareas entre distintos núcleos, salvo usando JNI.
O sea, que sobre el papel sí, usa múltiples núcleos, pero en la práctica, hay que afinar mucho para que la ganancia sea efectiva. Luego hay otras cuestiones más allá de Java, que son, que no sólo hay que fijarse en Java (o nuestra preocupación principal de turno); el SO, los controladores, los servicios, el antivirus en caso de Windows, etc. tienen procesos que también se tienen que distribuir por los núcleos de la CPU.
Total, que con todo el dolor de mi corazón voy a tener que centrarme en Intel, porque el rendimiento single-core va a seguir siendo importante. Muchas gracias por la ayuda.
Quiero cambiarle las tripas a un PC con diez años (voy a hacer como con los edificios históricos, le dejo la fachada/caja pero le cambio todo lo de dentro). :-) El motivo principal es que ahora estoy usando un portátil y cojo muy malas posturas.
Al gabinete de una PC de 10 años tendrás que cambiar también la fuente de poder. Mejor reemplaza todo el equipo.
Me encantaría que los AMD Kaveri y su arquitectura de memoria unificada (CPU y GPU comparten el mismo espacio de direccionamiento de memoria) triunfaran, pero lo que he visto es que en multicore llegan a estar más o menos al mismo nivel que un Intel de precio similar, pero en single core se estrellan.
Usualmente la diferencia mas significativa entre procesadores modernos de AMD y de Intel es la capacidad de realizar operaciones matemáticas con números enteros. Por esa razón se recomiendan CPUs Intel para equipos pensados para "gaming". Si el equipo que quieres armar lo ocupas para desarrollo, probablemente no sea gran diferencia que uses un CPU AMD o uno Intel.
Como es posible que, con el tiempo, las otras virtudes de la arquitectura comiencen a ser aprovechadas por los SO, si Java va a usar multicore extensivamente, tiraría por una configuración AMD, quizá con un procesador discreto de momento que funcione en una placa base preparada para los nuevos recién lanzados y más adelante actualizaría; en cambio, si Java va a usar sobre todo single core, tendré que irme a un Intel Core i3 o i5 (ya digo que ni por presupuesto ni por necesidad le veo sentido a apuntar alto).
Java puede emplear múltiples núcleos, pero no lo hace mágicamente. Tendrás que escribir tus programas para que utilicen múltiples hilos de programción. Las aplicaciones Swing por naturaleza son multi-threaded (ejm. Event-Dispatch Thread), pero adicionalmente tendrás que generar tus propios threads de procesamiento (usualmente) en un SwingWorker.
En el portátil ahora mismo uso un Intel Core i5-460M (de la primera generación de los Core i), y aunque en general va bien, algunos procesos como abrir los formularios en el GUI Builder de NetBeans podrían ser más rápidos. Lógicamente, no quiero perder rendimiento. Por ello, cualquier comentario sobre experiencias recientes sería bienvenido.
Lo que verdaderamente te dará un "boost" en el performance será un disco duro de estado sólido, pero no lo compres TLC (triple level cell). Estos son mas baratos, pero te puede durar menos.
Hay varias respuestas interesantes. La primera introduce cuestiones relacionadas con la sobrecarga debido al cambio de contexto y los problemas de usar varios hilos con operaciones de E/S
Los procesadores con tecnología Hyper-Threading te dan mas o menos un 30% de incremento en el performance precisamente minimizando el impacto del cambio de contexto entre hilos. El procesador con HT cuenta con ciertas partes duplicadas, pero en realidad no alcanzan a ser dos núcleos independientes. Esto le permite cargar un thread en cada núcleo virtual, pero solamente ejecuta uno. Cuando un de los threads entra en estado suspendido o bloqueado, rápidamente se pasa a atender al otro sin tener que hacer el cambio de contexto desde RAM.
Finalmente, otro establece que no es posible decirle a Java que intente dividir las tareas entre distintos núcleos, salvo usando JNI
Lo que no puedes hacer es decirle a la JVM en cual núcleo o en cual procesador (en caso de una arquitectura NUMA) quieres ejecutar tu thread. A menos que estés escribiendo una aplicación donde el rendimiento sea muy crítico, no tiene caso meterse en este problema. Es mejor dejar que el sistema operativo maneje esto.
Otra pone de relevancia que algunos sistemas operativos intentan mantener en el mismo core los distintos hilos de una misma aplicación, para que se beneficien del mismo espacio de caché, por ejemplo.
Eso se conoce como "processor affinity". Para que te des una idea, productos como DB2 te permiten configurar en que núcleos deseas que se ejecute el sistema, para aprovechar ésta característica.
Total, que con todo el dolor de mi corazón voy a tener que centrarme en Intel, porque el rendimiento single-core va a seguir siendo importante
what?
Guenas.
Francamente dudo que tengas que llegar a estos extremos.
Deja que el SO decida donde, como y cuando ejecuta sus hilos.
Si quieres hacer una aplicación eficaz a nivel de paralelismo el tema de donde se ejecute te la suda. Es tu código el que va a permitir que se aproveche, y no tiene nada que ver con la gestión a bajo nivel de hilos, algo que jamas deberías intentar porque te prometo que sabes menos (desde luego yo también) que los que han escrito el SO.
Tus concepciones de intel vs AMD me parecen como mínimo estrambóticas. Creo que vas extremadamente confundido al respecto. Cada uno tiene sus cosas, pero lo que comentas, francamente, no tiene sentido.
Un saludo
PD.
Considerar mejor compartir la RAM entre video y proceso me parece demencial, pero esto es solo mi opinión.
Hola,
En breve, ¿Java usa multicores cuando hay varios threads en entornos Java SE como aplicaciones Swing o el mismo NetBeans? Si es así, ¿a igualdad de precio y con vistas a poder renovar la CPU pronto, tendría sentido ir a por un AMD frente a un Core i3-5? Más detalles a continuación.
Quiero cambiarle las tripas a un PC con diez años (voy a hacer como con los edificios históricos, le dejo la fachada/caja pero le cambio todo lo de dentro). :-) El motivo principal es que ahora estoy usando un portátil y cojo muy malas posturas.
Lo que voy a hacer con él es de usuario típico, excepto que tendré algunas máquinas virtuales para pruebas (pero sin uso continuo). Y además, por eso escribo aquí, :-) lo voy a usar para desarrollar una aplicación Java SE Swing de unas 50.000 líneas. Le voy a poner 8 GB de RAM, eso está claro, pero mi duda va por la CPU.
Me encantaría que los AMD Kaveri y su arquitectura de memoria unificada (CPU y GPU comparten el mismo espacio de direccionamiento de memoria) triunfaran, pero lo que he visto es que en multicore llegan a estar más o menos al mismo nivel que un Intel de precio similar, pero en single core se estrellan.
Como es posible que, con el tiempo, las otras virtudes de la arquitectura comiencen a ser aprovechadas por los SO, si Java va a usar multicore extensivamente, tiraría por una configuración AMD, quizá con un procesador discreto de momento que funcione en una placa base preparada para los nuevos recién lanzados y más adelante actualizaría; en cambio, si Java va a usar sobre todo single core, tendré que irme a un Intel Core i3 o i5 (ya digo que ni por presupuesto ni por necesidad le veo sentido a apuntar alto).
En el portátil ahora mismo uso un Intel Core i5-460M (de la primera generación de los Core i), y aunque en general va bien, algunos procesos como abrir los formularios en el GUI Builder de NetBeans podrían ser más rápidos. Lógicamente, no quiero perder rendimiento. Por ello, cualquier comentario sobre experiencias recientes sería bienvenido.
Muchas gracias por anticipado.