¿Cómo acelerar la ejecución de un programa de Matlab?

3

¿Hay alguna técnica para hacer que el código MATLAB se ejecute más rápido?

Estoy hablando de cosas que pueden hacer que mi PC sea más rápida (como detener algunos archivos .exe o software para mejorar el rendimiento de la PC). Noté que a veces mi PC ejecuta la misma tarea en dos momentos diferentes: por ejemplo, puede ejecutar un programa en 45 segundos y el mismo programa nuevamente en 10 minutos.

bzak
fuente
No es realmente una pregunta relacionada con MATLAB (aunque en algunas versiones anteriores de R14, el antivirus podría hacer que se ejecute lentamente). Como regla general: para correr rápido tienes que hacer menos.

Respuestas:

7

¿Es MATLAB el que corre lento en su computadora o más bien los programas que ha escrito en MATLAB?

MATLAB hace un uso intensivo de la asignación y reasignación de memoria dinámica; El cambio de tamaño de matriz o matriz puede ser muy lento y no determinista; Si una matriz o matriz crece, se asigna nueva memoria y los datos existentes se copian en la nueva memoria antes de eliminar la copia anterior. Puede evitar esta pérdida de memoria preasignando tales matrices: por ejemplo, este código:

x = 0;
for k = 2:1000
   x(k) = x(k-1) + 5;
end

hace xque se cambie el tamaño en cada iteración y se ejecutará muy lentamente. En comparación, el siguiente código:

x = zeros(1, 1000);
for k = 2:1000
   x(k) = x(k-1) + 5;
end

asigna previamente la matriz para que no se produzca el cambio de tamaño y se ejecute considerablemente más rápido.

El sitio web de MathWorks tiene una página completa que detalla esta y otras técnicas para mejorar el rendimiento; la página cubre lo siguiente:

  • Matrices de preasignación
  • Utilice matrices distribuidas para grandes conjuntos de datos
  • Cuando sea posible, reemplace por con parfor (Paralelo para)
  • Limitar tamaño y complejidad
  • Asignación a variables
  • Uso de operadores lógicos apropiados
  • Sobrecarga de funciones incorporadas
  • Las funciones son generalmente más rápidas que las secuencias de comandos
  • Cargar y guardar son más rápidos que las funciones de E / S de archivo
  • Vectorización de bucles
  • Evitar procesos de fondo grandes

Tenga en cuenta que la solución que ha sugerido es la última en la lista de MathWorks, primero debe mirar todos los otros puntos, a menos que esté haciendo algo que obviamente requiera recursos como ejecutar una máquina virtual o reproducir video de alta definición al mismo tiempo que ejecuta MATLAB , mirar otros procesos en ejecución probablemente está sudando las cosas pequeñas.

Clifford
fuente
Gracias por su respuesta. Sin embargo, creo que el problema no está relacionado con el código de Matlab, ya que el mismo programa se ejecuta en dos tiempos diferentes (45 segundos y 10 minutos). Tal vez el foro está reservado para la programación, pero mi problema muestra que la ejecución lenta de un programa de Matlab puede ser otra cosa que un script incorrecto. Por lo tanto, antes de realizar una simulación, primero debemos verificar que la PC esté funcionando correctamente y también es importante para un programador que el contenido de su programa.
@bzak: en ese caso agrego mi voto para cerrar, aunque el comportamiento no determinista significa exactamente lo que está viendo. Si el algoritmo en algún momento asigna suficiente memoria para requerir el intercambio de memoria en el disco, la desaceleración será significativa. En MATLAB, agregar memoria es a menudo el acelerador más efectivo.
3

Después de seguir las sugerencias de Clifford, puede usar las herramientas de creación de perfiles de MATLAB para verificar dónde pasa la mayor parte del tiempo su programa, generalmente no hay demasiadas líneas / funciones. Luego concéntrate en optimizar esas líneas.


fuente
3

Si el tiempo de ejecución de su código es muy variable, entonces es probable que tenga un problema en el que a veces, hasta cierto punto, está llegando a la memoria virtual. Cuando MATLAB debe usar el espacio de intercambio, las cosas se ralentizan dramáticamente. Después de todo, está utilizando espacio en disco para sustituir la disponibilidad de RAM física. Esta es la mejor razón por la que puedo ofrecer un código que varía en el tiempo en un orden de magnitud en el tiempo necesario para diferentes ejecuciones.

Use la herramienta de perfil para determinar a dónde va el tiempo. Mire cuidadosamente esas líneas. ¿Está creando una gran matriz, incluso si eso se hace temporalmente en alguna función que llame?

Verifica tu sistema. Mire para ver si esto sucede, si la CPU se está ejecutando esencialmente inactiva mientras los accesos al disco son pesados.

Por supuesto, si esto es lo que sugiero, entonces la solución también es lógica.

  • Haga que su algoritmo sea más eficiente en términos de memoria. Esto siempre es una buena cosa.

  • Obtenga más RAM si actualmente tiene menos de 2 GB.

  • Use la versión de 64 bits de MATLAB junto con obtener más RAM.


fuente
+1. Si no hay un problema de E / S, esta es sin duda la razón. Una vez que comienzas a buscar, todo se ralentiza.
Jonas
2

Según yo, debe ser un cuello de botella de recursos en todo el sistema, como el acceso al disco o el problema de intercambio de memoria. Intente ver qué ocurre en Process Explorer , allí puede descubrir qué está sucediendo en el sistema.

jdehaan
fuente
2
Es casi seguro que lo que está sucediendo es MATLAB. Es notoriamente hambriento de recursos. Tanto usted como bzak probablemente están ladrando en el árbol equivocado si cree que la solución es arreglar la PC en lugar del código MATLAB. Además, dicha acción no es un tema para este foro.