ストリーミング SIMD 拡張命令 2 のキャッシュ操作

ストリーミング SIMD 拡張命令 2 (SSE2) の組み込み関数のプロトタイプは、ヘッダーファイル emmintrin.h 内にあります。

組み込み関数名 操作 対応する SSE2 命令
_mm_stream_pd ストア MOVNTPD
_mm_stream_si128 ストア MOVNTDQ
_mm_stream_si32 ストア MOVNTI
_mm_clflush フラッシュ CLFLUSH
_mm_lfence メモリーアクセスの保証 LFENCE
_mm_mfence メモリーアクセスの保証 MFENCE

 

void _mm_stream_pd(double *p, __m128d a)

a のデータを、キャッシュを介さずに、アドレス p にストアします。アドレス p は、16 バイトにアライメントが合っていなければなりません。アドレス p を含むキャッシュラインがすでにキャッシュ内にある場合、キャッシュは更新されます。
p[0] := a0
p[1] := a1

p[0] p[1]
a0 a1

 

void _mm_stream_si128(__m128i *p, __m128i a)

a のデータを、キャッシュを介さずに、アドレス p にストアします。アドレス p を含むキャッシュラインがすでにキャッシュ内にある場合、キャッシュは更新されます。アドレス p は、16 バイトにアライメントが合っていなければなりません。

*p
a

 

void _mm_stream_si32(int *p, int a)

a のデータを、キャッシュを介さずに、アドレス p にストアします。アドレス p を含むキャッシュラインがすでにキャッシュ内にある場合、キャッシュは更新されます。

*p
a

 

void _mm_clflush(void const*p)

コヒーレンシー・ドメイン内のすべてのキャッシュから、p を含むキャッシュラインをフラッシュし、無効化します。

 

void _mm_lfence(void)

プログラムの順序でロードフェンス命令に先行するすべてのロード命令が、フェンスに続くロード命令より前に、グローバルにアクセス可能になるのを保証します。

 

void _mm_mfence(void)

プログラムの順序でメモリーフェンス命令に先行するすべてのメモリーアクセス命令が、フェンスに続くメモリーアクセス命令より前に、グローバルにアクセス可能になるのを保証します。