Запуск многопроцессорных приложений от MATLAB - PullRequest
5 голосов
/ 13 апреля 2010

Я написал многопроцессорное приложение на VC ++ и попытался выполнить его с аргументами командной строки с помощью команды system из MATLAB. Он работает, но только на одном ядре --- какие-либо предложения?

Обновление : На самом деле, оно даже не видит второе ядро. Я использовал OpenMP и использовал omp_get_max_threads() и omp_get_thread_num() для проверки, и omp_get_max_threads(), по-видимому, 1, когда я запускаю приложение из MATLAB, но 2 (как ожидается), если я запускаю его из командного окна.

Вопрос : мой диспетчер задач сообщает, что загрузка ЦП близка к 100% - может ли это означать, что вышеупомянутый API работает со сбоями, он все еще работает как многопроцессорное приложение?

Подтверждение:

Я использовал Process Explorer , чтобы проверить, есть ли какие-либо различия в количестве потоков.

Когда я вызываю приложение из командного окна, поток 1 переходит на cmd.exe и 2 - на мое приложение.

Когда я вызываю его из MATLAB, потоки 26 предназначены для MATLAB.exe, 1 для cmd.exe и 1 для моего приложения.

Есть идеи?

Ответы [ 3 ]

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

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

Сделайте "set> plain.txt" из командного окна, в котором вы запускаете свое приложение plain, и "system ('set> from_matlab.txt')" из Matlab, и разведите выходные данные. Это покажет вам различия в переменных среды, которые представляет Matlab. Когда я это делаю, это появляется в среде, унаследованной от Matlab, но не в среде обычного командного окна.

OMP_NUM_THREADS=1 

Это похоже на настройку OpenMP, связанную с вызовами функций в вашем вопросе. Держу пари, что твое порожденное приложение это видит и уважает.

Я не знаю, почему Матлаб это настраивает. Но в качестве обходного пути, когда вы запускаете приложение из Matlab, вместо того, чтобы вызывать его напрямую, вызовите файл-оболочку .bat, который очищает переменную среды OMP_NUM_THREADS или устанавливает для нее более высокое число.

1 голос
/ 13 апреля 2010

Запустите команду за пределами Matlab и посмотрите, сколько ядер она использует. Не должно быть никакой разницы, когда он запускается из Matlab, потому что это просто вызов операционной системы. IE. эквивалентно запуску в командной строке.

EDIT

Хорошо, странно, что вы получаете, когда звоните feature('NumCores')? Какую версию Matlab вы используете?

Помогает ли это включить?

Размещено на imgur.com

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

вы должны выполнить в командной строке MATLAB:

setenv OMP_NUM_THREADS 4

, если вы хотите использовать 4 темы.

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