Java: el código multiproceso no se ejecuta más rápido en más núcleos
Solo estaba ejecutando un código multiproceso en una máquina de 4 núcleos con la esperanza de que fuera más rápido que en una máquina de un solo núcleo. Aquí está la idea: obtuve un número fijo de hilos (en mi caso un hilo por núcleo). Cada hilo ejecuta unaRunnable
de la forma
private static int[] data; // data shared across all threads
public void run() {
int i = 0;
while (i++ < 5000) {
// do some work
for (int j = 0; j < 10000 / numberOfThreads) {
// each thread performs calculations and reads from and
// writes to a different part of the data array
}
// wait for the other threads
barrier.await();
}
}
En una máquina quadcore, este código realizapeo con 4 hilos que con 1 hilo. Incluso con laCyclicBarrier
obrecarga de @, hubiera pensado que el código debería funcionar al menos 2 veces más rápido. ¿Por qué se ejecutamás lent?
EDIT: He intentado una implementación de espera ocupada. Desafortunadamente, hace que el programa funcione más lento en más núcleos (también se discute en una pregunta separadaaqu):
public void run() {
// do work
synchronized (this) {
if (atomicInt.decrementAndGet() == 0) {
atomicInt.set(numberOfOperations);
for (int i = 0; i < threads.length; i++)
threads[i].interrupt();
}
}
while (!Thread.interrupted()) {}
}