Intel VTune Profiler の使い方

自分用メモ。説明はUbuntu用。

IntelのCPUを使ってない場合はLinux perfやtoplev、AMDなら (Intelでも動くらしい) CodeAnalyst などを使うとよさそう。

## セットアップ
### ダウンロード
https://software.intel.com/en-us/vtune

Choose & Download > Only Intel VTune Profiler > Download

### インストール

tar.gz を解凍すると install.sh と install_GUI.sh というのがある。 install_GUI.sh の方を使った。
終わると `~/intel/vtune_profiler` にインストールされる。

### デスクトップエントリ

`ln -s ~/intel/vtune_profiler ~/.local/share/applications/vtune_profiler` でとりあえず出るようになる。
`vtune-gui.desktop` だけでなくディレクトリごとsymlinkしたのは .desktop エントリが自身のパスから `vtune-gui` のパスを計算するため。

### PATH
```bash 
export PATH="${PATH}:${HOME}/intel/vtune_profiler/bin64"
```
でとりあえず `vtune` や `vtune-gui` は叩けるようになる。

## GUI での実行
ターミナルから起動するとそれが閉じれなくなるので、GNOMEから Intel VTune Profiler を起動する。

### 計測対象の stdout が見れるようにする
≡ > Options > Application output destination: Product output window

### Microarchitecture Exploration で L2/L3 を見る準備
BIOS で Hyper Threading を無効にしておく。

### 事前準備コマンド
rootで以下を実行する。

```bash
# Cannot start data collection because the scope of ptrace system call application is limited.
# To enable profiling, please set /proc/sys/kernel/yama/ptrace_scope to 0.
# See the Release Notes for instructions on enabling it permanently.
echo 0 > /proc/sys/kernel/yama/ptrace_scope

# Hardware collection of CPU events is not possible on this system.
# Microarchitecture performance insights will not be available.
echo 1 > /proc/sys/kernel/perf_event_paranoid

# This analysis type requires either an access to kernel-mode monitoring in the Linux perf subsystem or
# installation of the VTune Profiler drivers (see the "Sampling Drivers" help topic for further details).
# Please set the /proc/sys/kernel/perf_event_paranoid value to 1 or less to continue without installing the drivers.
echo 1 > /proc/sys/kernel/perf_event_paranoid

# This analysis type requires either an access to kernel-mode monitoring in the Linux perf subsystem or
# installation of the VTune Profiler drivers (see the "Sampling Drivers" help topic for further details).
# Please set the /proc/sys/kernel/perf_event_paranoid value to 0 or less to continue without installing the drivers.
echo 0 > /proc/sys/kernel/perf_event_paranoid

# Access to /proc/kallsyms file is limited. Consider changing /proc/sys/kernel/kptr_restrict
# to 0 to enable resolution of OS kernel module symbols.
echo 0 > /proc/sys/kernel/kptr_restrict
```

#### perf_event_paranoid とは

> Controls use of the performance events system by unprivileged users (without CAP_SYS_ADMIN). The default value is 2.
>
> `-1`: Allow use of (almost) all events by all users Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
>
> `>=0`: Disallow ftrace function tracepoint by users without CAP_SYS_ADMIN Disallow raw tracepoint access by users without CAP_SYS_ADMIN
>
> `>=1`: Disallow CPU event access by users without CAP_SYS_ADMIN
>
> `>=2`: Disallow kernel profiling by users without CAP_SYS_ADMIN

### alt stack
```
vtune: Error: Stack size provided to sigaltstack is too small. Please increase the stack size to 64K minimum.
vtune: Collection failed.
vtune: Internal Error
AMPLXE_TPSSCOLLECTOR: init:1330: attach_notification_result == tpss_er_success : attach_notification_result = 14
Assertion failed: init:1330: attach_notification_result == tpss_er_success : attach_notification_result = 14. Please contact the technical support. 
```

`-run-pass-thru=--no-altstack` で直る http://hpc.ipp.ac.cn/wp-content/uploads/2015/12/documentation_2016/en/vtune_amplifier_xe/help/GUID-1A7D0D66-2BC0-4643-94AF-578A0BF22801.htm

### 未解決

```bash
# To profile kernel modules during the session, make sure they are available 
# in the /lib/modules/kernel_version/ location.
```

### 実行結果の保存場所

`~/intel/vtune/projects/sample (matrix)/r001hs` のような場所。

* hs: Hotspots
* ue: Microarchitecture Exploration
* macc: Memory Access

これは単にサンプルプロジェクトのパスなので、適当にプロジェクトを作り直せばパスは変えられそう。
プロジェクトディレクトリには .vtuneproj ファイルが置かれるぽい。

## 実行モード
![Screenshot from 2020-04-24 21-49-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14283/7c42989b-db41-b0f9-d2bb-6a9de6bcfc77.png)

当面はシングルスレッド性能を見るのに使うので、主に以下の3つを使いそう。

* Hotspots
* Microarchitecture Exploration
* Memory Access

### Hotspots
#### Summary
![Screenshot from 2020-04-24 22-25-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14283/b9a59827-e416-f368-1302-12513f82da93.png)

