MATLAB parfor — не удается определить, ссылается ли «ModelUtil» на функцию или переменную?

#matlab

#matlab

Вопрос:

Я вызываю внешние функции в своем parfor цикле следующим образом.

 parfor idx = 1:2
    import com.comsol.model.*
    import com.comsol.model.util.*

    model = ModelUtil.create('Model');
    model.modelNode.create('comp1');

    model.geom.create('geom1', 2);
    model.geom('geom1').feature.create('sq1', 'Square');
    model.geom('geom1').feature('sq1').set('size', '0.03125');
    model.geom('geom1').feature('sq1').setIndex('pos', '0', 0);
    model.geom('geom1').feature('sq1').setIndex('pos', '0', 1);
    model.geom('geom1').run;
end

Error: MATLAB cannot determine whether "ModelUtil" refers to a function or variable.
See Parallel for Loops in MATLAB, "Unambiguous Variable Names".
  

После прочтения части «Однозначные имена переменных» в parfor документации MATLAB, я в значительной степени понимаю, почему возникает эта ошибка. Однако я понятия не имею, как это исправить.

Комментарии:

1. Вы пробовали использовать полное имя для ModelUtil вместо импорта? Т.е.: model = com.comsol.model.util.ModelUtil.create('Model');

2. @Alan Я только что проверил, но это не сработало. com на этот раз становится неизвестным. Error: MATLAB cannot determine whether "com" refers to a function or variable. See Parallel for Loops in MATLAB, "Unambiguous Variable Names". Любое другое решение? Это работает в обычном цикле for.

3. Верно, это звучит как ошибка пути к классу. Я полагаю, что comsol — это сторонняя библиотека, поэтому вам необходимо включить файл jar в classpath для каждой машины, на которой выполняется, когда вы создаете задание spmd. Самым простым способом было бы добавить его в filepath кластера или задания соответствующим образом.

4. @Alan Да, это сторонняя библиотека. Но эта вещь отлично работает в цикле for. Я никогда не уделяю этому особого внимания в обычном цикле for. Почему в parfor я должен «включать файл jar в путь к классу», пожалуйста?

5. Правильно, в цикле for вы работаете с одним экземпляром matlab на одной машине с одним путем к классу. С помощью цикла parfor вы потенциально * работаете на нескольких машинах, с несколькими экземплярами matlab, у каждого из которых свой собственный путь к классу. Может случиться так, что не все эти компьютеры будут иметь доступ к местоположению, в котором находится файл jar вашей сторонней библиотеки, поэтому вам придется явно предоставить его им всем. (* Matlab не знает, являетесь ли вы или нет, поэтому он должен предположить, что вы используете несколько машин)

Ответ №1:

Я столкнулся с той же проблемой с.Сетевые объекты. Как и вы, я обнаружил, что это отлично работает в непараллельном режиме, и проблема возникает только с parfor.

Это не вопрос путей, это чисто проблема синтаксического анализа Matlab.

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

Ответ №2:

Решение Vector у меня не сработало. Дело в том, что разные рабочие не видят библиотеку, которую вы используете: вам нужно обновить javapath в parfor с javaaddpath помощью.