sse2neon - IntelSSE組み込み関数からArm / Aarch64NEON実装へのトランスレータ

(A translator from Intel SSE intrinsics to Arm/Aarch64 NEON implementation)

Created at: 2018-05-28 13:24:04
Language: C
License: MIT

sse2neon

ビルドステータス

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

sse2neon
SSE、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"
  • プラットフォーム固有のオプションをgcc / clangコンパイラに明示的に指定します。
    • ARMv8-Aのターゲットでは、次のコンパイラオプションを指定する必要があります(取り外し
      crypto
      および/または
      crc
      あなたのアーキテクチャは、暗号化および/またはCRC32の拡張機能をサポートしていない場合)
    -march=armv8-a+fp+simd+crypto+crc
    • ARMv7-Aターゲットでは、次のコンパイラオプションを追加する必要があります。
    -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
を使用して、コーディング規則に従います。

養子縁組

これは、

sse2neon
Arm / Aarch64サポートに採用されたオープンソースプロジェクトの部分的なリストです。

  • Apache Impalaは、ApacheHadoopクラスターに格納されているペタバイトのデータに対する超高速の分散SQLクエリです。
  • Apache Kuduは、Hadoopのストレージレイヤーを完成させて、高速データの高速分析を可能にします。
  • Catcoonは、Cでのフィードフォワードニューラルネットワークの実装です。
  • dab-cmdlineは、いくつかの簡単な呼び出しでデジタルオーディオブロードキャスト(DAB)/ DAB +を処理する機能のエントリを提供します。
  • FoundationDBは、コモディティサーバーのクラスター全体で大量の構造化データを処理するように設計された分散データベースです。
  • iqtree_arm_neonは、IQ-TREEのArm NEONポートであり、最尤法によって系統樹を推測するための高速で効果的な確率的アルゴリズムです。
  • libscapiは「SecureComputationAPI」の略で、信頼性が高く、効率的で、柔軟性の高い暗号化インフラストラクチャを提供します。
  • MMseqs2(Many-against-Manyシーケンス検索)は、巨大なタンパク質およびヌクレオチド配列セットを検索およびクラスター化するためのソフトウェアスイートです。
  • OBS Studioは、ビデオコンテンツを効率的にキャプチャ、合成、エンコード、記録、およびストリーミングするために設計されたソフトウェアです。
  • OpenXRayは、GSC GameWorldによって世界的に有名なSTALKERゲームシリーズで使用されているX-Rayエンジンの改良版です。
  • parallel-n64は、Libretro専用に作成された最適化/書き換えられたNintendo64エミュレーターです
  • PlutoSDRファームウェアは、PlutoSDR用にカスタマイズされたファームウェアであり、ソフトウェア無線(SDR)または無線周波数(RF)または通信の基礎を、自己またはインストラクターのリード設定で電気工学の高度なトピックとして紹介するために使用できます。
  • Pygameはクロスプラットフォームであり、Pythonでゲームなどのマルチメディアソフトウェアを簡単に作成できるように設計されています。
  • srsLTEは、オープンソースのSDRLTEソフトウェアスイートです。
  • Surgeはオープンソースのデジタルシンセサイザーです。
  • XMRigは、Monero暗号通貨用のオープンソースCPUマイナーです。

関連プロジェクト

参照

ライセンス

sse2neon
MITライセンスの下で自由に再配布できます。