9

MacでCアプリケーションをコンパイルしようとしています。私はSSE4とAES-NI組み込み関数を使用しています。

Linuxでは、-msse4フラグと-maesフラグを指定してgccを呼び出し、wmmintrin.hヘッダーを含めるだけで、SSE組み込み関数_mm_add_epi64(a,b)(またはAES-NI組み込み関数)を呼び出すことができ_mm_aesenc_si128(a, b)、すべてが正常に機能します。

Macでは、AppleがGCCをAES-NIをまだサポートしていないllvm-gccに置き換えるため、より困難です。したがって、SSE4組み込み関数は正常に機能しますが、AES組み込み関数は正常に機能しません。AES命令へのインラインアセンブリ呼び出しでさえ認識されません。

IntelのWebサイトには多くのAESサンプルコードがありますが、これはLinuxとWindows専用です。

RDRAND命令もllvm-gccでサポートされていないことに気付きましたが、Intelは、rawマシンのバイトコードに展開されるCマクロを使用することでその回避策を提供しています。(このIntelライブラリのrdrand.hサンプルファイルを参照してください

残念ながら、AES-NI命令に同様の回避策はありません。おそらく、命令には引数があり、静的なマシンコードバイトとして評価できないためです。

Apple独自のFileVaultなど、MacでAES-NIを使用するプログラムは存在するため、機能する方法が必要です。

私の質問を具体的にするために、最新のMac gcc-llvm 4.2(Mountain Lion xcode 4.4.1の最新の公開リリース)を使用してコンパイルするための次の簡単な呼び出しを取得するにはどうすればよいですか?

 __m128i A, B, C;
  /* A, B, C initialized here... */
  A = _mm_aesenc_si128(B, C);   

助けてくれてありがとう!

4

1 に答える 1

8

Appleデベロッパサポートは、Xcodeを使用することは不可能であると報告しました。(実際、彼らの返事は少し卑劣で、AES-NIは開発者が直接使用する必要のあるものではなかったので、気にしないでください。ため息、ありがとう、Apple。)

しかし、私は2つの実用的な解決策を見つけました。どちらも、単にAppleのソフトウェアを回避することによるものです。1つは、Intel独自の商用C++コンパイラを使用することです。もう1つは、ソースからGCC 4.6または4.7をダウンロードしてコンパイルし、直接使用することです。これは私が選んだオプションです。私はこのガイドに従いました。GCCのコンパイルとインストール(クリーンな状態)は、単一のCPU組み込みを使用するだけでも面倒で回避策ですが、機能します。ありがとう、GCCチーム!

于 2012-09-29T21:39:48.260 に答える