問題タブ [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.
c++ - Matlab/C++: C++ Mex 永続オブジェクトを使用した並列計算でのセグメンテーション違反 (ハンドルを変換できません)
この投稿の参考文献:
[1] http://www.mathworks.com/matlabcentral/newsreader/view_thread/278243「C++ オブジェクトを mex 呼び出し間で永続化し、堅牢にする」。
[2] MATLAB parfor および C++ クラス mex ラッパー (コピー コンストラクターが必要ですか?)「MATLAB parfor および C++ クラス mex ラッパー (コピー コンストラクターが必要ですか?)」
[1] で提案された方法に基づいて、Matlab/C++ インターフェイスの実装に成功しました。とにかく、Matlab Parallel Computing でシステムを使用しようとすると問題が発生します。
MEX インターフェイスで matlab ハンドルと C++ ポインターの間の変換を試みると、セグメンテーション違反が発生します。
より明確にするために、[1] で提案された構造を要約します。システムには、次の通信スキームを使用する 3 つのファイルがあります。
[myInterface.m] <--> [myMexInterface.cpp] <--> [myClass.cpp]
どこ
- myInterface.m は matlab クラスです
- myMexInterface.cpp は C++ (mex) 関数です
- myClass.cpp は C++ (mex) クラスです
このシステムの使用は、次の 2 つのフェーズに分かれています。
- 構築: matlab オブジェクト myInterface が作成されます。これにより、C++ myClass オブジェクトの作成を呼び出す myMexInterface.mexa64 が呼び出されます。myClass の C++ ポインタは、myMexInterface.mexa64 を介して myInterface に送り返され、さらに使用するために保存されます。特に、myMexInterface.mexa64 は、myClass の C++ ポインターを matlab ハンドルに変換します。
- matlab の C++ クラスの使用: myInterface は、myMexInterface.mexa64 を介して渡され、オブジェクト myClass の関数を呼び出すメソッドをクライアントに提供します。このフェーズでは、正しい C++ オブジェクトで関数を呼び出すために、構築フェーズ中に myInterface から格納されたハンドルが myMexInterface.mexa64 に必要です。もちろん、このフェーズでは、myMexInterface.mexa64 は、Matlab ハンドルから C++ ポインターへの逆変換を実行します。
私の実装では、それはシングル スレッドで動作し、ハンドルからポインタへの変換中にセグメンテーション違反エラーが発生します。特に、myMexInterface.cpp に注目したいと思います。実行するコマンドは、最初の引数として文字列を介して渡されますが、(第 2 フェーズの操作の場合) 2 番目の引数は、そのインターフェイスに関連付けられた C++ オブジェクトに関連する matlab ハンドルです。
segfault を生成する関数 convertMat2Pt は、[1] で提案された解決策の一部である class_handle.hpp を含めることから来ています。特に、segfault が convertMat2HandlePtr である class_handle.hpp 内の関数:
実際には、そのキャストで実際に何が起こっているのか明確ではないため、より深い分析に進むことはできません. 私が想像できるのは、何らかの理由で、Matlab Parallel Computing が、以前に作成された C++ オブジェクトとの矛盾を生成することです。
segfault を生成する matlab クライアント関数は次のとおりです。
状況を単純化するために、matlabpool で 1 つのワーカーのみを開き、parfor は 1 つのループのみを実行することに注意してください。とにかく、まだエラーが発生しています。もちろん、parfor ブロックがなくても、aFunction() を複数回呼び出してもエラーは発生しません。
コマンドウィンドウで得られるのは次のとおりです。
ご覧のとおり、インターフェイスは正しく作成され、aFunction は 'out' に対して値 3 を正しく返します (これは複数の呼び出しに対しても機能します)。その後、既知のように、matlab オブジェクトが保存されると parfor ループが開始されます (実際には、2 回保存される理由は明確ではありませんが、myInterface オブジェクトを保存すると、コマンド ウィンドウからでも発生します)。最後に、新しい myInterface がハンドル 0 で作成され、ハンドルが正しい以前の値に復元されます。ただし、aFunctions の呼び出しは失敗します。
最後に、myInterface matlab クラスを報告します。
[2] で提案されているように、loadobj、saveobj 関数を含めました。クラスには、ロード/保存操作を実現するために「Transient」プロパティがあることに注意してください。
誰かの助けになることを願って、この投稿が誰かを助けることができることを願っています.
よろしく、 ガブリエレ・グアランディ
matlab - 私のループを適応させて、matlab の parfor で動作させるにはどうすればよいですか?
私はMatlabが初めてです。parfor ループを使用して、非常に時間のかかるタスクを実行します。以下のスニペットを参照してください。ただし、Matlab からエラー情報を取得しました。誰でも助けることができますか?parfor に関するドキュメントを読みましたが、何をすべきかわかりません...
ありがとうございました。
matlab - MatlabでCore i3を使用してPARFORで4つの作品を並列化する方法
Ubuntu 64 ビット用の Matlab R2012b があります。Intel Core i3 CPU M 330 @ 2.13GHz × 4 を持っています。
parforを使用して 4 つのループを同時に並列化したい。Intel Core i3 には 2 つのコアと 4 つのスレッドがあるため、次のコードを使用します。
そして、次のエラーが表示されます。
エラー:
最小で 4 つのワーカーを要求しましたが、クラスター "ローカル" には、最大 2 つのワーカーを許可するように NumWorkers プロパティが設定されています。これより多くのワーカー (ローカル クラスターの場合は最大 12) で通信ジョブを実行するには、クラスターの NumWorkers プロパティの値を増やします。ローカル クラスターの NumWorkers の既定値は、ローカル マシンのコア数です。
なんで?私のマシンの NumWorkers のデフォルト値は 2 ですが、同時に 4 つのループを実行できる場合、どうすれば取得できますか?
matlab - 外部ブール値に基づくif/else句を含むPARFOR
多数のグリッドボックスの特性を並行して計算する簡単な化学シミュレーションを作成しました。したがって、並列ループを使用してY次元にインデックスを付けます。
これは正常に機能します。ただし、次のコードに示すように、ブール値を使用して特定のアクションを実行するかどうかを制御しています。これは、Yで単純なfor
ループを使用する場合は正常に機能しますが、を使用するparfor
場合、コードoptionalArg
は定義されていないクレームで失敗します。
stackTest
の場合は正常に動作しますが、 ;の場合は正常に動作controlArg = true
しません。controlArg = false
私が見つけたそれを回避する唯一の方法は、からoptionalArg
独立して定義することですcontrolArg
。言うまでもなく、これは問題の単純化されたバージョンですが、これを説明してくれる人には感謝します。ループがグローバルで抱えている問題のサブセットだと思いparfor
ますが、グローバルを定義していないので、少し混乱しています。
よろしく、
Skipsh
matlab - ユーザー関数を使用したデータベースでの Matlab parfor
単一の巨大なバイナリ ファイルに含まれる一連の画像 (~10^7) があります。すでに持っている機能を使って効率的に読み込んで分析したい。コード内のそのユーザー関数の各反復にfoo
は約 0.1 秒かかるため、コードがデータベース全体を読み取る単純な for ループを使用してデータベース全体を処理するには数日かかります。
できる限り関数を最適化しましたfoo
(可能な場合はコードをベクトル化し、適切なデータ クラスを使用するなど)。まだ行っていない唯一のことは、mex バージョンを作成することです。これを使おうと思ったparfor
のですが、うまくいきませんでした。各画像は独立していますが、上記のコードはデータをシリアルに読み取るため、実際には並列化できません。オプションがこのコードとデータベースにアクセスできるようにするにはどうすればよいparfor
ですか? ありがとう
matlab - parfor goind として Matlab の「Assertion Failed」エラーが発生しましたか?
私はコードセグメントを持っています
そして、parfor セクションが 1 つのエポックを完了すると、2 番目のエポックの開始時に、Matlab は次のエラーを返します。
コードにバグは見つかりませんでした。アイデアはありますか?
matlab - Matlab parfor ループのインデックス付け
matlab で parfor を使用して、この単純なコードで何が起こっているか知っている人はいますか? ありがとう、
行列を 4 つの配列にスライスし、各配列の要素を個別に更新したい
ここに簡単なバージョンがあります:
エラー: 'a' の有効なインデックスは parfor ループで制限されています。
でも、
これは機能します:
同じエラーのある別の単純な非動作バージョン:
私のアプリケーションでは、インデックス j は、いくつかのアルゴリズムを介して配列ごとに個別に生成されます
performance - Matlab が並列関数から結果を取得するのが遅い
2 つの Matlab 関数を並行して実行する必要があります。問題は、それらからの結果の取得が実行よりもはるかに遅いことです。
最初の方法:
2 番目の方法:
結果を速く返すにはどうすればよいですか? 同時に 3 つの異なる関数を実行する MATLAB の並列プログラミングを見つけましたが、速度については何もありません。
arrays - parfor内の配列インデックスのMatlab乗算イテレータ - スライス
3 行目 (tt) をスライスすることは可能ですか? このコードは単純化されていますが、問題は似ています。配列インデックスで乗算イテレータ (3*i) を使用していますが、機能しません。ひょっとしたら、いくらでも変えられるかもしれません。
ありがとう :)