2016-08-11 9 views
4

私は、データを分析するために呼び出すさまざまな関数を持つJuliaモジュールを作成しました。これらの関数のいくつかは、パッケージ "NeuroTools.jl"の先頭に含まれるパッケージに依存しています。ジュリア並列化でモジュールを上書きしないようにする

module NeuroTools 

using MAT, PyPlot, PyCall; 

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

私が持っている機能の多くは、並列で実行するのに有用であるので、私はremotecall /フェッチ使用して別のスレッドに機能をマッピングするために、ドライバのスクリプトを書きました。各スレッドで関数を読み込むために、Juliaを-Lオプションで起動して、モジュールを各ワーカーに読み込みます。 「parallelize.jl」スクリプトはライン

@everywhere using NeuroTools 

私の並列機能が動作し、適切に実行されますが、各ワーカースレッドが警告の束を吐き出した、スコープにロードされた機能を持って

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

上書きされているモジュールから削除します。

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

現在のジュリア並列化、例えば、 '-p 16'、' @ everywhere'などは別々のスレッドではなく、別々のプロセスに基づいています。 Julia 0.5でマルチスレッド化が開始される –

答えて

4

偶然に私はあなたがそれを完全にオフにしたい場合は、これは

に動作します

remotecall_fetch(worker_id, redirect_stdout) 

を呼び出す必要があると思います

(rd,wr) = redirect_stdout() 

今朝same thingを探していましたそれを元に戻したい場合は、

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

これは最新のリリースで修正されており、実際にすべての作業者の範囲にモジュールが必要な場合は、@everywhere using ...が適切です。 This GitHub issueはこの問題について話しており、他の関連する議論の一部にリンクしています。

この場合、古いバージョンのJuliaを使用している場合は、@everywhere using NeuroToolsを実行する代わりに、NeuroTools.jlusing NeuroToolsを書き込んでください。バージョン0.5のためのジュリアドキュメントのParallel Computingセクションが言う 、

using DummyModuleは、モジュールがすべてのプロセスにロードされます。しかし、モジュールは、文を実行しているスコープ内でのみスコープに入れられます。

すべてのプロセスにモジュールをロードするプロセスに通知するために使用@everywhere using NeuroToolsを実行し、その結果はreplacing module警告の山でした。

関連する問題