Faites fonctionner GNU Octave avec un processeur multicore. (Multithreading)

je veux pouvoir programmer plusieurs threads avec gnu octave pour qu'il utilise plusieurs processeurs.

j'ai installé GNU Octave sur Fedora 17 Linux et j'ai fait ce qui suit:

yum install octave

qui a installé sur mon ordinateur la dernière version d'octave, 3.6.2. Il fonctionne très bien, cependant quand vous multipliez deux énormes matrices ensemble, il embourbe le CPU qu'octave utilise. Ce serait bien si la multiplication de matrice utilise tous les cœurs, puisque dans ce cas la Le CPU est évidemment le goulot d'étranglement.

octave peut-il utiliser pleinement les processeurs multi-core et fonctionner sur plusieurs threads? Est-il une bibliothèque ou un moment de la compilation drapeau pour cela?

18
demandé sur Charity Leschinski 2012-08-09 21:49:15

3 réponses

Solution

Octave lui-même est une application monofilaire qui fonctionne sur un noyau. Vous pouvez obtenir octave pour utiliser certaines bibliothèques comme ATLAS qui utilisent des noyaux multiples. Ainsi, tandis Qu'Octave n'utilise qu'un seul noyau, lorsque vous rencontrez une opération lourde, octave appelle des fonctions dans ATLAS qui utilisent de nombreux CPU.

j'ai été capable de faire cela. Tout d'abord, compilez 'ATLAS' à partir du code source et mettez-le à la disposition de votre système afin qu'octave puisse le trouver et utiliser ceux les fonctions de la bibliothèque. ATLAS s'adapte à votre système et au nombre de cœurs. Quand vous installez octave à partir de la source et spécifiez ATLAS, il l'utilise, donc quand octave fait une opération lourde comme une énorme multiplication matricielle, ATLAS décide du nombre de cpu à utiliser.

Je n'ai pas pu obtenir que cela fonctionne Pour Fedora, mais sur Gentoo je pouvais le faire fonctionner.

j'ai utilisé ces deux lien: ftp://ftp.gnu.org/gnu/octave/

http://math-atlas.sourceforge.net/

j'ai lancé le noyau d'octave suivant avant et après L'installation D'ATLAS:

tic
bigMatrixA = rand(3000000,80);
bigMatrixB = rand(80,30);
bigMatrixC = bigMatrixA * bigMatrixB;
toc
disp("done");

la multiplication matricielle va beaucoup plus vite en utilisant plusieurs processeurs, qui était 3 fois plus rapide qu'avant avec un seul noyau:

Without Atlas: Elapsed time is 3.22819 seconds.
With Atlas:    Elapsed time is 0.529 seconds.

les trois bibliothèques que j'utilise pour accélérer les choses sont blas-atlas, cblas-atlas, lapack-atlas.

si octave peut utiliser ces blas au lieu des Blas par défaut, et les bibliothèques lapack, alors il utilisera multi core.

ce n'est pas facile et il faut quelques compétences de programmation pour obtenir octave de compiler à partir de la source avec ATLAS.

Drabacks à l'aide de l'Atlas:

ce logiciel Atlas utilise beaucoup de frais généraux pour diviser votre programme octave en plusieurs threads. Sûr que ça va beaucoup plus vite si tout ce que vous faites est énorme les multiplications matricielles, mais la plupart des commandes ne peuvent pas être multi-threadées par atlas. Si extraire chaque peu de puissance/vitesse de traitement de vos noyaux est la priorité absolue, alors vous aurez beaucoup plus de chance en écrivant simplement votre programme pour être exécuté en parallèle avec lui-même. (Divisez votre programme en 8 programmes équivalents qui fonctionnent sur 1/8ème du problème et exécutez-les tous simultanément, quand tout est fait, réassemblez les résultats).

Atlas aide un seul programme d'octave filetée à se comporter un peu plus comme une application multi-threaded mais ce n'est pas une balle d'argent. Atlas ne fera pas votre programme d'Octave filetée simple max votre processeur 2,4,6,8 core. Vous remarquerez un boost de performance, mais le boost vous laissera à la recherche d'une meilleure façon d'utiliser tout le processeur. La réponse est d'écrire votre programme pour l'exécuter en parallèle avec lui-même, et cela demande beaucoup de compétence de programmation.

Suggestion

mettez votre énergie dans la vectorisation de vos opérations les plus lourdes et la distribution du processus sur n threads fonctionnant simultanément. Si vous attendez trop longtemps pour qu'un processus s'exécute, il est fort probable que le résultat le plus bas pour l'accélérer est l'utilisation d'un algorithme ou d'une structure de données plus efficace.

24
répondu Eric Leschinski 2017-03-17 12:58:47

Octave-Forge deux paquets de traiter avec le calcul parallèle:

il est également possible de lancer des sous-processus en utilisant le fork() fonction.

7
répondu Twonky 2014-02-17 09:47:33

comme suggéré par Eric j'ai essayé d'utiliser ATLAS et il a amélioré mon rendement 3x (dans l'application d'apprentissage NN, le coût principal étant la multiplication de matrice). Étonnamment, il semble toujours utiliser un seul noyau. Après d'autres recherches, je suis tombé sur OpenBLAS et il a commencé à utiliser plusieurs noyaux de la boîte et a amélioré la performance encore 2 fois (je n'ai eu que 2 noyaux cependant). Si vous souhaitez faire plus, vous pouvez également essayer d'utiliser MKL, mais il est lourd sur l'espace disque à cause des dépendances.



j'ai été en utilisant Arch Linux, avec des paquets de la communauté/ atlas-lapack-base