
Tengo una tarea de cómputo programada en Matlab, que consiste en el procesamiento de grandes cantidades de datos que se leen en la memoria al inicio. El tiempo de ejecución oscila entre horas y días. La tarea es de un solo subproceso.
Para ejecutar esta tarea, tengo varias máquinas Linux diferentes a mi disposición. Las máquinas están bajo diferentes cantidades de carga del sistema debido a tareas que ya se están ejecutando, que continuarán ejecutándose en el futuro previsible. Todas las máquinas tienen una arquitectura AMD64, pero difieren en términos de número de núcleos físicos, número de núcleos virtuales y modelo de CPU, incluida la velocidad del reloj y otros factores.
Mi pregunta:¿Existe una forma basada en principios de elegir una de las máquinas para la ejecución de la tarea, con el objetivo de finalizar la tarea lo antes posible?
La siguiente parte se actualizó según la respuesta del Doktoro Reichard.
Mi idea aproximada de cómo obtener una indicación aproximada de qué máquina será más rápida es combinar dos aspectos:
(1) Calcule qué parte de sus recursos de procesamiento asignaría una máquina a mi tarea si se ejecutara allí, lo que yo llamo "velocidad relativa": si la máquina está inactiva, mi tarea se ejecutará a una velocidad relativa 1 por definición. Si la carga actual es L y el número de núcleos es C, después de enviar mi tarea, la carga será L+1 y la velocidad de ejecución relativa será R = min(C / (L+1), 1). El operador mínimo porque el proceso no puede utilizar más de un núcleo. – ¿Es correcto este cálculo como indicador de la velocidad de procesamiento alcanzable en relación con la óptima posible en la máquina dada su carga actual? Y, ¿el número relevante C es el número de núcleos físicos o el número de núcleos virtuales, siendo este último el doble debido al hyperthreading?
(2) Estime qué tan rápido se ejecutaría relativamente la tarea en las diferentes máquinas si todas estuvieran inactivas, basándose en un indicador del rendimiento de la máquina. No debería ser la velocidad del reloj, sino un punto de referencia elegido adecuadamente.
Luego se selecciona la máquina en función de cuál tiene el mayor producto de los números (1) y (2).
Respuesta1
Esto no tendrá una respuesta definitiva debido principalmente a la forma en que funcionan las computadoras, pero intentaré dar algunas pautas sobre cómo descubrir cuál es el más rápido.
Analizaré tus declaraciones para decirte lo que puedes y lo que no puedes entender.
1. Datos
Desde los primeros párrafos usted indicó que cargó y leyó todos los datos dentro y fuera de la memoria. Esto es bueno para la velocidad, ya que en términos de ancho de banda, la memoria es insuperable. Si su programa utilizó un disco (independientemente de que sea un HDD, un SSD o un pendrive), podría existir la posibilidad de que sea un cuello de botella en la velocidad de ejecución de su programa.
Esto se debe a la velocidad de transferencia. La RAM tiene acceso casi directo al procesador. Los discos tienen que pasar a través de una conexión con un ancho de banda mucho menor que la RAM y, en el caso de los HDD, se tiene en cuenta el tiempo necesario para recuperar y almacenar datos.
2. SO
El sistema operativo utilizado tiene cierta influencia en la velocidad, pero puede considerarse residual.
3. Arquitectura del procesador (o conjuntos de instrucciones)
Este es un aspecto relevante. Aunque usted indicó que las máquinas usaban procesadores AMD64, puede haber algunas diferencias en los conjuntos de instrucciones que se utilizan.
Consideremos por ejemplo elOpteróny elSemprónserie de procesadores. Una diferencia clave entre ellos es que este último tieneSSE3apoyo.
SSE3 permite formas más nuevas y eficientes de manejar datos (específicamente operaciones con matrices), operaciones que en conjuntos de instrucciones anteriores se realizarían utilizando procesos menos eficientes.
Entonces, en este aspecto,más nuevolos procesadores sonmás rápido por diseño, ya que admiten conjuntos de instrucciones más eficientes.
4. Carga del sistema
Este es el último clavo en el ataúd, como se podría decir. No se puede calcular la carga en una computadora de forma lineal, a menos que sepas cómo funciona cada programa. Dicho esto, es posible que tenga 10.000 procesos ejecutándose pero con una carga residual o con un único proceso multiproceso desperdiciando todo el tiempo del procesador.
Sin embargo... analicemos esto más a fondo. Agregar procesos implica agregar algún tipo de datos al sistema subyacente, para que sepa que el proceso existe y cuánto tiempo del procesador debe estar preparado para él. En este aspecto,menos procesossonmejorpara la velocidad, ya que el kernel/procesador puede decidir mejor cuánto tiempo estará disponible.
Otra cosa a considerar es la prioridad que el kernel da a los procesos. Los procesos con mayor prioridad ocuparán la mayor parte del tiempo del procesador.
En última instancia, puede concebir un sistema que pueda darle a su proceso la máxima prioridad y dejar todos los demás procesos esperando eternamente hasta que su proceso se detenga. En esto, la velocidad de su proceso estará determinada por la CPU.
5. CPU
Consideremos sus puntos: núcleos y velocidad de reloj de la CPU.
Es posible que el núcleo pueda trasladar algunos procesos a otros núcleos. En un caso límite, su proceso puede tener designado un núcleo completo. En este aspecto, más núcleos pueden permitir que más procesos se ejecuten simultáneamente (y, en consecuencia, más rápido).
No sé mucho sobre subprocesos múltiples, así que se lo dejaré a alguien que sepa.
Velocidad de relojno esun indicador claro de la eficiencia del procesador. Para fundamentar esto, les presento la "batalla" entre el uso del procesador Intel y PowerPC en el hardware de Apple. Apple argumentó que la razón principal para preferir los procesadores PowerPC a los Intel a pesar de aumentar las velocidades de los procesadores Intel era que PowerPC funcionaba mejor, porque podían manejar más operaciones por segundo que su rival. Al final, Apple optó por Intel debido a problemas de energía y otros factores económicos.
fracasos(para operaciones de punto flotante por segundo) es una medida del rendimiento de la computadora, especialmente en campos de cálculos científicos que hacen un uso intensivo de cálculos de punto flotante, similares a las instrucciones por segundo más antiguas y simples. Esta podría ser una mejor medida que la velocidad del reloj, si su trabajo depende en gran medida de este tipo de operaciones que, para usted que usa Matlab, podrían ser una posibilidad.
Sin embargo, no es una cantidad muy divulgada (ya que depende deque tipo deoperaciones que está ejecutando). Encontré algunos puntos de referencia sobreoverclock.net. Señalo estos dos:
- AMD Phenom Ix4 9850 @2,83 GHzRAM 754MHz 5-5-5-15GFLOPS: 27,5
- AMD Phenom IIx2 555 @4,12 GHzRAM 1000MHz 5-5-5-18GFLOPS: 26
Como puede ver, incluso los procesadores con el doble de velocidad pueden funcionar peor que los procesadores con la mitad de velocidad.
Línea de fondo
No hay una fórmula clarapuede utilizar para estimar el tiempo de ejecución, debido a la infinita cantidad de factores involucrados en el procesamiento de un programa. Hay algunas reglas generales que resumo (he intentado ordenarlas porimportancia):
- Es más rápido tener todos (o la mayoría de los datos utilizados) en la RAM. (el almacenamiento de datos es el principal cuello de botella en cualquier proceso).
- Cuantos menos procesos se ejecuten en la misma máquina, mejor.
- Más núcleos son mejores.
- Los procesadores más nuevos son más rápidos por diseño.
- La velocidad de la CPU es unabrutoIndicador de velocidad (ya que interviene la latencia de la RAM y otros factores)
- Puede pedirle a la máquina que le dé a su proceso la máxima prioridad. La máquinaintentarápara dedicar más tiempo a su proceso. (cuando yo digointentará, quiero decir que la máquina no tiene obligación de darle más tiempo a tu proceso, intenta equilibrarlo todo, por eso existe el 2do ítem).
Todavía dudo un poco en dar una fórmula completa, pero creo que puedo darles unamuy, muy aproximadouno, basado en el resultado de sus comentarios. No puedo hablar de subprocesos múltiples, por lo que consideraré que todos los núcleos son independientes. Para esta demostración se supone lo siguiente:
- Todos los procesos tienen la misma carga.
- Los procesos no están esperando entradas/salidas.
- La velocidad de la memoria esficticiono ser un factor.
- Todos los procesos son de un solo subproceso. Tienen la misma prioridad.
Con esto, el cuello de botella será la capacidad de la CPU. Entonces, para cualquier CPU, la carga relativa para cualquier proceso sería la siguiente:
R = min(C / N ; 1)
Siendo R la carga relativa, C la cantidad de núcleos en la CPU y N la cantidad de procesos activos. Sin embargo, esto supone que el sistema puede distribuir de manera uniforme y perfecta toda la carga entre los núcleos, lo que puede no ser siempre cierto.
Con la carga relativa de la CPU, multiplíquela por la unidad de medida (UM) de su elección (por ejemplo, GHz o GFLOPS) y luego obtendrá una medida de qué tan "rápido" podría ser el proceso.
Speed = R * UM
Entonces, con esto, tu fórmula es correcta. Pero por favor,bastante por favorTenga en cuenta la cantidad de suposiciones que tuve que hacer. Esto está lejos de ser un caso real. Esto no le dará una cantidad exacta, sino más bien unaestimación fundamentada.
Tu segundo punto es el mismo que el primero (de hecho, lo respondes a tu pregunta). En resumen,esel indicador de rendimiento de la máquina (como R = 1
), por lo que la pregunta aquí es cómo elegir uno. Esto es algo que debes analizar tú mismo: puedes usar GHz multiplicado por el número de núcleos, o GFLOPS o alguna combinación de los dos.
Hay programas (que debería haber recordado antes al escribir la primera respuesta) que pueden realizar algunas pruebas comparativas en las CPU y, a partir de ellos, puede obtener algunos valores que podrían ayudarlo en su decisión. Tengo SiSoftware Sandra (que tiene, en mi versión bastante antigua, un punto de referencia de aritmética del procesador) pero supongohay otros.
En este caso, multiplicar 1) y 2) no daría ninguna diferencia, a menos que uses unidades de medida diferentes.