問題タブ [parfor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - parfor ループに誤ったスライス変数があります
誰でも私に説明できますか、なぜ次のエラーu
が発生するのかh
で代用できるようになり(i,j)
まし(l)
たが、関連する変数を計算しようとしてもp
、 に従って と呼び、代わりに(m,n)
と書くとエラー メッセージが表示されます。、それぞれに下線を引くだけです。ではありません。MATLAB は次のように述べています。u(p)
u(m,n)
u(m,n)
u(p)
h(m,n)
説明: MATLAB が
parfor
ループを効率的に実行するには、MATLAB ワーカーに送信されるデータの量を最小限にする必要があります。parfor
MATLAB がこれを実現する方法の 1 つは、反復で変数にインデックスを付ける方法を制限することです。示された変数は、 と互換性のない方法で索引付けされていますparfor
。推奨処置 インデックス作成を修正します。インデックス付けの制限の説明については、Parallel Computing Toolbox ドキュメンテーションの「スライス変数」を参照してください。
ここで何が問題なのですか?
matlab - iterand あたりの労力の事前推定を使用して並列ループの実行時間を予測する (指定された数のワーカーに対して)
私は、PDE の特定の離散化 (既知のスパース構造) から生じる非常に大きなスパース行列の適応行列ベクトル乗算の MATLAB 実装に取り組んでいます。
多くの前処理の後、選択したエントリを計算したい多数の異なるブロック (たとえば、200 を超える) ができあがります。
前処理ステップの 1 つは、計算したいブロックごとの (数) エントリを決定することです。各エントリで同じ)。
https://stackoverflow.com/a/9938666/2965879のおかげで、ブロックを逆順に並べることでこれを利用できるようになり、MATLAB が最初に最大のものから開始するようになりました。
ただし、エントリの数はブロックごとに大きく異なるため、parfor を直接実行することは、ループに逆に供給されたとしても、エントリの数が最大のブロックによって厳しく制限されます。
私の解決策は、最大のブロックを連続して実行することです (ただし、エントリのレベルで並列化されます!)。これは、イテランドあたりのオーバーヘッドがあまり問題にならない限り問題ありません。ブロックは小さくなりすぎません。残りのブロックは parfor で行います。理想的には、MATLAB がこれを処理する方法を決定するようにしますが、入れ子になった parfor ループは並列性を失うため、これは機能しません。また、両方のループを 1 つにパッケージ化することは (ほぼ) 不可能です。
私の質問は、エントリ数に関する情報を考慮して、シリアル体制とパラレル体制の間のこのカットオフをどのように決定するのが最善かについてです (順序付けられたエントリの曲線の形状は、問題によって異なる場合があります)。私が利用できる労働者の数と同様に。
これまでは、標準の PCT ライセンスで利用可能な 12 のワーカーで作業していましたが、クラスターでの作業を開始して以来、このカットオフを決定することがますます重要になっています (多くのコアでは、直列ループは並列ループに比べてますますコストがかかりますが、同様に、残りを保持するブロックを持つことはさらにコストがかかります)。
12 コア (つまり、私が使用していた計算サーバーの構成) の場合、カットオフとしてワーカーあたり 100 エントリという妥当なパラメーターを見つけましたが、コアの数がそうでない場合、これはうまく機能しません。ブロック数に比べて小さくなりました (例: 64 対 200)。
コアの数をさまざまなパワー (1/2、3/4 など) で収縮させようとしましたが、これも一貫して機能しません。次に、ブロックをバッチにグループ化し、エントリがバッチごとの平均よりも大きい場合のカットオフを決定しようとしました。最後から離れているバッチの数:
(注: このコードはnum_entr_asc
、長さが の倍数でないベクトルでは機能しませんnum_core
が、読みやすくするために構造を省略することにしましたmin(...,end)
。)
< max(...,...)
また、カットオフが早期に検出されないようにするために必要な、両方の条件を組み合わせる (つまり、ワーカーごとの最小エントリと一緒にする) を省略しました。分散をどうにか使用することも少し考えましたが、これまでのところすべての試みは不十分です.
誰かがこれを解決する方法について良いアイデアを持っていれば、とても感謝しています。
この非常に長い質問を読んでくれてありがとう、
よろしく、
アクセル
Ps。私の「Dear stackoverflow」はフィルタリングされているように見えるので、ここで私の質問に対する解決策を何度も見つけてくれてありがとうと言いたい.
matlab - 同じ変数名は parfor で競合を引き起こしますか
私はこのような基本的なコードを持っています:
y
変数名がすべての反復で同じであるため、競合が発生しますか?
ubuntu - parfor ループ後に空の Matlab 変数
Matlab 2013a と i7 プロセッサを搭載した Ubuntu 13.04 マシンで、Matlab コードの一部を並行して実行しようとしています。
cross_validation()
行列を返します。ただし、このコードを実行した後でも、 variablescores
は 2 行 1 列の cell 配列のままで、各セルは空です。cross_validation()
何も返さないようです。
parfor ループを通常の for ループに変換すると、このコンピューターでも問題なく動作します。また、このコードを別のコンピューター (Windows 7、Matlab 2013b) で (parfor ループを使用して) テストしたところ、正常に動作しました。
の短いバージョンcross_validation()
は次のとおりです。
誰でもアドバイスできますか?
ありがとう!
matlab - parfor ループを使用して、MATLAB で複数のニューラル ネットワークをトレーニングする速度を上げることは可能ですか?
以下のコードのいずれかの for ループの代わりに parfor ループを使用しても、時間の改善は得られませんでした (場合によってはそれ以上かかることもあります)。
私が望むのは、複数のネットワークを同時にトレーニングして、各クラスターが異なるニューラル ネットワークのセットを実行するクラスターでこのコードを実行できるようにすることです。
に変更するparfor Neurons = 1:n
と、並列ループで予想されるように、「ニューロン」が順次/単調に変化しなくなったため、parfor ループが機能していることがわかります。ただし、「Neural Network Training (nntraintool)」の GUI が 1 つしか読み込まれないため、ワーカーが 1 つしかデプロイされていないように思えます。これに加えて、私は時間の改善を得ていません。異なる matlab ワーカーを使用して同時に複数のニューラル ネットワークをトレーニングすることは可能ですか? どのように?
大変感謝します。
matlab - 変数はインデックス付けされていますが、スライスされていません
以下のコードを並列化しましたが、シミュレーション時間は実際にはシリアル コードよりも 400 ~ 500 倍長くなります。これを引き起こす可能性があると私が考えることができる唯一の理由は、「変数 x はインデックス付けされていますが、parfor ループでスライスされていません」および「変数 p はインデックス付けされていますが、parfor ループでスライスされていません」というメッセージです。これがシミュレーション時間の大幅な増加の理由なのか、コードを並列化した方法なのか、誰でも確認できますか?
p=(1,i) と x(1,i) は、値があらかじめ設定された行列です。
matlab - parfor の問題: プロセスが 1 つしか実行されていない
matlab に parfor ループがあり、実行中は 1 つのプロセスのみが CPU を使用しており (トップとシステム モニターは同じ CPU 使用率を示しています。添付のスクリーンショットを参照)、parfor はより速く実行されません。どうして???
ubuntu 12.04 LTS、64 ビット matlab 2012b
ありがとう、マルシン&エドリック、
あなたが提案するように小さなテストケースを実行しましたが、このhttp://www.mathworks.com/help/distcomp/advanced-topicsで、内側のループコードが外側のループデータにアクセスすることが問題の原因であることに気付きました。 html、彼らはそれをアクセスブロードキャスト変数と呼んでいます。
parfor ループの開始時に、ブロードキャスト変数の値がすべてのワーカーに送信されます。このタイプの変数は便利で不可欠なものですが、ブロードキャスト変数が大きいと、クライアントとワーカーの間で多くの通信が発生する可能性があります。場合によっては、この目的のために一時変数を使用し、ループ内で一時変数を作成して割り当てる方が効率的かもしれません。
私の場合、ブロードキャスト変数は大量のデータを保持しているため、ワーカーに渡すのに問題があります。
一部のデータを削除すると、parfor ループは正常に機能します。