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 件のコメント:
コメントを投稿