Thursday, August 24, 2017

파이썬+ boost python cpu 프로파일

## Profile
* kcachegrind 를 설치한다. 프로파일 뷰어. 이는 파이썬,c++ 모두에 유효.
  ``` bash
  sudo pip install pyprof2calltree
  sudo apt-get install kcachegrind # call tree viewer
  ```

  ### C++ profile
  * [CMakeLists.txt](./lib/CMakeLists.txt)와 같이 -pg flag를 추가해서 profile에 필요한 정보를 생성하도록 컴파일 옵션을 세팅해야한다.

    ```
    set(CMAKE_CXX_FLAGS `"${CMAKE_CXX_FLAGS} -pg" )
    ```

  ### Python  profile
  1) cProfile
      * Profile
        ``` bash
        python -m cProfile -o prof.out scripts/vo.py
        pyprof2calltree -i prof.out -k
        ```
      * 한계 : boost python 의 함수는 어쨰선지 profile에 안잡힌다. gperf tools 사용 시도중.

  2) Yappi
      * 멀티 쓰레드 분석 특화.
      * 이번에는 다시 c++ 부분이안됨. 사용 안함.

        ```
        sudo pip install yappi
        python -m yappi -o prof.out -f callgrind scripts/vo.py && kcachegrind prof.out
        ```
  3) line_profiler
    * 파이썬 프로파일러중 가장 강력하다!. 프로파일 대상인 함수 def 위에 @profile 을 붙여줘야하는 단점이 있지만, 대상 스코프는 라인단위로 확실하게 분석함.
      ``` python
      @profile
      def some_target_function(p1, p2):
        p3 = p1+p2
        p4 = p3 * p3
        return p4
      ```

      ``` bash
      sudo pip install line_profiler
      kernprof -l scripts/vo.py && python -m line_profiler vo.py.lprof
      ```

### Profile python-c extension
* google perftools가 잘 안되서,. yep을 쓰기로함.
  ```bash
  python -m yep -c -o prof.out scripts/vo.py && kcachegrind prof.out
  ```
  python에서 library로 불러온 c++ 부분만 나온다.
  python profile결과에서 공백인 부분만, yep에서 인식된다고 보면 되겠음.
  * -c는 kcachegrind가 읽는 callgrind 포맷으로 output 파일을 만드는 옵션.

* 결론 : cProfile로 overview를 분석하고, line_profiler로 세부 병목을 찾으면 됨.  해당 병목이 boost python으로 불러온 c++ 함수일 경우, c++  코드 분석은 yep로 처리하면 코드를 정확하게 분석할수 있음.
  * 한번에 분석이 안끝나는게 번거롭지만, 현재 내가 찾은 차선.
  * google perftools는 이런 문제가 없는것같은데, 아직 어떻게 쓰는지 이해를 못함.

* https://www.youtube.com/watch?v=DUCMjsrYSrQ

No comments:

Post a Comment