2010-05-12 8 views
10

Esta muestra code compara el método de serie con el método de rosca, en el procesador de cuatro núcleos. El código solo usa GetPixel() para leer todos los píxeles de 4 imágenes. Encontré que la velocidad es de alrededor del 65%, ¿por qué no es igual al 75% ya que tengo 4 núcleos y todos ellos se utilizan por completo?El uso de Threading en Quad core acelera el código al 65%?

PS:

se puede comprobar el código como no hago ninguna de E/S, y no hay otros procesos están trabajando en las máquinas (procesos ventanas normales)

+2

Se tocan montones de RAM, las CPU comenzarán a pelear por el bus. –

Respuesta

4

Podría ser cualquier número de cosas . Una pareja que viene a la mente

  1. Overhead desde la administración de los diferentes hilos.
  2. Otros procesos están utilizando recursos en el sistema al mismo tiempo.
+0

Estoy seguro de que no hay otros procesos que utilicen procesadores en gran medida –

+0

Todavía hay una gran posibilidad de que la administración de subprocesos esté causando la caída en el rendimiento esperado. – kemiller2002

2

Lo más probable es que tenga que competir con los otros subprocesos en alguna estructura de datos, o archivo, para que no obtenga la ejecución 100% paralela.

Por ejemplo, si ejecutas un tipo de operación de descarga de página web desde el sitio web en 4 vías paralelas en un núcleo cuádruple, y el servidor solo permite 1 descarga simultánea desde la misma dirección IP a la vez , no obtendrás ninguna aceleración en absoluto.

Además, hay algunos gastos generales relacionados con el giro de los hilos y el mantenimiento de los mismos, por lo que no obtendrás un núcleo completo cuando comiences a hacerlo en paralelo, aunque lo más probable es que no sea un factor importante en este caso.

1

porque hay otros factores a considerar. Al igual que la memoria y el ancho de banda/contención de E/S, la sobrecarga de conmutación de contexto de subprocesos, etc.

1
  1. Lo está ejecutando en un sistema operativo. Hay otros procesos en ejecución. Esto consumirá parte del tiempo de la CPU.
  2. Quizás ya no tenga un límite de CPU, sino un límite de IO (ancho de banda de la memoria, ancho de banda del disco, ...).
  3. Siempre habrá algo de sobrecarga para el roscado (e hilo-conmutación), clasificación, etc.

En general, mi experiencia de programación en paralelo, si se obtiene un tiempo transcurrido de 65% menos, que es bastante bueno.

2

Enhebrado tiene sobrecarga, y no todo puede ejecutarse siempre en paralelo.

  • Hora de crear/iniciar/detener subprocesos.
  • Trabajo adicional realizado (como bloqueo/incremento)
  • No todos los recursos pueden ser perfectamente paralelizables, p. acceso a la memoria, o lectura/escritura de archivos.
  • El sistema operativo y otras aplicaciones pueden necesitar parte del tiempo del procesador de vez en cuando.
Cuestiones relacionadas