133 votos

¿Qué significa "multinúcleo" el lenguaje ensamblador?

Érase una vez, para escribir en ensamblador x86, por ejemplo, tendría instrucciones que indica "la carga de la EDX registro con el valor 5", "incremento de la EDX" registro, etc.

Con las Cpu modernas, que tiene 4 núcleos (o incluso más), en el código de la máquina nivel no se acaba de ver como hay 4 CPUs separadas (es decir, hay 4 distintos "EDX" registros) ? Si es así, cuando usted dice que "el incremento de la EDX registro", lo que determina que la CPU del registro EDX se incrementa? Hay un "contexto de CPU" o "hilo" concepto en ensamblador x86 ahora?

¿Cómo funciona la comunicación/sincronización entre los núcleos de trabajo?

Si estuviera escribiendo un sistema operativo, ¿qué mecanismo se expone a través de hardware para permitir la ejecución del programa en los diferentes núcleos? Es un poco especial privilegiados de la instrucción(s)?

Si estuviera escribiendo un compilador de optimización/bytecode de VM para una CPU de varios núcleos, lo que usted necesita saber específicamente sobre, por ejemplo, x86 a hacer es generar el código que se ejecuta de manera eficiente en todos los núcleos?

Podría resumir mi pregunta como "¿Qué cambios se han hecho para x86 código máquina para soporte de multi-núcleo de la funcionalidad?"

Disculpas que esta pregunta no es muy clara.

75voto

Nathan Fellman Puntos 31310

Esto no es una respuesta directa a la pregunta, pero es una respuesta a una pregunta que aparece en los comentarios. Esencialmente, la cuestión es lo que admite el hardware da para multi-threaded operación.

Nicolás Flynt era la correcta, al menos con respecto a la arquitectura x86. En una de múltiples subprocesos medio ambiente (Hyper-threading, multi-core o multi-procesador), el Bootstrap hilo (generalmente hilo de 0 en el core 0 en el procesador 0) se inicia la captura de código de dirección 0xfffffff0. Todos los otros hilos iniciar en un especial estado de sueño llamado Esperar-para-SIPI. Como parte de la inicialización, el subproceso principal envía un especial inter-procesador-de interrupción (IPI) a través de la APIC llamado un SIPI (Inicio, IPI) para cada subproceso que está en la CMA. El SIPI contiene la dirección desde la que se que el hilo debe iniciar la busqueda de código.

Este mecanismo permite que cada hilo de ejecutar el código desde una dirección diferente. Todo lo que se necesita es un software de apoyo para cada subproceso para establecer sus propias tablas y colas de mensajes. El sistema operativo utiliza esos de hacer un verdadero multi-threaded programación.

En cuanto al montaje se refiere, como Nicolás escribió, no hay ninguna diferencia entre los conjuntos de un solo subproceso o de múltiples subprocesos de la aplicación. Cada lógico hilo tiene su propio conjunto de registro, por lo que escribir:

mov edx, 0

sólo se actualizará EDX para el subproceso que se está ejecutando. No hay ninguna manera de modificar EDX en otro procesador con un único conjunto de instrucciones. Necesitamos algún tipo de sistema de llamar para pedir el sistema operativo para decirle a otro hilo a ejecutar el código que actualizará su propia EDX.

30voto

Nicholas Flynt Puntos 2832

Como yo lo entiendo, cada uno de los "core" es un completo procesador, con su propio conjunto de registro. Básicamente, la BIOS se inicia con un núcleo en ejecución y, a continuación, el sistema operativo puede "empezar" otros núcleos, mediante la inicialización de ellos y apuntando a la ejecución de código, etc.

La sincronización se realiza por el sistema operativo. En general, cada procesador ejecuta un proceso diferente para el sistema operativo, por lo que el multi-threading funcionalidad del sistema operativo es el responsable de decidir cuál proceso se pone a tocar de memoria, y qué hacer en el caso de una memoria de la colisión.

19voto

DigitalRoss Puntos 80400

Érase una vez, para escribir en ensamblador x86, por ejemplo, tendría instrucciones que indica "la carga de la EDX registro con el valor 5", "incremento de la EDX" registro, etc. Con las Cpu modernas, que tiene 4 núcleos (o incluso más), en el código de la máquina nivel no se acaba de ver como hay 4 CPUs separadas (es decir, hay 4 distintos "EDX" registros) ?

Exactamente. Hay 4 conjuntos de registros, incluyendo 4 instrucciones por separado punteros.

Si es así, cuando usted dice que "el incremento de la EDX registro", lo que determina que la CPU del registro EDX se incrementa?

La CPU ejecuta la instrucción de que, de forma natural. Piense en ello como 4 totalmente diferentes microprocesadores que son simplemente para compartir la misma memoria. Dos o más de los núcleos puede ocurrir incluso a ejecutar la misma instrucción al mismo tiempo.

