2010-04-11 9 views
4

J'écris une application C# et je voudrais faire des appels à différentes fonctions matlab simultanément (à partir de différents threads). Chaque fonction Matlab est située dans sa propre bibliothèque .net compilée. Il semble que je ne puisse appeler qu'une fonction Matlab à la fois. Par exemple, si matlab_func1() est appelé à partir de thread1 alors matlab_func2() est appelé à partir de thread2, matlab_func2() doit attendre matlab_func1() pour terminer l'exécution.Appelez deux fonctions Matlab simultanément à partir de .net

Existe-t-il un moyen d'appeler différentes fonctions matlab simultanément? Merci.

MWArray[] DoKalmanFilter(double vel_x, double vel_y, double vel_z, double cal_x, double cal_y, double cal_z, bool doCal) 
    { 
    ...set up parameters  

    ret = KalmanFilter.kalman_actual(6, velx, vely, velz, cal_x, cal_y, cal_z, 
    return ret; 
    } 

    private void DoImageProcessing() 
    { 
     ..set up parameters 
     MWArray[] ret = _imgProcessor.DoImageProcessing(2, rgbMarkerColor, hsvThreshold, angleDiffThreshold); 
    } 
+0

Pouvez-vous s'il vous plaît poster le code que vous utilisez pour filer vos appels matlab? –

+0

Je veux dire .. ces méthodes sont appelées à partir de différents threads. Qu'est-ce que vous êtes particulièrement intéressé à voir? – Mav3rick

Répondre

7

Je suggère que lorsque vous appelez vos fonctions, Matlab (ou l'atelier en temps réel de Matlab qui obtient intégré dans une DLL) est donné naissance et la fonction est exécutée. L'interface MATLAB entre C# et C a probablement quelques variables externes globales, et par conséquent, MATLAB ne peut probablement pas être générée deux fois dans le même processus. En outre, MATLAB lui-même est à bien des égards un seul thread. Ils travaillent sur l'évolution vers plus d'utilisation de multi-core.

J'ai déjà utilisé l'interface Java/Matlab et lu this site comme suit: Matlab est monothread. Cela signifie que si vous essayez d'eval ou feval à partir d'une fonction Java qui a été appelée directement à partir d'une fonction Matlab, elle se bloque en attente de la fin de la première fonction matlab. Ce que je pourrais suggérer comme test est de mettre "DoKalmanFilter" et "DoImageProcessing" pour séparer les assemblages ou les applications, et ensuite faire une application qui engendre vos deux nouvelles applications séparées. De cette façon, vous obtenez deux processus et MATLAB s'exécute une fois dans chaque processus, ce qui vous permet d'exécuter vos fonctions simultanément.

Si cela fonctionne, vous pouvez alors commencer à penser à des façons de contourner cela. Vous ne voulez pas avoir à créer des applications et à les fermer tout le temps. Vous pourriez avoir besoin d'utiliser une communication inter-processus entre vos processus pour transmettre des données, cela pourrait devenir moche :-)

-2

Le cloud computing tout court. Vous pointez juste ce ventouse dans le nuage et laissez un fournisseur comme amazon s'occuper de lui. Bien sûr, il y a une surcharge sur le marshaling des données vers et depuis le cloud, mais cela ne sera jamais en concurrence avec le temps que le travail réel dans matlab prend pour chaque transaction.

Il s'agit d'une solution vraiment bon marché qui évolue économiquement mieux (et je dis cela en supposant que vous n'êtes pas garé sur une ferme de serveurs de classe mondiale) que vous pouvez faire en interne.

Voici quelque chose qui me aller rouler: http://www.mathworks.com/programs/techkits/ec2_paper.html

Le nuage est la vérité.

+0

Je vous ai downvoted, parce que, bien que discutablement utile, votre réponse n'est pas appropriée ici. –

2

Selon le Mathworks documentation,

A single application only has access to a single MCR computational engine. 

Par conséquent, comme l'a dit Fuzz, vous devez créer une deuxième application, ou au moins un second processus, au lieu d'un second fil. Cependant, vous pouvez laisser le code dans un assemblage - appeler le même assemblage à partir d'un second processus lui donne ses propres ressources.Une alternative serait d'utiliser Parallel Processing Toolbox de MATLAB pour diviser chaque appel de fonction sur plusieurs cœurs, en accélérant chaque exécution et en les appelant séquentiellement. Cependant, cela dépend si vos fonctions MATLAB se prêtent à la parallélisation.

Questions connexes