x86-64のSSEベクトル命令をgccで使用することに興味があり、そのためにインラインアセンブリを使用したくありません。Cでそれを行う方法はありますか?もしそうなら、誰かが私に例を与えることができますか?
3 に答える
はい、 * mmintrin.hヘッダーで組み込み関数を使用できます(使用するSSEのレベルに応じて、、など)emmintrin.h
。xmmintrin.h
これは、多くの理由から、一般的にアセンブラを使用するよりも望ましい方法です。
#include <emmintrin.h>
int main(void)
{
__m128i a = _mm_set_epi32(4, 3, 2, 1);
__m128i b = _mm_set_epi32(7, 6, 5, 4);
__m128i c = _mm_add_epi32(a, b);
// ...
return 0;
}
このアプローチは、さまざまなプラットフォーム上のほとんどのx86およびx86-64コンパイラで機能することに注意してください。たとえば、Linux / Mac OS X / Windows上のgcc、clang、IntelのICC、さらにはMicrosoftのVisual C / C ++(もちろんWindowsのみ)です。
*intrin.h
gcc include(/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/include/
ここ)でヘッダーを見つけます。
おそらく注目に値するのは、ヘッダーimmintrin.h
には、許可する機能に応じて他のすべてのイントリンが含まれていることです(たとえば、を使用して)-msse2
。-mavx
必要なのは組み込み関数です。これはライブラリ関数のように見えますが、実際にはコンパイラに組み込まれているため、特定のマシンコードに変換されます。
Paul Rとhroptatyrが、GCCのドキュメントの場所について説明しています。Microsoftには、コンパイラの組み込み関数に関する優れたドキュメントもあります。GCCを使用している場合でも、MSによるアイデアの説明の方が優れたチュートリアルであることがわかる場合があります。