IntelSSE組み込み関数をArm / Aarch64NEON組み込み関数に変換するAC / C ++ヘッダーファイル。
sse2neonインテルSSE(ストリーミングSIMD拡張命令)に組み込み関数の翻訳者であるアームNEONその後、抽出プロファイルに使用することができ、コードでホットパスを識別するために、アームの作業プログラムを取得するために必要な時間を短縮し、。ヘッダーファイル
sse2neon.hには、などのIntel組み込みヘッダーによって提供されるいくつかの関数が含まれていますが
<xmmintrin.h>、組み込み関数の正確なセマンティクスを生成するためにNEONベースの対応物でのみ実装されています。
ヘッダーファイル | 拡張 |
---|---|
<mmintrin.h> |
MMX |
<xmmintrin.h> |
SSE |
<emmintrin.h> |
SSE2 |
<pmmintrin.h> |
SSE3 |
<tmmintrin.h> |
SSSE3 |
<smmintrin.h> |
SSE4.1 |
<nmmintrin.h> |
SSE4.2 |
<wmmintrin.h> |
AES |
sse2neonSSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、およびAES拡張をサポートすることを目的としています。
広く使用されているすべてのSSE組み込み関数にNEON等価組み込み関数を提供するために、一部のSSE組み込み関数には、具体的なNEON等価組み込み関数との直接マッピングが存在することに注意してください。ただし、1対1のマッピングがないものもあります。つまり、同等のものがいくつかのNEON組み込み関数を使用して実装されています。
たとえば、SSE組み込み
_mm_loadu_si128には直接NEONマッピング(
vld1q_s32)がありますが、SSE組み込みに
_mm_maddubs_epi16は13以上のNEON命令を実装する必要があります。
ファイル
sse2neon.hをソースコードディレクトリに置きます。
コードに含まれている次のSSEヘッダーファイルを見つけます。
#include <xmmintrin.h>
#include <emmintrin.h>
{p、t、s、n、w} mmintrin.hは交換可能である必要がありますが、これらの拡張機能の適用範囲は制限される可能性があります。
#include "sse2neon.h"
cryptoおよび/または
crcあなたのアーキテクチャは、暗号化および/またはCRC32の拡張機能をサポートしていない場合)
-march=armv8-a+fp+simd+crypto+crc
-mfpu=neon
正確性とパフォーマンスのバランスを考慮して
sse2neon、次のコンパイル時構成を認識します。
SSE2NEON_PRECISE_MINMAX:との正確な実装を有効に
_mm_min_psし
_mm_max_psます。デフォルトでオフになっています。NaNの特殊なケースなど、一貫した結果が必要な場合は、
1を含める前と同じようにマクロを定義します
sse2neon.h。
sse2neonテストケースを開発するための統一されたインターフェースを提供します。これらのテストケースは
testsディレクトリにあり、入力データは実行時に指定されます。次のコマンドを使用して、テストケースを実行します。
$ make check
クロスコンパイル用にGNUツールチェーンを指定することもできます。 QEMUは事前にインストールする必要があります。
$ make CROSS_COMPILE=aarch64-linux-gnu- check # ARMv8-A
または
$ make CROSS_COMPILE=arm-linux-gnueabihf- check # ARMv7-A
変換が実装されたら、次の手順でテストを追加できます。
ファイル
tests/impl.h
組み込みのunder
#define INTRIN_FOREACH(TYPE)マクロを追加します。命名規則は
mm_xxx。アルファベット順に正しい分類に配置します。分類は、Intel IntrinsicsGuideから参照できます。
ファイル
tests/impl.cpp
result_t test_mm_xxx()
{
// The C implementation
...
// The Neon implementation
ret = _mm_xxx();
// Compare the result of two implementations and return either
// TEST_SUCCESS, TEST_FAIL, or TEST_UNIMPL
...
}
コマンド
$ make indentを使用して、コーディング規則に従います。
これは、
sse2neonArm / Aarch64サポートに採用されたオープンソースプロジェクトの部分的なリストです。
sse2neonMITライセンスの下で自由に再配布できます。