Nanashi-softプログラマ専用Windows gcc SDL


◇Windowsでgcc+SDL -SSE2(SIMD)を使う-

通常 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
です


TOPプログラマ専用Windows gcc SDL