할당과 InterlockedExchange 중 누가 더 빠를까?
예전에 nop 와 pause 중에 누가 더 많은 clock 을 소비할까.. 궁금해서 약간의 삽질을 한적이 있습니다.
전 가끔 이런 요상한 짓을 즐겨한답니다. ~@,.@~
(제 블로그에 계속 오셨던 분이라면 아실 듯 ==> nop vs pause )

오늘은 갑자기 할당 (e.g. a = b) 을 사용하는 것과 InterlockedXXX 함수를 이용하는 것 중에 누가 더 빠를까 하는 궁금증이 생기더군요. >.<
Interlockedxxx 함수는 lock cmpxchg 인스트럭션을 이용하더군요.
당연히 LOCK# 시그널을 발생시키고, 어쩌구 저쩌구 하는 일을 하니까 InterlockedXXX 함수가 느릴거라 생각했습니다.

과연... 그럴까요?

아래는 테스트에 이용한 코드입니다.

눈여겨 봐야할 코드가 있는데 바로~ ReadTSC() 함수입니다.
저도 오늘에야 확실하게 알게된 내용입니다만, rdtsc 인스터럭션은 serialization 이 보장되지 않는 인스트럭션입니다.
즉 out-of-order execution 가능성을 가지고 있다는 소립니다.
아하 ~~  뭔소린지 모르겠군요. (-_-)

예를 들면 아래와 같은 코드가 있다고 치죠.


serialization_지원_안하는_명령어_1
serialization_지원_안하는_명령어_1
serialization_지원_안하는_명령어_1



당근 1, 2, 3 명령어 순으로 실행되길 바라지만 실제로는 명령어를 순서대로 처리 하지 않을 수도 있단 겁니다.
파이프라인을 효율적으로 쓰기위해 CPU 프론트 엔드에서 당연히 그렇게 처리하리라는 예상이 되긴 합니다.
하여간 이런걸 out-of-order execution 이라고 합니다.
물론 serialization 이 보장되는 명령어가 있습니다. serialization 이 보장되는 명령중에는 privilege level 에서만 사용할 수 있는 명령어와 상관없이 쓸 수 있는 명령어가 있는데요, CPUID 명령은 privilege level 에 상관없이 쓸 수 있습니다.


serialization_지원_안하는_명령어_1
CPUID
serialization_지원_안하는_명령어_1
CPUID
serialization_지원_안하는_명령어_1
CPUID



이렇게 코드를 작성하면 serialization 이 된다는 소리죠. 간단하죠?
이런 이유로 ReadTSC() 함수에는 rdtsc 만 딸랑 있는 것이 아니라 rdtsc 를 호출하기 전에 cpuid 를 호출해 주는 겁니다.
실제로 cpuid 명령 없이 rdtsc 만 호출하면 매번 값이 묘하게 나오는걸 확인할 수 있습니다.




#define ReadTSC( x ) \
__asm cpuid \
__asm rdtsc \
__asm mov dword ptr x,eax \
__asm mov dword ptr x+4,edx

int _tmain(int argc, _TCHAR* argv[])
{
__int64 start = 0, end = 0, total = 0, evg = 0;
LONG target = 0, value = 1;

for (int x = 0; x < 32; x++)
{
// interlocked operation
//
for (int i = 0; i < 12800; i++)
{
ReadTSC(start);
InterlockedExchange(&target, value);
ReadTSC(end);
evg += end - start;
}
_ftprintf(stdout, _T("everage of interlocked operation: %04.2f \n"), (double)(evg / 12800));

// assign
//
evg = 0;
for (int i = 0; i < 12800; i++)
{
ReadTSC(start);

// optimization 땜시롱.. 어셈으로
//
//target = value;
__asm
{
mov eax, dword ptr [value]
mov dword ptr [target], eax
}
ReadTSC(end);
evg += end - start;
}
_ftprintf(stdout, _T("everage of assign : %04.2f \n\n"), (double)(evg / 12800));
}


return 0;
}




과연 .. 결과는 어떨까요?

