Вызовите две функции Matlab одновременно из .net - PullRequest
4 голосов
/ 12 апреля 2010

Я пишу приложение на C # и хотел бы одновременно вызывать различные функции Matlab (из разных потоков). Каждая функция Matlab находится в собственной скомпилированной библиотеке .net. Однако кажется, что я могу вызвать только одну функцию Matlab за раз.

то есть, если matlab_func1 () вызывается из thread1, тогда matlab_func2 () вызывается из thread2, matlab_func2 () должен ждать завершения matlab_func1 ().

Есть ли способ вызывать разные функции matlab одновременно? Спасибо.

 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);
  }

Ответы [ 3 ]

7 голосов
/ 21 апреля 2010

Я хотел бы предложить, чтобы при вызове ваших функций порождалась MATLAB (или мастерская MATLAB в реальном времени, которая встроена в DLL), и функция запускалась. Интерфейс MATLAB между C # и C, вероятно, имеет несколько глобальных внешних переменных, и в результате MATLAB, вероятно, не может быть создан дважды в одном и том же процессе. Кроме того, сам MATLAB во многих отношениях является однопоточным. Они работают над расширением использования многоядерных процессоров.

Ранее я использовал интерфейс Java / Matlab и читал на этом сайте следующее: Matlab однопоточный. Это означает, что если вы попытаетесь выполнить eval или feval из функции Java, которая была вызвана непосредственно из функции Matlab, она будет зависать в ожидании завершения первой функции matlab.

То, что я мог бы предложить в качестве теста, это поместить DoKalmanFilter и DoImageProcessing в отдельные сборки или приложения, а затем создать приложение, которое порождает два новых отдельных приложения. Таким образом, вы получаете два процесса, и MATLAB будет запускаться один раз внутри каждого процесса, давая вам возможность запускать ваши функции одновременно.

Если это сработает, вы можете начать думать об этом. Вы не хотите, чтобы приложения создавались и закрывались все время. Возможно, вам понадобится использовать межпроцессное взаимодействие между вашими процессами для передачи данных, это может стать уродливым: -)

2 голосов
/ 22 апреля 2010

Согласно документации Mathworks ,

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

Следовательно, как сказал Fuzz , вам нужно создать второе приложение или, по крайней мере, второй процесс, а не второй поток. Однако вы можете оставить код в одной сборке - вызов той же сборки из второго процесса дает ему собственные ресурсы.

В качестве альтернативы можно использовать инструмент параллельной обработки MATLAB для разделения каждого вызова функции по нескольким ядрам, ускорения каждого из них и их последовательного вызова. Однако это зависит от того, поддаются ли ваши функции MATLAB распараллеливанию.

0 голосов
/ 22 апреля 2010

Облачные вычисления полностью, брат. Вы просто указываете эту присоску в облако и позволяете такому провайдеру справиться с этим.

Конечно, есть накладные расходы на маршалинг данных в облако и из облака, но это никогда не будет конкурировать со временем, которое фактическая работа в matlab занимает для каждой транзакции.

Это действительно недорогое решение, которое экономически лучше масштабируется (и я говорю это при условии, что вы не запаркованы на серверной ферме мирового класса), чем вы можете сделать это самостоятельно.

Вот кое-что, что заставляет меня кататься: http://www.mathworks.com/programs/techkits/ec2_paper.html

Облако - это правда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...