1

MATLAB コードの計算速度を上げる必要があります。この目的のために、インテル® IPP ライブラリーを使用してベクトルを操作する C 言語のプログラムを書き直しました。そして、ここで問題が発生しました。いくつかのステップの後、MATLAB の主な計算サークル プログラムと私の C プログラムは、アルゴリズムの異なるパスに移動します。これは、計算が完全に等しくなく、プログラムが MATLAB の計算結果と比較してエラーを蓄積するために発生します。このため、私のプログラムは正しい勾配を計算せず、最適化アルゴリズム全体がうまくカウントされません。そのため、計算速度は向上しましたが、計算効率が低下しました.100ステップ目のMATLAB計算最適化エラーは0.004で、Cプログラム計算は0.05であり、これは私の仕事にとって重要です.

どの関数でエラーが発生したかを確認し、見つかったもの: 一般的な演算 (ippsAdd_64f_A53、ippsSub_64f_A53、ippsMul_f64_A53、ippsDiv_64f_A53、および通常の C 演算、-、*、/ など) は MATLAB の結果と等しくなり、合計エラーはゼロですが、math.h双曲線関数は、約 -3..-5e-13 の 75699 要素の配列で合計エラーを出します。Intel 関数 ippsCosh_64f_A53 などは、-1..-5e-14 程度の合計エラーを出します。

高精度の双曲線関数と指数関数を計算するライブラリを知っていますか? それとも、Visual Studio 2012 にいくつかのコンパイラ設定があり、それが役に立ちますか?

Intel Parallel Studio XE 2013 がインストールされた VS 2012 で Ipp64f データ型 (double) で行われたすべての計算。

PS: 合計誤差は MATLAB で計算されました。C プログラムからレベル 4 のマット ファイルに配列を保存し、MATLAB にインポートして、MATLAB 配列とインポートされた配列の差を sum(M_cosh - C_cosh); のように合計しました。

4

1 に答える 1

1

答えではなく、より拡張されたコメントです:

あなたが書く

MATLAB コードの計算速度を上げる必要があります

そして尋ねる

高精度の三角関数と指数関数を計算するライブラリを知っていますか?

はい、私はそのようなライブラリをいくつか知っていますが、それらは現在の CPU (主に 32 ビットと 64 ビット) で通常提供されるよりも多くのビットを持つ浮動小数点数を実装し、ソフトウェアでこれらの数値の算術演算を実装します。計算速度を上げる目的では、そのようなライブラリは役に立たず、精度の向上は実行時間の増加を犠牲にして明示的に購入されます。他の多くのユーザーにとって、これは妥当なトレードオフです。

マシン番号に精度を維持するアルゴリズムを実装する、広く使用されている、または評価の高いライブラリを知りません。ここには詳細に入るスペースはありませんが、問題の概要については、 Kahan の総和アルゴリズムについて読み始めるよりも悪いことをすることができます。

Mathworks は、Matlab がどのようなアルゴリズムを実装しているかを明らかにすることについて、やや恥ずかしがり屋です。ただし、Matlab の計算カーネルのほとんどは C (または C++ だと思います) で記述され、ライブラリにコンパイルされます。それらの多くはマルチスレッド化されています。Matlab よりも優れたパフォーマンスを発揮するコードを作成しようとしている場合は、マルチスレッドの高性能数値コードを作成する必要があります。

Matlab が実装するアルゴリズムに精度を維持する機能があることを知っても、まったく驚かないでしょう。結局のところ、Mathworks は、問題の特定の組み合わせに対して機械精度が十分であるかどうかなどの低レベルの問題をユーザーが考慮する必要なく、幅広い問題を解決するツールを市場に提供しようとしています。データセット。

ついに。あなたの最初の試みが失敗したことは驚きではありませんが、速度で Matlab を打ち負かすことは印象的です。また、Matlab よりも優れたパフォーマンスを発揮し、満足のいく結果が得られた独自のコードの成功を報告したときに、うれしい驚きを覚えることを懐疑的に楽しみにしています。

于 2013-11-10T10:00:57.477 に答える