Оценка клеток параллельно в Mathematica - PullRequest
5 голосов
/ 04 августа 2011

У меня есть файл Mathematica длиной в несколько сотен ячеек, и я хочу использовать параллельную оценку. У меня 2 процессора по 4 ядра на каждой машине с памятью 16 Гб. Моя лицензия Mathematica позволяет мне запускать максимум 2 основных ядра, при этом 1 из основных может иметь 4 подчиненных ядра (это моя интерпретация после того, как я некоторое время играл с ней).

Раньше я запускал свой код в двух основных ядрах в двух разных ноутбуках. Чтобы ускорить процесс, я попытался инкапсулировать несколько ячеек с ParallelEvaluate[], и это, похоже, сработало. Затем у меня также есть 4 копии моего кода, которые не знают друг друга через одно из основных ядер, и это нормально. (Я в основном пытаюсь запустить как можно больше копий своего кода / mathkernel параллельно. Я пока не стреляю во что-то действительно параллельное).

Поскольку мой код слишком длинный и сложный, я не хочу снова редактировать каждую ячейку, чтобы они выполнялись параллельно. Есть ли что-нибудь волшебное, что я могу положить в начало своей тетради, чтобы каждая ячейка, вычисленная после этого, была по умолчанию ParallelEvaluate[ ... cell contents.... ]?

1 Ответ

2 голосов
/ 09 августа 2011

Как предположил belisarius, $ Pre = ParallelEvaluate делает именно то, что я хочу. Одна проблема заключалась в том, что когда я делаю $ Pre = Identity, чтобы отключить его, чтобы я мог вернуться к своему основному ядру, mathematica все еще пытается оценить это в подчиненных ядрах вместо главного и завершается неудачей. В итоге я решил это следующим образом: SetSharedVariable [parallelcontrol]; параллельный контроль = ParallelEvaluate; $ Pre: = параллельный контроль; ... здесь все оценивается в рабах ...; параллельный контроль = личность; .... все возвращается, чтобы быть оцененным только на главном ... Вот пример запуска на моем ноутбуке, который имеет 2 ядра:

LaunchKernels[]

{KernelObject [1, "локальный"], KernelObject [2, "локальный"]}

$KernelID

0

ParallelEvaluate[$KernelID]

{1, 2}

SetSharedVariable[parcontrol]; $Pre := parcontrol; parcontrol = ParallelEvaluate

Null [ParallelEvaluate]

$KernelID

{1, 2}

parcontrol = Identity

{Идентичность, идентичность}

$KernelID

0

parcontrol = ParallelEvaluate

ParallelEvaluate

$KernelID

{1, 2}

...