multithreading - threading - Secciones críticas con procesadores multinúcleo
hyper threading que es (6)
Bueno, dependiendo del tipo de computadoras que tenga en la casa, haga lo siguiente: Escriba una aplicación simple multiproceso. Ejecute esta aplicación en un solo núcleo (Pentium 4 o Core Solo) y luego ejecútelo en un procesador multinúcleo (Core 2 Duo o similar) y vea qué tan grande es la velocidad.
De acuerdo, estas son comparaciones injustas, ya que Pentium 4 y Core Solo son mucho más lentos independientemente de los núcleos que Core 2 Duo. Tal vez se pueda comparar entre un Core 2 Duo y un Core 2 Quad con una aplicación que puede usar 4 o más hilos.
Usted plantea una cantidad de puntos válidos. Varios procesadores introducen muchos dolores de cabeza y sobrecarga. Sin embargo, solo tenemos que vivir con ellos, porque el impulso de la velocidad del paralelismo puede superarlos, si las secciones críticas se hacen lo suficientemente largas.
¡En cuanto a su sugerencia final de tener todos los hilos en el mismo núcleo físico, eso derrota completamente el punto de una computadora multi-core!
Con un procesador de un solo núcleo, donde todos sus hilos se ejecutan desde una sola CPU, la idea de implementar una sección crítica usando una operación de prueba y configuración atómica en algún mutex (o semáforo, etc.) en la memoria parece bastante simple; Debido a que su procesador está ejecutando un test-and-set desde un punto en su programa, necesariamente no puede estar haciendo uno desde otro lugar en su programa disfrazado como algún otro hilo.
Pero, ¿qué sucede cuando realmente tienes más de un procesador físico? Parece que la simple atomicidad del nivel de instrucción no sería suficiente, b / c con dos procesadores que potencialmente ejecutan sus operaciones de prueba y configuración al mismo tiempo, lo que realmente necesita para mantener la atomicidad es el acceso a la ubicación de memoria compartida del mutex (Y si la ubicación de la memoria compartida se carga en la memoria caché, también hay que tener en cuenta toda la coherencia del caché ...)
Esto parece que incurriría en mucho más sobrecarga que el caso de un solo núcleo, así que aquí está la esencia de la pregunta: ¿cuánto peor es? ¿Es peor? ¿Vivimos solo con eso? ¿O lo evitas aplicando una política que todos los hilos dentro de un grupo de procesos tienen que vivir en el mismo núcleo físico?
El proveedor de CPUs multinúcleo debe cuidar que los diferentes núcleos se coordinen al ejecutar instrucciones que garanticen el acceso a la memoria atómica.
En los chips de Intel, por ejemplo, tiene la instrucción ''cmpxchg''. Compara el valor almacenado en una ubicación de memoria con un valor esperado y lo intercambia por el nuevo valor si los dos coinciden. Si lo antecede con la instrucción ''bloqueo'', se garantiza que será atómico con respecto a todos los núcleos.
Los accesos a la memoria son manejados por el controlador de memoria, que debe ocuparse de los problemas de múltiples núcleos, es decir, no debe permitir el acceso simultáneo a las mismas direcciones (probablemente manejadas por la página de memoria o por la línea de memoria). De modo que puede usar un indicador para indicar si otro procesador está actualizando el contenido de la memoria de algún bloque (esto para evitar un tipo de lectura sucia donde se actualiza parte del registro, pero no todos).
Una solución más elegante es usar un bloque de semáforo HW si el procesador tiene esa característica. Un semáforo HW es una cola simple que podría ser de tamaño no_of_cores -1. Así es como está en el procesador 6487/8 de TI. Puede consultar el semáforo directamente (y hacer un bucle hasta que se libere) o realizar una consulta indirecta que dará lugar a una interrupción una vez que su núcleo obtenga el recurso. Las solicitudes se ponen en cola y se sirven en el orden en que se hicieron. Una consulta de semáforo es una operación atómica.
La coherencia de la caché es otro problema y, en algunos casos, es posible que necesite realizar reescrituras y actualizaciones de la caché. Pero esto es algo muy específico de implementación de caché. Con 6487/8 necesitábamos hacer eso en algunas operaciones.
Los sistemas multi-core / SMP no son solo varias CPU pegadas. Existe un apoyo explícito para hacer cosas en paralelo. Todas las primitivas de sincronización se implementan con la ayuda de hardware a lo largo de las líneas de CAS atómico . La instrucción bloquea el bus compartido por las CPU y el controlador de memoria (y los dispositivos que hacen DMA) y actualiza la memoria, o simplemente actualiza la memoria basándose en el espionaje de caché . Esto a su vez hace que el algoritmo de coherencia de caché se active forzando a todas las partes involucradas a eliminar sus cachés.
Descargo de responsabilidad: esta es una descripción muy básica, aquí hay cosas más interesantes como caches virtuales vs. físicas, políticas de caché por escrito, modelos de memoria, vallas, etc.
Si desea saber más sobre cómo el sistema operativo puede usar estas instalaciones de hardware, aquí hay un excelente libro sobre el tema.
Necesitará un conjunto de prueba que obligue al procesador a notificar a todos los demás núcleos de la operación para que lo sepan. Sí, eso introduce una sobrecarga y tienes que vivir con eso. Es una razón para diseñar aplicaciones multiproceso de tal manera que no esperen con demasiada frecuencia las primitivas de sincronización.
¿O lo evitas aplicando una política que todos los hilos dentro de un grupo de procesos tienen que vivir en el mismo núcleo físico?
Eso cancelaría todo el punto del multihilo. Cuando usa un bloqueo, semáforo u otras técnicas de sincronización, confía en el sistema operativo para asegurarse de que estas operaciones estén enclavadas, sin importar cuántos núcleos esté utilizando.
El tiempo para cambiar a un hilo diferente después de liberar un bloqueo está determinado principalmente por el costo de un cambio de contexto. Este hilo SO trata de la sobrecarga de cambio de contexto, por lo que es posible que desee comprobarlo.
También hay otros hilos interesantes:
- ¿Cuáles son las diferencias entre varias opciones de sincronización de subprocesamiento en C #?
- Enhebrando las mejores prácticas
También debe leer este artículo de MSDN: Comprender el impacto de las técnicas de bloqueo bajo en aplicaciones multiproceso .