x86 サポート

NDK には、IA-32 命令セットをサポートする CPU を備えた Android ベースの端末でネイティブ コードを実行できるようにする x86 ABI のサポートが含まれています。

概要

x86 マシンコードを生成するには、Application.mk ファイルの APP_ABI 定義に x86 を追加します。 次に例を示します。

APP_ABI := armeabi armeabi-v7a x86
APP_ABI 変数の定義に関する詳細については、Application.mk をご覧ください。

ビルドシステムにより、生成されたライブラリが $PROJECT/libs/x86/ に配置されます。ここで、$PROJECT はプロジェクトのルート ディレクトリを表し、これらのライブラリは /lib/mips/ の配下の APK に埋め込まれます。

Android パッケージは、互換性のある x86 ベースの端末に APK をインストールするときに、これらのライブラリを抽出して、アプリのプライベート データ ディレクトリに配置します。

Google Play ストアでは、サーバーでアプリをフィルタリングするため、ユーザーに対しては、端末の CPU で実行されるネイティブ ライブラリのみが表示されます。

ARM NEON Intrinsic の x86 サポート

ARM NEON intrinsic のサポートは、標準の ARM NEON intrinsic ヘッダー arm_neon.h と同じ名前の C/C++ 言語ヘッダーの形式で提供されます。 これらのヘッダーは、すべての NDK x86 ツールチェーンで使用できます。 ツールチェーンにより、NEON intrinsic はネイティブ x86 SSE intrinsic に変換されます。

このソリューションの特徴は次のとおりです。

  • ARM NEON を Intel SSE に移植するために、SSE から SSSE3 をデフォルトで使用し、すべての NEON 関数の 93%(2,009 個のうち 1,869 個)をカバーします。
  • ARM NEON 128 ビットベクターを同等の x86 SIMD データに再定義します。
  • 1 対 1 の対応関係がある場合、一部の関数を ARM NEON から Intel SSE に再定義します。
  • パフォーマンス上のメリットがある場合、Intel SIMD を使用して一部の ARM NEON 関数を実装します。
  • シリアル ソリューションを使用して残りの NEON 関数の一部を実装し、対応する「低パフォーマンス」コンパイラー警告を発行します。

パフォーマンス

ほとんどのケースで、ARM NEON コードから引き出せるパフォーマンスと同等のパフォーマンスを達成できるはずです。 最高の結果を出すには、次のような推奨事項を実施してください。

  • より高速の読み込みと格納を実現するために、16 バイト データの整列を使用します。
  • NEON 関数と定数の併用は避けます。定数を使用すると、その読み込みが必要になるため、パフォーマンスが低下します。 定数を使用する必要がある場合は、ホットスポット ループの外部で定数の初期化を試みます。 可能な場合は、定数を論理値に置き換え、演算を比較します。
  • "serially implemented" とマークされている関数はデータをレジスタからメモリに格納する必要があるため、これらの関数の使用は避けます。 その代わり、これらの関数を順次処理し、再読み込みします。移植したものの全体をベクトル化する(シリアルデータ型またはシリアル アルゴリズムのままにせずに)ために使用するデータ型またはアルゴリズムを変更できる場合があります。

このトピックに関する詳細については、ARM NEON から Intel SSE - 自動移植ソリューション、ヒントとコツをご覧ください。

ARM バージョンとの違い

ほとんどの場合、x86 実装は、NEON 向けの ARM 実装と同じ結果をもたらします。x86 実装は、NEON テストにほぼ 100% 合格します。 ただし、x86 実装が ARM 実装の場合とは異なる結果をもたすケースもいくつかあります。 既知の非互換性は次のとおりです。

サンプルコード

プロジェクトでは、arm_neon.h ヘッダーを含めるとともに、APP_ABI の定義に x86 を含める必要があります。 これにより、ビルドシステムはコードを x86 に移植します。

ARM NEON を x86 SSE に移植する方法の例については、hello-neon サンプルをご覧ください。

スタンドアロン ツールチェーン

x86 ABI を独自のツールチェーンに組み込むことができます。詳細については、スタンドアロン ツールチェーンをご覧ください。

互換性

x86 をサポートするには、Android 2.3(Android API レベル 9)以降が必要です。プロジェクト ファイルが古い API レベルを対象にしているが、x86 を対象プラットフォームとして含んでいる場合は、NDK ビルド スクリプトによって、ネイティブ プラットフォーム ヘッダー / ライブラリが自動的に選択されます。