У меня есть функция, которую я использую для поиска значения на основе индекса.Для вычисления значения требуется некоторое время, поэтому я хочу сделать это с 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"]
будет полезным.Но нет, это тоже не работает.
Вопрос: «Я явно что-то делаю неправильно или это ошибка?»