Nanashi-soft○プログラマ専用○Windows gcc SDL○
通常 Windowsプログラミングで SIMDを使うにはアセンブラが必要です
ですが、gccには C言語から扱えるマクロ関数が実装されています
SIMDとは、一度にまとめて処理を行えるレジスタを使った計算の事です
通常 Windowsを動かす CPUには、Intel系と AMD系があります
話を始めると非常に長くなるので省きます
両方の CPUがサポートしているのが SSEと SSE2です
今動いている Windowsパソコンの CPUは大抵 SSE2をサポートしていると考えて良いでしょう
gccでSSE2を使うには、emmintrin.hをインクルードします
参考までに、一通りヘッダー定義を書いておきます
#include <mmintrin.h> // for MMX
#include <xmmintrin.h> // for SSE(Pentium3)
#include <emmintrin.h> // for SSE2(Pentium4,AMD64アーキテクチャ)
#include <pmmintrin.h> // for SSE3(Pentium4のPrescottコア,AMD AM2+ クアッドコア
ここでは SSE2しか説明しませんが、これらのヘッダー定義を見る事で、サポートされている機能も分かることでしょう
※4つ同時に計算を行うものだけを抜粋
・足し算
d = a + b → d = _mm_add_epi32(a, b)
・引き算
d = a - b → d = _mm_sub_epi32(a, b)
・掛け算
d = a * b → d = _mm_mul_epi32(a, b)
・割り算
整数型は無さそうです。float型ならあるのですが……
実装されていれば _mm_div_epi32 だったのでしょうね
・右シフト
d = a >> b → d = _mm_srl_epi32(a, b)
・左シフト
d = a << b → d = _mm_sll_epi32(a, b)
実は同じ事を行うにももっと多くの種類があるのですが、ここでは割愛します
SSE2を使用した時は、ビルド時にオプションが必要です
gcc -msse2 〜以降は今まで通り
例えば SSE2を使用したプログラム wintest.cをビルドするコマンドは以下の通りです
gcc -msse2 -o wintest wintest.c `sdl-config --cflags --libs`
これも一通り書くと
MMXを使う場合は -mmmx
SSEを使う場合は -msse
SSE2を使う場合は -msse2
SSE3を使う場合は -msse3
です