2016-05-09 6 views
2

私はopenMPを学んでいて、私の限られた知識で私のコードを軽視しました。 OpenMPのベクトル化手法を使用してこのコードを改善しようとしています。しかし、関連する読書資料(link)を調べているうちに、long doubleデータ型でベクトル化操作を行うことはできませんでした。誰かがそれがなぜそうであるかに関する情報を提供し、精度を下げる以外の解決策を提案することはできますか?long double型のopenMPベクトル化操作はできませんか?

SIMDハードウェアでサポートされていない操作を避けるLinuxでは(80ビット長の)倍精度演算子、および剰余演算子「%」はSIMDハードウェアでサポートされていない演算の例です。 「

PS私はINTEL C++コンパイラ16.0.2、INTEL XEON processsor、128bit long vector registerとLinuxを使用しています。私のデータ型は、ほとんどがlong doubleです。

+0

私はあなたがベクトルの組み込み関数との並列性を混同していると思います。 IntelのISAに対応していなくても、これらの操作を並列化することは可能だと思います。とにかく、実行可能な完全な例を投稿する必要があります。 – Mikhail

+0

x86 SIMDハードウェア(SSE〜AVX512)は、32ビットおよび64ビット浮動小数点演算のみをサポートし、整数除算命令を持たないためです。 –

+0

なぜロング・ダブルを使用していますか? –

答えて

3

x86命令セットのSIMD命令は、(16ビット浮動小数点のためのいくつかの限定されたサポート)32ビットおよび64ビットの浮動小数点演算をサポートします。さらに、64ビット×64ビット×128ビットスカラ整数命令(例えば、mulx)が存在しても、対応するSIMD命令は存在しない。多くの人々が効率的な128ビット整数x86 SIMD算術を実装しようとしました(multiplicationと多分additionの例外がいくつかあります)。一般的なx86 SIMD整数除算命令はありません。

しかし、浮動小数点の人がdouble-doubleを使用してより高精度の浮動小数点SIMD演算でより多くの成功を収めているため。ダブル・ダブルは、80ビットのロング・ダブルで64ビットの精度と比較して、106ビットの精度を備えています。しかし、すべてのC++コンパイラが80ビットのlong doubleを使用するわけではありません。一部のものは、精度が54ビットしかない倍精度(例えばMSVC)を使用し、精度の113ビットを有する128ビット四辺精度を使用するものもあれば、Wikipediaはいくつかのコンパイラでlong doubleがdouble doubleとして実装されていると主張するものもある。

私は二重、二重hereのいくつかの詳細を説明しました。 double doubleはIEEE浮動小数点型ではなく、いくつかの珍しいプロパティがあることに注意してください。また、double-doubleの範囲はdoubleと同じであるため、精度が向上します。

どのくらいの速さでダブルダブルロングダブルに比べて?私はこれをテストしたことがありません。しかし、倍精度浮動小数点数の乗算と加算演算のバランスをとると、倍精度浮動小数点演算は倍精度演算より約10倍遅くなることが分かりました。長いdoubleは確かにdoubleよりも遅いです(doubleとして実装されている場合を除く)。しかし、ダブルダブルでSIMDを使うことはできるが、ロングダブルでbulit-inを使うことはできないので、速度はSIMDの幅に比例して向上する。 SSE2で2倍、AVXで4倍、AVX512で8倍になります。

は、OpenMPのsimd建設はいえダブルダブルを実装することを期待しないでください。これを自分で実装するか、ライブラリを探す必要があります。

関連する問題