Pourquoi le code vectorisé tourne-t-il plus vite que les boucles dans MATLAB?

j'ai lu ce mais je ne comprends toujours pas pourquoi le code vectorisé est plus rapide.

dans pour les boucles, je peux utiliser parfor pour le calcul parallèle. Si vectorisé code est plus rapide, ça veut dire qu'il est automatiquement parallélisée?

23
demandé sur Community 2012-12-26 06:18:19

3 réponses

Pas de. Vous mélangez deux concepts importants:

  • MATLAB est conçu pour effectuer des opérations vectorielles très rapidement. MATLAB est un langage interprété, c'est pourquoi les boucles y sont si lentes. MATLAB évite ce problème en fournissant des fonctions extrêmement rapides (généralement écrites en C, et optimisées pour l'architecture spécifique) et bien testées pour fonctionner sur des vecteurs. Il n'y a vraiment pas de magie ici, c'est juste un groupe de travail acharné et de nombreuses années de constante petites améliorations.

considérer par exemple un cas insignifiant comme celui-ci:

s=0;
for i=1:length(v),
    s = s+v(i);
end

et

sum(v)

vous devriez probablement utiliser tic et toc pour chronométrer ces deux fonctions pour vous convaincre de la différence dans l'exécution. Il existe environ 10 fonctions similaires couramment utilisées qui fonctionnent sur des vecteurs, les exemples sont: bsxfun , repmat , length , find . La vectorisation est un partie standard de L'utilisation efficace de MATLAB. Jusqu'à ce que vous pouvez vectoriser code efficacement vous êtes juste un touriste dans le monde de MATLAB pas un citoyen.

  • les versions récentes de MATLAB fournissent parfor. parfor n'est pas une balle d'argent, c'est un outil qui peut être utilisé et mal utilisé (essayez parfor sur l'exemple de somme ci-dessus). Tous les For ne peuvent pas être parrainés. parfor est conçu pour les types de problèmes à tâches parallèles où chaque itération de la boucle est indépendante de chaque autre itération. Il s'agit d'une exigence clé pour l'utilisation d'une boucle perforée.

alors que dans de nombreux cas parfor peut aider beaucoup le type de boucles qui peuvent être parfortées pour de très grands gains se produisent seldomly.

19
répondu carlosdc 2013-12-10 13:10:01

je suis d'accord avec carlosdc sur sa réponse. Cependant, il est important de se rappeler que depuis la version 6.5, Matlab a inclus un compilateur JIT pour accélérer les for-loops et autres.

j'ai fait un test rapide de votre exemple de Somme avec un million d'éléments dans v et j'ai obtenu les résultats suivants:

  • sum(v) : 4.3 ms
  • for-loop version : 16 ms
  • for-loop version, no JIT : 966 ms

le JIT peut être allumé et éteint comme ceci:

feature accel off
feature accel on

un facteur 4 dans l'amélioration par vectorisation code est bien sûr encore souvent la peine, mais les for-loops ne doit pas être craint comme ils l'ont été une fois pour les problèmes où ils sont autrement une bonne solution. Souvent cependant, un morceau de code bien vectorisé peut être plus simple, moins sujet à des erreurs et plus rapide en même temps.

15
répondu KlausCPH 2013-01-03 07:34:46

dans les ordinateurs modernes, les registres (mémoire temporaire utilisée pour les mathématiques, entre autres usages) ont beaucoup de bits et peuvent manipuler des nombres multiples ensemble. Par exemple, si vos données sont uint8 (8 bits), vous pouvez ajouter un numéro à chacun dans un PROCESSEUR de l'horloge, ou vous pouvez mettre 8 dans le registre et et un numéro pour toutes dans un seul PROCESSEUR de l'horloge. De cette façon, vous travaillez 8 fois plus vite que for-loop.

c'est en un sens une parallélisation, mais pas comme parfor. Parfor utilise plusieurs noyaux de votre CPU, et dans la méthode ci-dessus un noyau est utilisé plus efficacement. Si vous les utilisez tous les deux, vous pouvez atteindre des vitesses encore plus élevées.

2
répondu Yanai Ankri 2012-12-26 09:27:22