|
예전에 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 만 호출하면 매번 값이 묘하게 나오는걸 확인할 수 있습니다.
과연 .. 결과는 어떨까요? 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
|
카테고리
< 링크 >
게시판 욕해도 됩니다. ㅋㅋ 심심이 - springnote zesrever 의 지식펌프 까마구님 cpplog Woof 님 maystyle 사파고수 재학사마 서우석님 x-Type 이기탁님 정성태님 신영진님 이명헌경영스쿨 haskell 언어 이재원 e-campus codian.net zendlinde - 건즈온라인개발자 xecode.net 이동우님 위키 왕멀-게임개발자로살아가기 삽질하는 플머-민성기님 블로그 검색엔진 첫눈 블로그 Kei 의 바이러스 세상 mat 님 블로그 신경준님 블로그 윤훈남님 블로그 blog.hsd.or.kr IDA 메인 아키텍트 게임개발-sky team 송상무님 세율이 민쓰 hackaday.com 해킹속임수의 예술 네이버-임베디드 카페 정원교 zealot님 serious-code 홍가일보 doronh peterwie - UMDF leader sysinternals sysinternals 뉴스레터 MS r&d bkchung blog MS 서진호님 window communication 최근 등록된 덧글
서울여대 충격이면서도 ..
by binish at 11/09 잘 보고 가요.. :) by :) at 10/30 워 이거때문에 해맸는데 .. by 일리 at 10/26 진정한 take(공유)!!!!.. by rees at 10/03 그러게 술한잔 해야 하는.. by somma at 09/25 쫑호~ 잘 지내고 있는감?.. by somma at 09/25 안녕하세요 잘 지내시죠?.. by 김종호 at 09/22 지만이네나 여기나 역시.. by 양군 at 09/22 필코 마제는 기계식인데.. by 욱 at 09/07 그냥 할당에 비해서 걍 3.. by Hide_D at 09/01 최근 등록된 트랙백
폴포츠 꿈은 이루어지다
by 연예의 인연으로... DDK VS에 연동하기~! by 박한범님의 이글루 [PE]DOS대가리의 .. by 미친감자의 BLOG 십년차의 생각 by sugiii's me2DAY 십년차의 생각 by sugiii's me2DAY Windows Handle by MalwareLAB [디버그랩] Windows .. by NaggingMachine jjjismy의 생각 by jjjismy's me2DAY Vista의 EncodePoint.. by Woof's EncodePointer 함수 .. by Woof's 이글루링크
미친병아리가 삐약삐약
김명신의 즐거운 하루 소스코드위를 걷다..... zoops 이야기 ▒ 제닉스의 사고뭉치 ▒ 餘分D: physics and fun Just for fun~ 달리다. 그리고 날다. 게임회사 이야기 ~★~ 우하하!!~ 프로.. 헐랭이와 IT보안 Alphageek 견우의 블로그 from __future__ impor.. Sodécho 내일은 내일의 바람이 분다. 델파이로 만드는 검색엔진 The second story ::거듭나기:: kkamagui의 프로그래.. 루오니의 집 개발자 서씨 Zealot Xeraph@NCHOVY SecurityCode Bellevue Project Coderant의 보안과 전략 Jania's Blog 미친감자의 LOG 그 냥반의 기술 공간 art.oriented mocca Strategy Thinking 이글루 파인더
라이프로그
태그
|