2016-11-24 14 views
1

処理速度向上のための並列処理アルゴリズムを見ています。 Agner Fog's vector class library, VCLをテストしたいです。処理速度のベクトルクラスライブラリ

Vec16c(SSE2命令セット)とVec32c(AVX命令セット)のように、異なるベクタークラスを選択する方法が不思議です。

私はIntel®Atom™x5-Z8350プロセッサを使用しており、仕様に応じてSSE4.2命令セットをサポートしています。

ハードウェアのサポートに関して、どのように効果的にベクタークラスを選択できますか? 私のプロセッサについて言えば、AVX命令セットに推奨されるVec32cを使用できますか?

あなたのような、命令セットは、あなたがのためにコンパイルしているターゲットに対して有効になっているものを検出するためのコンパイラ定義されたマクロを使用することができます

答えて

3

:これは有効ので、実行時の検出を行いません

// Assume SSE2 as a baseline 
#include <vectori128.h> 

#if defined(__AVX2__) 
#include <vectori256.h> 
using vector_type = Vec32c; 
#else 
// Vec16c uses whatever is enabled, so you don't have to check for SSE4 yourself 
using vector_type = Vec16c; 
#endif 

AVX2でCPU上でのみ実行されるバイナリを作成する場合は、AVX2を選択します。

VCLがまったくサポートされていない非x86プラットフォームまたはSSE2のないx86でコードを動作させたい場合は、#include <vectori128.h>#ifで保護する必要があります。

+0

あなたが実際にあればVec32cを使用したいと思います'__AVX2__'が定義されていなければ、常に' Vec16c'を使用します(有用なところでは、vectorclassヘッダがSSE4.1/4.2/SSSE3を使うようにしてください)。 AVX512を確認し、 'Vec64c'を使用してください。ベクトルクラスライブラリの主要な目標の1つは、さまざまなターゲットオプションの可用性に基づいて異なるイントリンシックの選択を抽象化することです。 –

+0

私はそれをupvoteする前にこれはかなり大きな編集を取ったが、私はかなり正しいと確信しています。私は実際にVCL(および[貢献した変更](https://github.com/pcordes/vectorclass)を使用しています(AFAIKはまだ統合されていないので、Agnerに含めることができます) –

2

32バイトのベクトルにはAVXが必要です。 (そして、Vec32cのような32B整数ベクトルのAVX2)。 AtomにはAVXがないので、Agnerのvectorclassi256.hまたはvectorclassf256.hを含めないで、128ヘッダーだけを含めてください。

-march=nativeでコンパイルすると、ホストCPUがサポートするすべての命令セットを有効にすることができます。

Vec16c関数の実装では、有効になっているときに自動的にSSE4.2組み込み関数が使用されます。これは、VectorClassがマクロをチェックして有効になっているかどうかを調べるためです。したがって、Vec16cを使用すれば、ターゲットがサポートするすべての機能の最適な実装が自動的に取得されます。

(あなたはコンパイル時CPU /ターゲットオプションをやっているので、これは本当です。あなたは実行時に自分を派遣したいと思った場合、それは難しいだろう。)

関連する問題