내가 추가한것도 기본적으로 kukyakya 와 동일한 성능을 내는 코드다.
disassemble 해보면,
kukyakya 의 unaligned 도 내 unaligned 도
mov ecx, 16384 ; 00004000H
push esi
push edi
mov esi, OFFSET ?src@@3PADA+3
mov edi, OFFSET ?dst@@3PADA+1
rep movsd
pop edi
pop esi
걍 rep movsd 로 4바이트 복사가 실행된다.
memcpy 는 무슨 개뿔.
classic instruction 으로도 쳐발리는데.
함수 자체만 놓고 보면 별도의 코드를 생성한다.
( 인라인으로 최적화되었을때랑 실제 함수구조랑 코드가 다름 )
; 320 : _____ step_t* d = (step_t*)dst;
; 321 : const step_t* s = (step_t*)src;
; 322 : const std::size_t step_count = size / sizeof(step_t);
; 323 : const u32 off_road = size % sizeof(step_t);
; 324 :
; 325 : for( std::size_t i = 0; i < step_count; ++i )
mov eax, ecx
sub edi, ecx
mov esi, 16384 ; 00004000H
npad 3
$LL13@codesafer_:
; 326 : d[i] = s[i];
mov edx, DWORD PTR [edi+eax]
lea eax, DWORD PTR [eax+4]
mov DWORD PTR [eax-4], edx
sub esi, 1
jne SHORT $LL13@codesafer_
뭐, 핵심은 대동소이.
해석은 컴파일러 마음이지만,
만약 니네가 128비트 레지스터와 SIMD를 사용하고 싶으면 힌트를 하나 주자면,
void* codesafer_memcpy_unaligned1( void* dst, const void* src, std::size_t size )
{
using step_t = u32;
....
}
여기서 using step_t = u32 를 struct step_t{ float data[4]; };
와 같이 128비트 선언으로 바꾸면 된다.
다만 그것만으론 최적화가 제대로 안될거다.
나머지는 알아서 연구하시길.
다 가르쳐주면 재미없잖아?
댓글 0