問題タブ [mixed-programming]
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++ - Visual Studio で MATLAB を直接呼び出す (マルチスレッド)
現在、Visual Studio で MATLAB を直接呼び出そうとしていますが、機能していないようです。
明確にするために、例として次のデモ ケースを取り上げます。つまり、MATLAB を使用して を計算し2+3
ます。結果、すなわちans = 5
が行に出力されるべきであることが予想されますprintf("%s\n", buf);
が、これは空であることが判明しました。ちなみに、MATLAB エンジンはengOpen()
正常に開かれています ( )。
より詳しい情報:
- MATLAB バージョン: R2014a x64
- Visual Studio バージョン: 2013 プロフェッショナル
- プロジェクトのビルド プラットフォームも x64 に設定されています。
- コードの実行中に MATLAB コマンド ウィンドウが作成されますが、これは想定どおりです。
c++ - Matlab エンジン呼び出しの高速化
MATLAB Engine APIを使用して MATLAB と C/C++ を接続しています。
私の特定のケースでは、MATLAB を使用して何かを計算し、結果を C で出力します。ただし、両側でのさまざまなテストを通じて、C のパフォーマンスが大幅に低下していることに気付きました。
以下は、MATLAB 関数呼び出しの例です。
C 側では、次のように同様の関数を呼び出します。
C++ でのタイマーの実装は次のようになります。
上記の MATLAB コードは、行列 ( ) の設定を含めて毎秒約 180 フレームで実行されますがdata
、C コードは 24 FPS でのみ実行されます。tic
/を使用toc
して MATLAB で実行時間を測定しましたが、独自のタイマーの実装は C/C++ 側で使用されています。
アプリケーションのプロファイリング中に、MATLAB エンジンの呼び出しがボトルネックであることに気付きました。Linux MATLAB エンジンの実装が MATLAB とのインターフェイスに名前付きパイプを使用していることは知っていますが、MATLAB とそのエンジンとの通信を高速化する方法があるかどうか疑問に思っていました。
c++ - OpenCV Mat ファイルを Matlab マトリックスに変換する
OpenCV Mat ファイルを Matlab マトリックスに変換する Matlab エンジンを作成します。しかし、私は間違った結果を得ました。直接テストできるように、コードを添付しました。
以下のコードがこの問題の原因であると思われますが、修正方法がわかりません。
c++ - C++ OpenMP 並列から Fortran サブルーチンを呼び出すと動作するはずですか?
C++ 関数から Fortran サブルーチンを呼び出し、その C++ 関数が OpenMP の parallel for 構造内で呼び出されると、Fortran サブルーチンは時々異なる値を返します。これは、同じ入力 (50 個の引数) で同じ結果を返すブラックボックス サブルーチンです。何百もの異なる入力の組み合わせに対して実行するために、サブルーチン呼び出しを並列化しました。プログラムを 2 回実行し、各サブルーチン実行の結果を出力すると、結果は同じではありません。
問題の詳細:
- シリアル バージョンは一貫性があり、正常に動作しており、常に同じ答えが得られます。
- サブルーチンは疑似乱数を使用しません。
- サブルーチンは、同じ .F90 ファイル内の他のサブルーチンを呼び出します。
- ネストも、openmp プラグマも、fortran サブルーチン内のインクルードもありません。
- Fortran サブルーチン内で OpenMP API 関数を使用しようとすると、意味不明な結果が返されます。
- gfortran でコンパイルするときに -fautomatic、-fopenmp、および -frecursive を使用しています (gcc 5.2.0 を使用しています)。すべてのサブルーチンは RECURSIVE にしました。すべてが正常にコンパイルおよびリンクされており、.exe を実行すると問題が発生します。
- Fortran サブルーチンは I/O にアクセスしません。すべての変数は引数を介して渡されます。COMMON または SAVED ブロックはありません。すべてのサブルーチンは仮引数を使用し、出力変数はすべてのサブルーチン内で明示的に初期化されます。
- #pragma omp parallel for で OpenMP 句を使用していません。
- スレッドの数が使用可能なプロセッサの数よりも少ない場合、結果間の不一致の数は減少します。スレッドをプロセッサにバインドしても問題は解決しません。
コードは巨大ですが、問題を説明するために例で単純化することができました:
c++ - C++ および混合プログラミングにおけるポインターのデフォルト引数
C++ でのポインターのデフォルト引数の使用法は、次のコードで実証できます。
この場合、プログラムの出力は
一方、オプションの引数を Fortran から C++ に渡そうとしても、うまくいきません。次のコード例は、状況を示しています
myfunc.cpp _
およびFortran メインプログラム
混合コード (Fortran と C++) は、次のコマンドを使用してエラーなしでコンパイルできます。
しかし、プログラムは印刷します
この場合。それで、この問題の解決策はありますか?ここで何かが足りないのですか?混合プログラミングでデフォルト引数を使用すると、期待どおりに機能しないと思いますが、この時点で提案が必要です。