本当は怖いHPC

HPC屋の趣味&実益ブログ

Linux上での計算系プログラムの性能計測のための知識とツールまとめ

アプリケーションの性能最適化ツール等のまとめとリンク集です.随時更新していきたいと思っています.

私の専門分野の関係上,計算をガリガリするプログラムを対象としたものが多く,通信やWebサーバーのチューニング系は少なめです.

TL;DR(時間のない人へ)

とりあえずこの2つだけ嫁

Velocity 2015 linux perf tools

Linux Performance Profiling and Monitoring

まとめ・ノウハウ系資料

システムのパフォーマンスを改善する上で,どのコマンド/ツールをどう使えばよいか, どのようなアプローチが有効か,などの説明をしているページや動画等をまとめています.

Brendan Gregg氏の資料

Brendan Gregg氏は,perf-tools,やFlame Graphというツールの開発者であり,Netflixのエンジニアです.性能測定関係の情報を探していると,かならずGregg氏の資料にぶつかります.

4つ目のページには,OS(Linux)の構成要素と対応する計測ツールが図にまとめられています(下図は縮小したもの).これを見ればこのエントリいらないんじゃないかな(提案

f:id:keisukefukuda:20160830165959p:plain

その他

背景知識・前提知識・お勉強編(用語がわからない人へ)

個別コマンド・ツール編

上記「ノウハウ編」で登場したコマンドの個別の使い方や結果の解釈の仕方などを説明したページへのリンクを集めました.おおまかに,高レベル(OSレベル)→低レベル(CPU命令レベル)の順に並んでいます.リンクがないところは書いてる途中ですが,個別のツールについてはググればすぐに資料が見つかるので不要かもしれません.

std::tupleとstd::tieを使って複数の配列を一緒にソートする(配列の構造体 SoA のソート)

互いに関連付けられた複数の配列を一緒にソートしたい場合があります.

// SoAの例
std::vector<int> student_ids;
std::vector<std::string> names;
std::vector<int> math_scores;

// AoSの例
struct Student {
  int id;
  std::string name;
  int math_score
};

専門的には,SoA(Structure of Array:配列の構造体)と呼びます(かならずしも構造体とはなっていなくても).一方,普通に構造体やクラスの配列になっている場合はAoS(Array of Structure:構造体の配列)と呼ばれます.

さて,このSoAのデータ構造をソートしたいと思います.上の例で言いうと,生徒番号を元に名前などのフィールドを一斉にソートしたいということです.最初からAoSを採用すれば余計な苦労はありませんが,歴史的な事情や効率の都合でSoAになっているとします.

そこで,C++11のstd::tupleを使って,SoAを内部的にAoSに変換してソートする関数を書いてみました.ポイントは,std::tieを使うとPythonの一括代入のようなことができるという点ですね.これは調べるまで知りませんでした.

template<class T, class...Args>
void TiedSort(std::vector<T> &a, std::vector<Args>&... args) {
  using tt = struct {
    T key;
    std::tuple<Args...> val;
  };
  std::vector<tt> vals(a.size());

  for (size_t i = 0; i < a.size(); i++) {
    vals[i].key = a[i];
    vals[i].val = std::make_tuple(args[i]...);
  }

  std::sort(std::begin(vals), std::end(vals), [](const tt& a, const tt& b) {
      return a.key < b.key;
    });
  
  for (size_t i = 0; i < a.size(); i++) {
    a[i] = vals[i].key;
    std::tuple<Args&...>(args[i]...) = vals[i].val;
  }
}

int main() {
  std::vector<int> student_ids = {3,2,5,1,4};
  std::vector<double> weights = {42.3, 34.6, 32.5, 51.2, 41.7};
  std::vector<double> heights = {1,1,1,1,1};
  
  TiedSort<int, double, double>(student_ids, weights, heights);
}

なお,SoAをソートする方法としては,インデックス配列を用意してそれをソートする方法(数学で言う置換:permutationを使う)方法もありますが,これだと一時領域が必要になりコピーのコストが増大するため低速でした.そのうちPAPIとかを使ってきっちり評価したいとは思いますが.

C++テンプレートテクニック 第2版

C++テンプレートテクニック 第2版

2016/07/16 時点 Intel Xeon Phi の新製品Knights Landingについてのリンク集

自分用のリンク集です.

Knights Landingの出荷が始まっているようです.前世代のKnights Cornerで問題となったリングバスは取り除かれ,メッシュネットワークで置き換えられているようなので,性能評価が出てくるのが楽しみです

Intelのオフィシャルページ.スペック等

Intel® Xeon Phi™ Product Family

Intel Xeon Phi Processor High Performance Programming, Second Edition: Knights Landing Edition(オフィシャル解説本)

後藤弘茂さんによる安定の解説

後藤さんの記事は,きちんと基礎知識がないと理解すらおぼつきません.

Intelは機械学習で覇権を握れるか? ~GPGPUに対するXeon Phiの優位点を語る - PC Watch

【後藤弘茂のWeekly海外ニュース】Intelのサーバー戦略の要となるXeon PhiとFPGA - PC Watch 2016/7/6

【後藤弘茂のWeekly海外ニュース】ホモジニアスな構成が可能な新生Xeon Phi「Knights Landing」の強味 - PC Watch 2016/7/5

【後藤弘茂のWeekly海外ニュース】Intelがスパコンカンファレンスで「Knights Landing」を正式発表 - PC Watch 2016/6/22 @ ISC

信頼と実績のHPC Wire

Intel Launches 'Knights Landing' Phi Family for HPC, Machine Learning 2016/6/21 @ISC

What Knights Landing Is Not 2016/6/18

Intel Debuts 'Knights Landing' Ninja Developer Platform 2016/4/12

A Conversation with James Reinders 2016/1/21

The Next Platform

Intel Knights Landing Yields Big Bang For The Buck Jump 2016/6/20

マイナビ

米Intel、"Knights Landing"こと最大72コアの次世代「Xeon Phi」 | マイナビニュース 2016/6/22

その他

Intel talks concurrency and Knights Landing • The Register 2015/12/16

【広告】