Search Results for 'Intel Compiler'

1 POSTS

  1. 2008.05.13 Dynamic Profiling (2)

Dynamic Profiling

Posted 2008.05.13 04:14
JIT를 제공하는 Java Server VM이 정적으로 컴파일된 C/C++ 수준 혹은 그 이상의 성능을 보일 수 있는 중요한 이유 중에 하나는 런타임에 수집한 데이터를 가지고 컴파일을 최적화하기 때문입니다.

다음 코드를 예로 봅시다.

for (i = 0 ; i < 10; i++) {
    if (cond) {
        g();
    } else {
        h():
    }
}

루프 안의 g 혹은 h 함수를 inline 할지 말지 결정하려면 cond이 true일 확률이 높은지 false인 확률이 높은지 알 수 있어야 합니다. 만약 cond가 거의 항상 true라면 g를 inline하고 h는 그냥 두어야 할 것입니다. 하지만 런타임 정보가 없는 C/C++ 컴파일러은 이런 최적화를 수행하기는 힘듭니다.

이런 한계 때문에 요즘은 일반적인 컴파일러들도 런타임 정보를 활용해 추가적인 최적화를 하기도 합니다. 일례로 인텔 컴파일러는 바이너리가 동적 프로파일링(dynamic profiling)을 수행하도록 한 번 컴파일한 후에, 이를 실행해 얻은 프로파일링 데이터를 바탕으로 다시 한 번 컴파일해 최적화된 코드를 생성할 수도 있습니다.


  1. Favicon of http://minjang.egloos.com BlogIcon object

    | 2008.05.13 07:46 | PERMALINK | EDIT | REPLY |

    자바가 저런 점에서는 좋은 점도 있네요. 말씀드린 기술이 PGO라고 (Profiled Guided Optimization)이라는 테크닉인데요. 이미 VC++ 컴파일러 및 인텔 C++ 컴파일러에 적용이 되어있습니다. gcc도 최신 버전에서는 가능할 것 같습니다. 그런데 저런 정도의 조건문과 함수 g, h가 그냥 direct call일 때는 CPU가 이미 훌륭하게 분기 예측을 할 수 있어서 큰 효과는 없을 것 같습니다. 대표적으로 PGO가 잘 먹히는 경우가 가상함수 호출일 것인데요. 자주 불리는 인스턴스 타입에 대해 바로 direct 함수 호출로 바꾸고 인라이닝까지 하면 성능 향상에 도움이 제법 됩니다. 가상함수호출 혹은 콜백함수호출은 CPU가 처리하기에 여전히 힘든 녀석입니다.

  2. Favicon of http://skyul.tistory.com BlogIcon 서광열

    | 2008.05.22 04:00 | PERMALINK | EDIT |

    HotSpot VM에 구현된 내용은 아니지만 Michael Franz가 Efficient Just-In-Time Execution of Dynamically Typed Languages
    Via Code Specialization Using Precise Runtime Type Inference (http://www.ics.uci.edu/~franz/Site/pubs-pdf/ICS-TR-07-10.pdf) 에서 자바스크립트 코드를 자바로 컴파일한 다음에 trace compiler를 이용해서 virtual call을 전부 inlining하는 방법을 사용해서 성능을 끌어올리는 아이디어를 제시했는데, 인상 깊었습니다.

Write your message and submit