Как получить определения переменных / функций, установленные в Parallel (например, с ParallelMap)? - PullRequest
2 голосов
/ 15 января 2012

У меня есть функция, которую я использую для поиска значения на основе индекса.Для вычисления значения требуется некоторое время, поэтому я хочу сделать это с ParallelMap и ссылается на другую подобную функцию, которая возвращает список выражений, также основанный на индексе.

Однако, когда я настраиваю все это на первый взгляд разумно, я вижу очень странное поведение.Во-первых, я вижу, что функция работает, хотя и очень медленно.Однако для больших индексов активность процессора в Taskmangler остается полностью нулевой в течение продолжительного периода времени (то есть 2-4 минуты), где все экземпляры Mathematica кажутся инертными.Затем, без малейшего всплеска использования процессора, появляется результат.Это еще один случай Mathematica spukhafte Fernwirkung ?

То есть я хочу создать переменную / функцию, которая хранит выражение, здесь список целых чисел (ListOfInts), а затемна параллельных рабочих я хочу выполнить некоторую функцию для этого выражения (здесь я применяю набор правил замены и беру Min).Я хочу, чтобы результат этой функции также индексировался с помощью того же индекса в другой переменной / функции (IndexedFunk), чей результат затем доступен в главном экземпляре Mathematica:

(*some arbitrary rules that will convert some of the integers to negative values:*)
rulez=Dispatch[Thread[Rule[Range[222],-Range[222]]]];

maxIndex = 333;
Clear[ListOfInts]
Scan[(ListOfInts[#]=RandomInteger[{1,999},55])&,Range[maxIndex ]]
(*just for safety's sake:*)
DistributeDefinitions[rulez, ListOfInts]

Clear[IndexedFunk]
(*I believe I have to have at least one value of IndexedFunk defined before I Share the definition to the workers:*)
IndexedFunk[1]=Min[ListOfInts[1]]/.rulez
(*... and this should let me retrieve the values back on the primary instance of MMA:*)
SetSharedFunction[IndexedFunk]

(*Now, here is the mysterious part: this just sits there on my multiprocessor machine for many minutes until suddenly a result appears.  If I up maxIndex to say 99999 (and of course re-execute the above code again) then the effect can more clearly be seen.*)
AbsoluteTiming[Short[ParallelMap[(IndexedFunk[#]=Min[ListOfInts[#]/.rulez])&, Range[maxIndex]]]]

Я считаю,это какая-то ошибка, но потом я все еще пытаюсь понять Mathematica Parallel, поэтому я не могу быть слишком уверен в этом заключении.Несмотря на удручающе медленную работу, он, тем не менее, впечатляет своей способностью выполнять вычисления, фактически не требуя от этого ЦП.

Я подумал, что, возможно, это связано с тем, какой протокол связи используется между главным и подчиненным процессами.Возможно, он настолько медленный, что кажется, что процессоры ничего не делают, если на самом деле они просто ждут отправки следующего бита какого-то определения или другого.В этом случае я думал, что ParallelMap[..., Method->"CoarsestGrained"] будет полезным.Но нет, это тоже не работает.

Вопрос: «Я явно что-то делаю неправильно или это ошибка?»

1 Ответ

3 голосов
/ 15 января 2012

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

Кстати, в любой версии Mathematica, о которой я знаю, нет функции SetSharedDefinition. Вы, вероятно, намеревались написать SetSharedVariable. Но все равно удали этот злой зов! Чтобы избежать конфликтов, верните результаты параллельных вычислений в виде списка пар, а затем соберите их в значения переменной вашей переменной в основном ядре:

Clear[IndexedFunk]
Scan[(IndexedFunk[#[[1]]] = #[[2]]) &, 
   ParallelMap[{#, Min[ListOfInts[#] /. rulez]} &, Range[maxIndex]]
]

ParallelMap обеспечивает автоматическое распределение определений, поэтому вызов DistributeDefinitions является излишним. (Как незначительное примечание, это не правильно, как написано, пропуская переменную maxIndex, но об этом упущении автоматически заботится ParallelMap в этом конкретном случае.)

EDIT, NB!: Автоматический дистрибутив применяется только к 8-й версии Mathematica. Спасибо @MikeHoneychurch за исправление.

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