2011-06-19

CRC32 SSE4.2

Core i7 2600Kの場合、crc32 r32, r32のスループット1、レイテンシ3なのは既知だけど、crc32 r64, r64はどうなのか調べてみた。
結論、r64とr32のスループット及びレイテンシは等しい。

;yasm -f win32 crc32.asm
CPU  SSE4.2
USE32
section .text
;__stdcall crc32_latency_32bit(DWORD loop);
global _crc32_latency_32bit@4
_crc32_latency_32bit@4:
 push ebp
 mov  ebp, esp
 mov  ecx, [ebp+08H]
align 16
.loop_:
 TIMES 1000 crc32 eax, ebx
 dec  ecx
 jnz  .loop_
 pop  ebp
 ret  4

;__stdcall crc32_throughput_32bit(DWORD loop);
%MACRO step_op 0
 crc32 eax, ebx
 crc32 edx, ebx
 crc32 edi, ebx
 crc32 esi, ebx
%ENDMACRO
global _crc32_throughput_32bit@4
_crc32_throughput_32bit@4:
 push ebp
 mov  ebp, esp
 mov  ecx, [ebp+08H]
 pusha
align 16
.loop_:
 %rep 1000
 step_op
 %endrep
 dec  ecx
 jnz  .loop_
 popa
 pop  ebp
 ret  4
;yasm -f x64 crc32_64.asm
CPU  SSE4.2
USE64
section .text
global _crc32_latency_64bit
_crc32_latency_64bit:
align 16
.loop_:
 TIMES 1000 crc32 rax, rbx
 dec  rcx
 jnz  .loop_
 ret
%MACRO step_op 0
 crc32 rax, rbx
 crc32 r8, rbx
 crc32 r9, rbx
 crc32 r10, rbx
%ENDMACRO
global _crc32_throughput_64bit
_crc32_throughput_64bit:
align 16
.loop_:
 %rep 1000
 step_op
 %endrep
 dec  rcx
 jnz  .loop_
 ret
#include <Windows.h>
#include <stdio.h>
#ifdef _M_X64
extern "C"
{
 extern void _crc32_latency_64bit(DWORD count);
 extern void _crc32_throughput_64bit(DWORD count);
}
#define crc32_latency _crc32_latency_64bit
#define crc32_throughput _crc32_throughput_64bit
#else
extern "C"
{
 extern void __stdcall crc32_latency_32bit(DWORD loop);
 extern void __stdcall crc32_throughput_32bit(DWORD loop);
}
#define crc32_latency crc32_latency_32bit
#define crc32_throughput crc32_throughput_32bit
#endif
int main()
{
 LARGE_INTEGER f, b, a;
 SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
 QueryPerformanceFrequency(&f);
#ifdef _M_X64
 puts("X64");
#else
 puts("x86");
#endif
 printf("freq: %I64d\n", f.QuadPart);
 crc32_latency(1);
 QueryPerformanceCounter(&b);
 crc32_latency(1000000);
 QueryPerformanceCounter(&a);
 printf("%I64d\n", a.QuadPart-b.QuadPart);
 crc32_throughput(1);
 QueryPerformanceCounter(&b);
 crc32_throughput(1000000);
 QueryPerformanceCounter(&a);
 printf("%I64d\n", a.QuadPart-b.QuadPart);
 return 0;
}

0 件のコメント:

コメントを投稿