Streaming SIMD Extensions
스트리밍 SIMD 확장(Streaming SIMD Extensions, SSE)은 x86 아키텍처에 대한 SIMD(단일 명령 다중 데이터) 명령어 집합 확장이며, 인텔이 1999년에 펜티엄 III 시리즈 프로세서에 도입하였다. 이 기능은 1998년 등장한 AMD사의 3D나우! 기술에 대응한다. SSE는 70가지의 새로운 명령어와 추가적인 레지스터로 구성되며, 명령어의 대부분은 부동 소수점에 대한 연산이다.
SSE는 펜티엄 III가 코드명 Katmai로 알려져 있을 시기에는 KNI(Katmai New Instructions)로 불렸다. 이후 이 이름은 ISSE(Internet Streaming SIMD Extensions)로 정해졌었으며, 이후 SSE로 변경되었다. AMD는 애슬론 XP와 듀론 프로세서를 기점으로 SSE 명령 지원을 추가했다.
SSE 복사
Streaming SIMD Extension 을 이용한 복사
void temporal_copy( char* outbuff, char* inbuff, unsigned int size )
{
const unsigned int step = 64; // cache line size
while ( size > step )
{
_mm_prefetch( inbuff + 640, _MM_HINT_NTA ); // non-temporal prefetch
__m128i A = _mm_load_si128( (__m128i*)(inbuff + 0) );
__m128i B = _mm_load_si128( (__m128i*)(inbuff + 16) );
__m128i C = _mm_load_si128( (__m128i*)(inbuff + 32) );
__m128i D = _mm_load_si128( (__m128i*)(inbuff + 48) );
// destination address must be 16-byte aligned!
_mm_store_si128( (__m128i*)(outbuff + 0), A );
_mm_store_si128( (__m128i*)(outbuff + 16), B );
_mm_store_si128( (__m128i*)(outbuff + 32), C );
_mm_store_si128( (__m128i*)(outbuff + 48), D );
inbuff += step;
outbuff += step;
size -= step;
}
memcpy( inbuff, outbuff, size ); // 나머지부분은 간단하게 memcpy 로 복사
//_mm_mfence(); // 멀티스레드 환경에서 사용
}
See also
- SIMD
- Advanced Vector Extensions (AVX)
- Program optimization
- Duffs device
- Cache prefetching (Software Prefetch)