2012-03-09 15 views
9

¿Cuál sería la mejor manera de medir la aceleración de mi programa suponiendo que solo tengo 4 núcleos? Obviamente, podría medirlo hasta 4, sin embargo, sería bueno saberlo por 8, 16, y así sucesivamente.¿Cómo puedo medir cómo se escala el código multiproceso (aceleración)?

Idealmente me gustaría saber la cantidad de aumento de velocidad por número de hilo, similares a este gráfico:

Amdahl's law diagram

¿Hay alguna manera de hacer esto? Tal vez un método de simulación de múltiples núcleos?

+4

+1 para efectos visuales. Respuesta corta, no se puede hacer más que hacer conjeturas educadas. – Mysticial

+0

@Mysticial pero ¿no deberías poder medir con una herramienta como VTune de Intel? –

+0

@ConradFrix No cuando intentas adivinar el rendimiento en 16 núcleos que no tienes. Puede, por otro lado, usar VTune para perfilar el rendimiento en 4 núcleos, y en función de esos números para intentar extrapolar a 16 núcleos. Eso sería, más o menos, una "conjetura educada". – Mysticial

Respuesta

2

No creo que haya una forma real de hacerlo, pero una cosa que me viene a la mente es que podrías usar una máquina virtual para simular más núcleos. En VirtualBox, por ejemplo, puede seleccionar hasta 16 núcleos del menú estándar, pero estoy muy seguro de que hay algunos hacks, que pueden hacer más de eso y otras máquinas virtuales como VMware incluso podrían admitir más fuera de la caja.

enter image description here

+0

¿Cómo puede virtualbox simular más núcleos? – CMCDragonkai

+0

@CMCDragonkai Bueno, es virtualización. Puede decirle al sistema operativo invitado lo que quiera. – inf

+0

¿Enlaza esos núcleos simulados en el núcleo físico real? Entonces, si tengo 4 núcleos, ¿puedo crear 100 núcleos simulados usando VirtualBox? ¡No lo hice sobre tal capacidad! – CMCDragonkai

1

no creo que esto es posible ya que hay demasiadas variables para poder extrapolar con precisión performace. Incluso suponiendo que eres 100% paralelo. Hay otros factores, como la velocidad del bus y las fallas en el caché que pueden limitar su rendimiento, sin mencionar el rendimiento periferal. Cómo todos estos factores afectan su código solo puede hacerse midiendo en su plataforma de hardware específica.

2

bamboon y Doron y tienen razón en que hay muchas variables en juego, pero si tiene un tamaño de entrada sintonizable n, se puede averiguar el fuerte escalar y débil escalar de su código.

El escalado fuerte se refiere a la fijación del tamaño del problema (por ejemplo, n = 1M) y la variación del número de subprocesos disponibles para el cálculo. El escalado débil se refiere a la fijación del tamaño del problema por el hilo (n = 10k/thread) y la variación del número de hilos disponibles para el cálculo.

Es cierto que hay muchas variables en funcionamiento en cualquier programa; sin embargo, si tiene un tamaño de entrada básico n, es posible obtener una apariencia de escalado. En un simulador de n-cuerpo que desarrollé hace unos años, varié los subprocesos para tamaño fijo y el tamaño de entrada por hilo y pude calcular razonablemente una medida aproximada de qué tan bien se escalaba el código multiproceso.

Como solo tiene 4 núcleos, solo puede calcular factiblemente la ampliación de hasta 4 hilos. Esto limita severamente su capacidad para ver qué tan bien se adapta a cargas en gran medida enhebradas. Pero esto puede no ser un problema si su aplicación solo se utiliza en máquinas donde hay recuentos de núcleos pequeños.

Realmente necesita hacerse la pregunta: ¿Esto va a ser utilizado en 10, 20, más de 40 hilos? Si es así, la única forma de determinar con precisión el escalado a esos regímenes es compararlo realmente en una plataforma donde tenga ese hardware disponible.


Nota al margen: Dependiendo de la aplicación, puede que no importe que sólo tiene 4 núcleos. Algunas cargas de trabajo aumentan con el aumento de subprocesos, independientemente de la cantidad real de núcleos disponibles, si muchos de esos subprocesos pasan tiempo "esperando" que algo suceda (por ejemplo, servidores web).Sin embargo, si está haciendo un cálculo puro, este no será el caso

+0

Creo que [la ley de Amdahl] (http: //en.wikipedia.org/wiki/Amdahl's_law) solo tiene sentido para las tareas que consumen tiempo de CPU. –

3

Lo siento, pero en mi opinión, la única medida confiable es obtener realmente una máquina de 8, 16 o más núcleos y probarla ese.

La saturación de ancho de banda de memoria, el número de unidades funcionales de CPU y otros cuellos de botella de hardware pueden tener un gran impacto en la escalabilidad. Sé por experiencia personal que si un programa escala en 2 núcleos y en 4 núcleos, podría ralentizarse dramáticamente cuando se ejecuta en 8 núcleos, simplemente porque no es suficiente tener 8 núcleos para poder escalar 8x.

usted podría tratar de predecir lo que va a pasar, pero hay un montón de factores que deben tenerse en cuenta:

  1. caches - tamaño, número de capas, compartida/no compartido
  2. ancho de banda de memoria
  3. número de núcleos frente a número de procesadores es decir, es una máquina de 8-núcleo o una máquina de doble de cuatro núcleos
  4. interconexión entre núcleos - un menor número de núcleos (2, 4) se puede todavía funcionar razonablemente bien con un autobús, pero para 8 o más núcleos una interconexión más sofisticada ion es necesario.
  5. acceso a memoria: una vez más, un número menor de núcleos funciona bien con el modelo SMP (multiprocesamiento simétrico), mientras que un número mayor de núcleos necesita un modelo NUMA (acceso a memoria no uniforme).
1

Supongo que está preguntando acerca de la medición, por lo que no abordaré el problema de predecir el efecto en un mayor número de núcleos.

Esta pregunta se puede ver de otra manera: ¿qué tan ocupado puede guardar cada hilo y hasta qué punto lo hacen? Por lo tanto, para seis subprocesos, que se ejecutan a un 50% de utilización cada uno, significa que tiene 3 procesadores equivalentes en ejecución. Dividir eso por decir cuatro procesadores, significa que sus métodos están logrando el 75% de utilización. Al comparar esa utilización, con el tiempo de aceleración real, se le dice cuánto de su utilización es una nueva sobrecarga y cuánto es la aceleración real. ¿No es eso lo que realmente te interesa?

La utilización del procesador se puede calcular en tiempo real de dos maneras diferentes. Los subprocesos pueden solicitar al sistema sus tiempos de subprocesos de forma independiente, calcular relaciones y mantener totales globales. Si tiene un control total sobre sus estados de bloqueo, ni siquiera necesita las llamadas al sistema, ya que puede realizar un seguimiento de la relación entre ciclos de bloqueo y ciclos de máquina sin bloqueo, para la utilización de la informática. Un paquete de instrumentación de subprocesamiento múltiple en tiempo real que desarrollé utiliza dichos métodos y funcionan bien. El contador del reloj de la CPU en las CPUs más recientes se lee en el interior de 20 ciclos de la máquina.

Cuestiones relacionadas