2016-08-11 2 views
4

Я написал модуль Julia с различными функциями, которые я вызываю для анализа данных. Некоторые из этих функций зависят от пакетов, которые включены в начале файла «NeuroTools.jl».Предотвращение перезаписи модулей в распараллеливании Julia

module NeuroTools 

using MAT, PyPlot, PyCall; 

function getHists(channels::Array{Int8,2}... 

Многие функции у меня полезны работать параллельно, так что я написал скрипт драйвера для отображения функций в разных потоках с помощью remotecall/выборки. Чтобы загрузить функции в каждом потоке, я запускаю Julia с параметром -L для загрузки моего модуля на каждого рабочего.

julia -p 16 -L NeuroTools.jl parallelize.jl 

Довести загруженные функции в сферу, то «parallelize.jl» сценарий имеет линию

@everywhere using NeuroTools 

Моя параллельная функция работает и выполняет правильно, но каждый рабочий поток выкладывает кучу предупреждений из перезаписываемых модулей.

WARNING: replacing module MAT 
WARNING: Method definition read(Union{HDF5.HDF5Dataset, HDF5.HDF5Datatype, HDF5.HDF5Group}, Type{Bool}) in module MAT_HDF5... 
(contniues for many lines) 

Есть ли способ загрузить модуль по-разному или изменить область действия, чтобы предотвратить все эти предупреждения? Документация не совсем понятна по этому вопросу.

+1

Обратите внимание, что текущее распараллеливание Julia, например. с '-p 16',' @ везде' и т. д. основаны на отдельных процессах, а не на отдельных потоках. Многопоточность начнет появляться в Julia 0.5 –

ответ

4

совпадению я искал same thing утром

(rd,wr) = redirect_stdout() 

Таким образом, вы должны были бы назвать

remotecall_fetch(worker_id, redirect_stdout) 

Если вы хотите полностью отключить его, это будет работать

Если вы хотите снова включить его, вы можете

out = STDOUT 
(a,b) = redirect_stdout() 
#then to turn it back on, do: 
redirect_stdout(out) 
0

Это исправлено в последних выпусках, и @everywhere using ... подходит, если вам действительно нужен модуль в сфере охвата всех работников. This GitHub issue рассказывает о проблеме и имеет ссылки на некоторые из других соответствующих обсуждений.

Если вы все еще используете более старые версии Julia, где это было, просто напишите using NeuroTools в NeuroTools.jl после определения модуля, а не для выполнения @everywhere using NeuroTools. Parallel Computing раздел документации Джулией для версии 0.5 говорит,

using DummyModule заставляет модуль должен быть загружен на все процессы; однако модуль вводится в сферу действия только на тот, который выполняет оператор.

Выполнение @everywhere using NeuroTools используется, чтобы сказать каждый процессов загрузки модуля на все процессы, и в результате куча replacing module предупреждений.