オープンソースのC++x86 SIMD組み込み関数ライブラリを知っている人はいますか?
Intelは、統合されたパフォーマンスプリミティブライブラリで必要なものを正確に提供していますが、著作権がいたるところにあるため、それを使用することはできません。
編集
私はすでにコンパイラーによって提供される組み込み関数を知っています。私が必要としているのは、それらを使用するための便利なインターフェースです。
オープンソースのC++x86 SIMD組み込み関数ライブラリを知っている人はいますか?
Intelは、統合されたパフォーマンスプリミティブライブラリで必要なものを正確に提供していますが、著作権がいたるところにあるため、それを使用することはできません。
編集
私はすでにコンパイラーによって提供される組み込み関数を知っています。私が必要としているのは、それらを使用するための便利なインターフェースです。
libsimdppヘッダーのみのC++SIMDラッパーライブラリを見てください。
ライブラリは、単一のインターフェイスを介していくつかの命令セットをサポートします:SSE2、SSE3、SSSE3、SSE4.1、AVX、AVX2、AVX512F、XOP、FMA3 / 4、NEON、NEONv2、Altivec。Clang、GCC、MSVC、ICCのすべてがサポートされています。
命令セット間の違いは、サポートされている命令の組み合わせとして欠落している命令を実装することで解決されます。ボーナスとして、複数の命令セットに対して同じコードをコンパイルし、結果のオブジェクトファイルを単一の実行可能ファイルにリンクし、便利な動的ディスパッチメカニズムを使用して、現在のプロセッサに最も合わせた実装を実行することができます。
明示的なSIMDプログラミングを抽象化するために近年出現したライブラリがいくつかあります。最も重要なもの:
探すべき最も重要なことは、与えられたターゲットに対して利用可能な最良のSIMDレジスタと命令を正しく抽象化する使用可能なタイプのセットを持つことです。そして、明らかに、SIMDをサポートしていないシステムへの完全な移植性。
ほぼ完璧な品質のASMコードに変換するGLSLスタイルのライブラリを作成しました。
非常に一般的な操作-外積:
vec4 cross(const vec4 &a, const vec4 &b)
{
return a.yzxw * b.zxyw - a.zxyw * b.yzxw;
}
glsl-sse2を使用してこのアセンブリコードに変換されます。
_Z5crossRK4vec4S1_:
movaps (%rsi), %xmm1
movaps (%rdx), %xmm2
pshufd $201, %xmm1, %xmm5
pshufd $210, %xmm2, %xmm0
pshufd $210, %xmm1, %xmm4
pshufd $201, %xmm2, %xmm3
mulps %xmm0, %xmm5
mulps %xmm3, %xmm4
subps %xmm4, %xmm5
movaps %xmm5, (%rdi)
ret
ライブラリはまだ完全ではなく、まだ新しいため、バグが見つからない可能性が高いことに注意してください。
AMDのSSEPlusプロジェクトを見てください。
Microsoftは、新しい「DirectXMath」ライブラリをリリースしました。SSE2およびNEON組み込み関数のサポートが含まれています。ドキュメントもまともなようです。
DirectXMath APIは、DirectXアプリケーションに共通の一般的な線形代数およびグラフィックス数学演算用のSIMD対応のC++タイプおよび関数を提供します。このライブラリは、Windows 32ビット(x86)、Windows 64ビット(x64)、およびWindows onARMのSSE2およびVisualStudioコンパイラでのARM-NEON組み込み関数のサポートに最適化されたバージョンを提供します。
Vcは、ベクトルクラスを実装し、使用される実際の命令セットから独立したベクトル化されたコードを記述できるようにする別のC++ライブラリです。