2016-07-07 10 views
1

浮動小数点数型/ double4構造体のAVX-256/512コードを探しています。*、+、/、 - 、スカラーなどの基本演算をオーバーロードし、ベクトルからの高速なパフォーマンスを向上させます。 float4/double4を使用して記述されたコード内の操作OpenCLはこれらのデータ型を組み込み関数として持っていますが、XeonPhi上で実行されるC++コードでは、512ビットSIMDユニットを利用する新しい実装が必要です。AVX float4/double4 struct

+1

トピックを除外し、不注意です。 SIMDベクトルをベクトルとして使用することは時には妥当ですが、ドット生成と正規化を考慮すると、水平に実行するのは非効率です。もちろん追加は大丈夫です。したがって、ベクトルに対してどのような操作を実行するかによって異なります。 – harold

+0

私はドットの製品はこのアプローチでは悪い知っている。私がしたい操作は*、+、/、 - 、+ =、 - =、/ =、* =、mulitplyでスカラーで割ります。 – user1382302

+1

それでいいです。もちろん、512ビットのSIMDを実際には使用しません.4つの倍精度は、後で256ビットにすぎません – harold

答えて

1

あなたが探しているものは、Agner FogのVector Class Library(VCL)です。私はこれを使ってOpenCLのベクトル型を置き換えました。

VCL float4Vec4fであり、double4Vec4dです。 OpenCLと同じように、AVXとAVX512を心配する必要はありません。 Vec8dを使用してAVX用にコンパイルすると、2つのAVXレジスタを使用してAVX512をエミュレートします。

VCLには、*,+,/,-,+=,-=,/=,*=, multiply and divide by scalarなど多くの機能があります。

OpenCLとVCLの主な違いは、OpenCLは基本的にCPUディスパッチャを作成することです。 VCLの場合は、自分でCPUディスパッチャを作成する必要があります(ドキュメントでこれを行うには、いくつかのコード例が含まれています)。 VCLは、SSE2からAVX512のための最適化された機能を備えているので、いくつかの異なる命令セットをターゲットにすることができます。 Knights Corner Xeon Phiのa special version of the VCLもあります。

OpenCLのもう1つの機能は、置き換えのための構文です。 OpenCLでfloat4のコンポーネントの順序を逆にするにはv.wzyxを実行しますが、VCLではpermute4f<3,2,1,0>(v)を実行します。私はcreate this syntax with C++になる可能性がありますが、わかりません。

VCL、OpenMP、およびカスタムCPUディスパッチャを使用して、私は主にCPU上でOpenCLを置き換えました。