Hay un "contexto de CPU" o "hilo" concepto en ensamblador x86 ahora?

No. El ensamblador sólo traduce las instrucciones como siempre. No hay cambios.

¿Cómo funciona la comunicación/sincronización entre los núcleos de trabajo?

Ya que comparten la misma memoria, es sobre todo una cuestión de lógica del programa. Sin embargo, hay una inter-procesador de interrumpir el mecanismo.

Si estuviera escribiendo un sistema operativo, ¿qué mecanismo se expone a través de hardware para permitir la ejecución del programa en los diferentes núcleos?

En realidad, no horario de sí mismos. Una vez que están todos los pasos (que no toma algo de trabajo) que se ejecutan al mismo tiempo. Ya que están todos con el mismo núcleo de la imagen, que el núcleo es un simple escrito de tal manera que los diferentes núcleos de cooperar y, por ejemplo, dividir el Unix o Windows hilos de modo que dos núcleos no intente ejecutar el mismo programa al mismo tiempo. Así, simplificado, en el OS programador de un núcleo establecer un bloqueo, recogida en un proceso de ejecución, se establece un indicador de decir que se está ejecutando, y claro la cerradura. El principal que entra en el programador de código se elige un proceso que aún no está en ejecución puramente basado en los indicadores.

Es un poco especial privilegiados de la instrucción(s)?

No. Los núcleos son sólo todas en la misma memoria con la misma edad de instrucciones, en su mayoría.

Si estuviera escribiendo un compilador de optimización/bytecode de VM para una CPU de varios núcleos, lo que usted necesita saber específicamente sobre, por ejemplo, x86 a hacer es generar el código que se ejecuta de manera eficiente en todos los núcleos?

Se ejecuta el mismo código que antes. Es el Unix o Windows kernel que necesitaba cambiar.

Podría resumir mi pregunta como "¿Qué cambios se han hecho para x86 código máquina para soporte de multi-núcleo de la funcionalidad?"

Nada era necesario. Los primeros sistemas SMP utiliza el mismo conjunto de instrucciones de como uniprocessors. Ahora, ha habido una gran cantidad de arquitectura x86 evolución y millones y millones de nuevas instrucciones para hacer que las cosas vayan más rápido, pero ninguno era necesario para SMP.

Para obtener más información, vea la Especificación de Multiprocesador de Intel.

9voto

Gerhard Puntos 3383

Cada Núcleo se ejecuta desde una memoria diferente área. Su sistema operativo será un punto a a un núcleo en el programa y el núcleo se ejecute su programa. Su programa no serán conscientes de que hay más de un núcleo, o en que el núcleo que se está ejecutando.

También no hay ninguna instrucción adicional sólo disponible para el Sistema Operativo. Estos núcleos son idénticos a los de un solo núcleo de fichas. Cada Núcleo se ejecuta una parte del Sistema Operativo que se encargará de la comunicación para el común de las áreas de memoria se utiliza para el intercambio de información para buscar la siguiente zona de memoria para ejecutarse.

Esto es una simplificación, pero te da la idea básica de cómo se hace. Más acerca de los lances del mst y multiprocesadores en Embedded.com tiene un montón de información acerca de este tema ... Este tema se complica muy rápidamente!

8voto

Alex Brown Puntos 15776

Si estuviera escribiendo una optimización de compilador/bytecode de VM para un multinúcleo De la CPU, lo que usted necesita saber específicamente sobre, por ejemplo, x86 para hacer genere el código que se ejecuta de manera eficiente a través de todos los núcleos?

Como alguien que escribe optimización del compilador/bytecode de VMs que puede ser capaz de ayudar a usted aquí.

Usted no necesita saber nada específicamente sobre x86 a hacer es generar el código que se ejecuta de manera eficiente en todos los núcleos.

Sin embargo, puede que usted necesita saber acerca de cmpxchg y amigos en el fin de escribir el código que se ejecuta correctamente en todos los núcleos. Programación multinúcleo requiere el uso de sincronización y comunicación entre hilos de ejecución.

Usted puede necesitar saber algo acerca de x86 a hacer es generar el código que se ejecuta de manera eficiente en los sistemas x86 en general.

Hay otras cosas que serían útiles para aprender:

Usted debe aprender acerca de las instalaciones, el sistema operativo (Linux o Windows o OSX) proporciona a permitir ejecutar varios subprocesos. Usted debe aprender acerca de paralelización de Api, tales como OpenMP y Threading Building Blocks, o OSX 10.6 "Snow Leopard"en la próxima "Grand Central".

Usted debe considerar si su compilador debe ser auto-parallelising, o si el autor de las aplicaciones compiladas por el compilador necesita agregar una sintaxis especial, o llamadas a la API en su programa para tomar ventaja de los múltiples núcleos.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X