#### Bottom-up
![Screenshot from 2020-04-24 22-27-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14283/74639e5c-efdd-7cff-a4b5-e6a1eed810f3.png)


### Microarchitecture Exploration
#### Summary

![Screenshot from 2020-04-24 22-31-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14283/fe284a71-82bf-063d-061a-bab138964780.png)

この下で、Effective CPU Utilization が 24.5% になってても 4コア / シングルスレッドアプリ では当然なので無視する。

#### Bottom-up
![Screenshot from 2020-04-24 22-34-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14283/1348740c-3b5a-2d18-716d-1faaceecd124.png)

### Memory Access
#### Summary
![Screenshot from 2020-04-24 22-42-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14283/31ea3870-da05-4484-9e56-9867e29c0451.png)

#### Bottom-up
![Screenshot from 2020-04-24 22-43-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14283/f666f55d-b589-0f99-6e15-2b23a9d3ce44.png)

## CUI での実行

### 基本

```bash 
# Hotspots
vtune -collect hotspots [command]

# Microarchitecture Exploration
vtune -collect uarch-exploration [command]

# Memory Access
vtune -collect memory-access [command]
```

カレントディレクトリに r000hs のように結果が保存される。

#### knobの変更
```bash
# ハードウェアサンプリング、0.5msインターバル に変更
vtune -collect hotspots -knob sampling-mode=hw -knob sampling-interval=0.5 [command]
```

#### 実行例
```
$ vtune -collect hotspots ~/.rbenv/versions/ruby/bin/ruby bin/optcarrot-bench
vtune: Collection started. To stop the collection, either press CTRL-C or enter from another console window: vtune -r /home/k0kubun/src/github.com/mame/optcarrot/r000hs -command stop.
vtune: Error: Stack size provided to sigaltstack is too small. Please increase the stack size to 64K minimum.
fps: 50.041307146801635
vtune: Collection stopped.
vtune: Using result path `/home/k0kubun/src/github.com/mame/optcarrot/r000hs'
vtune: Executing actions 75 % Generating a report                              Elapsed Time: 4.325s
    CPU Time: 4.040s
        Effective Time: 4.040s
            Idle: 0s
            Poor: 4.040s
            Ok: 0s
            Ideal: 0s
            Over: 0s
        Spin Time: 0s
        Overhead Time: 0s
    Total Thread Count: 1
    Paused Time: 0s

Top Hotspots
Function               Module  CPU Time
---------------------  ------  --------
vm_exec_core           ruby      1.272s
vm_getivar             ruby      0.476s
vm_sendish             ruby      0.160s
rb_ary_entry_internal  ruby      0.148s
vm_push_frame          ruby      0.132s
[Others]               N/A       1.852s
Effective CPU Utilization: 24.2%
 | The metric value is low, which may signal a poor logical CPU cores
 | utilization caused by load imbalance, threading runtime overhead, contended
 | synchronization, or thread/process underutilization. Explore sub-metrics to
 | estimate the efficiency of MPI and OpenMP parallelism or run the Locks and
 | Waits analysis to identify parallel bottlenecks for other parallel runtimes.
 |
    Average Effective CPU Utilization: 0.969 out of 4
Collection and Platform Info
    Application Command Line: /home/k0kubun/.rbenv/versions/ruby/bin/ruby "bin/optcarrot-bench"
    Operating System: 4.15.0-96-generic NAME="Ubuntu" VERSION="18.04.4 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.4 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic
    Computer Name: bionic
    Result Size: 3 MB
    Collection start time: 05:58:46 25/04/2020 UTC
    Collection stop time: 05:58:50 25/04/2020 UTC
    Collector Type: Driverless Perf per-process counting,User-mode sampling and tracing
    CPU
        Name: Intel(R) Core(TM) Processor code named Haswell
        Frequency: 3.999 GHz
        Logical CPU Count: 4

If you want to skip descriptions of detected performance issues in the report,
enter: vtune -report summary -report-knob show-issues=false -r <my_result_dir>.
Alternatively, you may view the report in the csv format: vtune -report
<report_name> -format=csv.
vtune: Executing actions 100 % done
```

### 保存された結果をGUIで見る
```bash
# vtune-gui r000hs など
vtune-gui [result] 
```

開いてるプロジェクトとは別に見ることができる。

### 既存のプロジェクトに結果を保存する
```bash 
vtune -collect=[type] -user-data-dir=[project] [command]
```

開きっぱなしのGUIには反映されないので不便だが、開き直せばプロジェクトの一部として認識される。

### 実行中のプロセスにアタッチ
```bash
vtune -collect=[type] -target-pid=[pid]
```

普通のユーザーでやるとSEGVしたが、対象のプロセスとvtuneをsudoで実行したら動いたこともある。
hotspotsをcollectしていたら sudo でも `-run-pass-thru=--no-altstack` か `-knob sampling-mode=hw` がないと動かなかったこともあった。

vtuneのプロセスにSIGINTしても効かなくて、target pidのプロセスがexitするまで計測が終わらない。

### help

```bash 
# vtuneのhelp
vtune -help

# collectのhelp
vtune -help collect

# hotspotsのhelp (knobが見れる)
vtune -help collect hotspots
```