everage of interlocked operation: 697.00
everage of assign : 537.00

everage of interlocked operation: 1230.00
everage of assign : 553.00

everage of interlocked operation: 1227.00
everage of assign : 549.00

everage of interlocked operation: 1205.00
everage of assign : 793.00

everage of interlocked operation: 1479.00
everage of assign : 544.00

everage of interlocked operation: 1244.00
everage of assign : 581.00

everage of interlocked operation: 1233.00
everage of assign : 538.00

everage of interlocked operation: 1214.00
everage of assign : 536.00




역시 그냥 할당하는게 빠르군요. ^.^


참고 자료
- intel white paper : Measuring Instruction Latency and Throughput
- intel manual volume 3A, 7-4 SERIALIZING INSTRUCTIONS




by somma | 2007/12/04 23:53 | 컴퓨터 이야기 | 트랙백 | 덧글(15)
트랙백 주소 : http://somma.egloos.com/tb/3515751
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 정성태 at 2007/12/05 08:55
지난 번 NOP/PAUSE 때도 그랬지만.... 왠지 이런 제목의 글은 읽는 이로 하여금,,, "설마, 당연히 느리다고 생각했던 것이 빠르다는 결과가 나온 것이 아닐까?" 라는 ^^ 생각을 갖고 읽어보게 됩니다.

덕분에 재미있는 실험, 잘 읽었습니다. ^^
Commented by Woof at 2007/12/05 09:00
간단하죠? 하는데 왠지
그 밥 아저씨가 생각이 났습니다. :|
Commented by somma at 2007/12/05 15:03
정성태 / 사실 저도 그걸 노리고 ㅎㅎㅎㅎ
Woof / 밥 아저씨가 누군가 했더니, 예전에 EBS 에서 그림 그리는거 가르쳐 주던 그 아저씨군요.
그의 손길이 몇번만 스치면 거짓말 처럼 멋진 그림이 나오던 기억이 나는군요.
Commented by 오타있는데 at 2007/12/05 17:05
everage가 아니고 average가 맞겠죠 ㅋ
Commented by somma at 2007/12/05 18:25
오타있는데 / 핫... 일부러 틀리게 쓴겁니다. 찾아내는 분 있나 없나 보려고~ (헤헤..믿거나 말거나 흐흐..)
Commented by chpie at 2007/12/06 00:07
언제나 신기하네요... ㅎㅎ
그래도 InterlockedXXX 는 좋아요 ㅠ_ㅠ
Commented by Dual at 2007/12/06 09:56
참 쉽죠? ㅎㅎㅎㅎ 아 ㅋㅋㅋ 추억의 미술교실이네요.
진짜 열심히 봤었는데... ㅎㅎ
Commented by suban at 2007/12/06 13:03
먼말인지는 모르겟지만...나중에라도 도움이 될까하고 퍼갈게요^^;

아 그리고 저도 오타 찾았습니다.ㅋ serailization->serialization^^

어쩐지 읽다가 발음하기 힘들었다는...^^;
Commented by somma at 2007/12/06 13:43
고쳤습니다. 감사합니다. 오타가 많네요. ^^
Commented by 이재학 at 2007/12/14 00:08
머여~ 그런겨?
Commented by somma at 2007/12/15 00:48
흐흐.. 그런겨~
Commented by canelia at 2007/12/15 11:15
왠지 낚인 기분이 드네요-_-ㅎㅎ
수고하셨어요
Commented by somma at 2007/12/15 16:39
살짝 떡밥을 던져놨죠.. ㅋㅋ
Commented by chp at 2007/12/16 07:00
정말 재미있내요 그래두. 1.2~2.3배정도 차이나내요.
이정도면 꽤나 쓸만할정도 인것 같내요..
꼭 필요한것 아니면 잘안써봤거든요.

어느정도 쓰는것은 괜찮을듯..
Commented by Hide_D at 2009/09/01 12:46
그냥 할당에 비해서 걍 3배 이내라면야 그래도 막강하네요

:         :

:

비공개 덧글



< 이전페이지 다음페이지 >