2010-07-22 11 views
5

He hablado un poco con procesamiento paralelo en la universidad y ahora estoy tratando de mejorarlo. Puedo escribir código que se puede ejecutar en paralelo y luego iniciar subprocesos, pero después de eso pierdo el control sobre lo que hacen los hilos. Me gustaría saber cómo puedo controlar los hilos a cosas como, por ejemplo, unir un hilo específico a un núcleo de procesador específico.Enlazado de hilos específicos a núcleos de procesador específicos

Estoy interesado principalmente en C++ pero he hecho algunas codificaciones de esto en Java, por lo que esas respuestas también son bienvenidas.

+2

¿Seguro que quieres hacer esto? En muchos casos, es mejor dejar que el SO y/o JVM tomen decisiones de programación. –

+0

Es más para fines de prueba que quiero hacerlo. – user381261

Respuesta

4

Estoy respondiendo en perspectiva de Java: Eso no es posible. Lo mejor que puedes controlar es el thread priority. Para forzar que Java se ejecute en cierta CPU/core, debes hacerlo de una manera específica de la plataforma. En Windows, por ejemplo, puede hacer eso en el administrador de tareas ubicando el proceso en la pestaña Procesos, haciendo clic con el botón derecho en el proceso en cuestión (generalmente java.exe), eligiendo Establecer afinidad y marcar las CPU/núcleos.

enter image description here

Como se puede adivinar, esto pone de hecho en todo el mundo la afinidad, no en base a las discusiones que se crean en Java.

+0

Entonces, ¿la forma de evitar esto en Java sería usar procesos múltiples en lugar de hilos? – user381261

+0

En teoría, sí. En la práctica, no te preocupes. El sistema operativo está haciendo este trabajo mejor. Si su único propósito es escribir, por ejemplo, un programa de referencia, en lugar de buscar lenguajes nativos del sistema operativo como C++. – BalusC

13

Contrariamente al consejo de algunos de los otros encuestados, para algunos sistemas (sin duda el comercio de alta frecuencia y sin duda muchos otros sistemas de muy baja latencia como los motores de búsqueda), vinculando un hilo a un núcleo de CPU (o hiper núcleos ranurados, un único subproceso de CPU) puede tener enormes beneficios de rendimiento.

La vista ingenua pero cada vez más rechazada es que el aumento de los hilos (dentro de lo razonable) aumenta el rendimiento para dichos sistemas. Sin embargo, la evidencia aumenta que cuando se diseñan correctamente, las soluciones que utilizan muy pocos subprocesos para la mayoría del procesamiento pueden superar considerablemente las soluciones de alta concurrencia, a veces por factores de diez o incluso cien.

La razón principal de esto es el cambio de contexto. La conmutación de contexto es el proceso en el que una CPU vacía su entorno de trabajo para que cache la RAM actual (si tiene suerte) o RAM principal (si no lo está), y lee en el entorno de trabajo para el siguiente subproceso: y es una de las operaciones más caras que puede realizar un sistema de baja latencia.

Si desea minimizar el cambio de contexto donde la baja latencia es primordial, ciertos procesos críticos pueden estar mejor restringidos a un único núcleo o subproceso de CPU. Cuando es necesario que varios hilos lean o escriban datos que se gestionan mediante esos procesos críticos restringidos por hilos, es posible que desee ver el patrón "Disruptor", que utiliza un buffer de anillo más una serie de trucos inteligentes para permitir que sea muy rápido. acceso a datos compartidos, mientras que casi nunca requiere un bloqueo exclusivo de esos datos (vinculado a continuación).

Para realizar tareas de afinidad de subprocesos (CPU binding) de manera independiente del sistema operativo en Java, puede utilizar la biblioteca de subprocesos Java Thread Affinity de Peter Lawrey, también enlazada a continuación. También tenga en cuenta el ejemplo en el que Peter vincula un hilo de lectura a un hiper hilo de un núcleo hiperhilado y un hilo de escritor al otro, un truco que podría tener beneficios apreciables (aunque no lo he probado).

Barney

http://lmax-exchange.github.io/disruptor/

https://github.com/peter-lawrey/Java-Thread-Affinity/wiki/How-it-works

Cuestiones relacionadas