Rendimiento decepcionante con Parallel.For

Estoy tratando de acelerar mis tiempos de cálculo usandoParallel.For. Tengo una CPU Intel Core i7 Q840 con 8 núcleos, pero solo logro obtener una relación de rendimiento de 4 en comparación con una secuencialfor lazo. ¿Es esto lo mejor que puede conseguir conParallel.For¿O puede ajustarse el método para aumentar el rendimiento?

Aquí está mi código de prueba, secuencial:

var loops = 200;
var perloop = 10000000;

var sum = 0.0;
for (var k = 0; k < loops; ++k)
{
    var sumk = 0.0;
    for (var i = 0; i < perloop; ++i) sumk += (1.0 / i) * i;
    sum += sumk;
}

y paralelo:

sum = 0.0;
Parallel.For(0, loops,
                k =>
                    {
                        var sumk = 0.0;
                        for (var i = 0; i < perloop; ++i) sumk += (1.0 / i) * i;
                        sum += sumk;
                    });

El bucle que estoy paralelizando implica el cálculo con una variable definida "globalmente",sum, pero esto solo debería equivaler a una pequeña fracción del tiempo total dentro del bucle paralelizado.

En la versión de compilación (conjunto de indicadores "código optimizado") la secuenciafor bucle toma 33.7 s en mi computadora, mientras queParallel.For el bucle toma 8.4 s, una relación de rendimiento de solo 4.0.

En el Administrador de tareas, puedo ver que la utilización de la CPU es del 10-11% durante el cálculo secuencial, mientras que solo es del 70% durante el cálculo paralelo. He intentado establecer explícitamente

ParallelOptions.MaxDegreesOfParallelism = Environment.ProcessorCount

pero fue en vano. No me queda claro por qué no toda la potencia de la CPU está asignada alparalela ¿cálculo?

He notado que una pregunta similar se ha planteado en SOantes de, con un resultado aún más decepcionante. Sin embargo, esa pregunta también involucraba una paralelización inferior en una biblioteca de terceros. Mi principal preocupación es la paralelización de las operaciones básicas en las bibliotecas principales.

ACTUALIZAR

En algunos de los comentarios se me indicó que la CPU que estoy usando solo tiene 4 núcleos físicos, que el sistema puede ver como 8 núcleos si está habilitado el subproceso. Por el bien de esto, deshabilité el subproceso y volví a hacer una prueba de referencia.

Con hyper-threadingdiscapacitadomis cálculos son ahoraMás rápido, tanto el paralelo como también el (lo que pensé que era) secuencialfor lazo. Utilización de la CPU durante elfor bucle es de hasta aprox. 45% (!!!) y 100% durante elParallel.For lazo.

Tiempo de cálculo para elfor bucle 15.6 s (más del doble de rápido que con el subproceso)habilitado) y 6.2 s paraParallel.For (25% mejor que cuando está el subproceso).habilitado). Relación de rendimiento conParallel.For ahora es solo2.5, funcionando en 4 núcleos reales.

Por lo tanto, la relación de rendimiento sigue siendo sustancialmente más baja de lo esperado, a pesar de que el hipervínculo está deshabilitado. Por otro lado, es intrigante que la utilización de la CPU sea tan alta durante elfor ¿lazo? ¿Podría haber también algún tipo de paralelización interna en este bucle?

Respuestas a la pregunta(4)

Su respuesta a la pregunta