研究日誌。

大規模なグラフ処理に対してメモリ階層構造を考慮した高性能なソフトウェアを開発。

subversion補完@zsh。

2009-10-31 13:01:16 | Weblog
zsh で、svn のオプション補完を有効にするお話。


[1] Download
$ wget http://gvn.googlecode.com/svn/trunk/contrib/zsh/_subversion


[2] 更新。前のは _subversion.bkup として取っておく。
# mv /usr/share/zsh/*/functions/_subversion /usr/share/zsh/*/functions/_subversion.bkup
# cp _subversion /usr/share/zsh/*/functions/_subversion

LyX@Windows。

2009-10-30 16:23:46 | Weblog
以前、LyX@WindowsXP という環境でセットアップを試みたがうまくいかなかったので、「LyX入門 / 技術評論社」を買ってみた。以前得た情報に勘違いして、それでうまくいかなかったことが分かったので、良し。

勿体ないと思ってこの手の本は買ってなかったが、時間をかけては意味がないので次からは少しやってうまくいかなかったら、すぐ買ってしまおうと誓った。

どのウェブサイトも書かれていることだが、
結局「Babel japanese パッケージ」を入れればよいだけ。

1. CTAN から japanese.zip を持ってきて、
2. C:\tex\share\texmf-local\tex\platex\ あたりに解凍しておく(フォルダ毎)
3. platex japanese.ins
4. mktexlsr

こういうのは知らなかったわけではないし、やったかどうか忘れてただけだが、簡単にハマってしまった。残念だ。

OpenMP - その11(まとめ)。

2009-10-29 16:23:21 | Weblog
今回の実験でわかったことは次のこと。

OpenMP で生成したスレッドは、コアを 数十% ほどしか専有せず、本気で実行してくれない。そのためコア数以上のスレッドを起動させても、性能が伸びるが効率は pthreads に比べ非常に悪くなってしまう。

プロセスの優先度を設定することで、もしかしたら改善できるかもしれない(未確認)が、そこまでするなら、素直に Pthreads でいいだろう。

OpenMP - その10。

2009-10-28 16:22:51 | Weblog
次に、Istanbul での実験結果。
こちらは、GCC のみの結果である。
Nehalem に比べてかなり素直に台数効果は伸びるものの、Pthreads に比べると残念。

    dynamic  static   Pthreads
 1  5.825    5.825    5.732
 2  5.484    5.539    3.068
 4  3.269    3.278    1.579
 8  1.863    1.867    0.867
10  1.597    1.591    0.748
12  1.379    1.365    0.667
14  1.202    1.237    0.667
16  1.105    1.111    0.667
18  1.057    1.079    0.667
20  1.003    1.005    0.667
22  0.966    1.008    0.667
24  0.988    0.970    0.667
26  0.952    0.962    0.667
28  0.932    0.947    0.667
30  0.953    0.958    0.667
32  0.948    0.944    0.667



OpenMP - その9。

2009-10-27 16:22:00 | Weblog
まずは Nehalem-EP での実行時間。
OpenMP 版はかなり実行にバラツキがある。

   gcc-4.4.1                   icc-11.1
   dynamic  static  Pthreads   dynamic  static  Pthreads
1    4.998   4.998     5.004     4.910   4.903     4.698
2    5.739   6.353     2.654     9.756  10.362     2.400
4    4.730   4.199     1.350     5.826   6.390     1.292
8    2.508   2.511     0.710     3.529   3.650     0.703
10   2.188   3.067      -        1.586   1.556       -
12   2.046   1.463      -        1.389   1.288       -
14   1.454   1.547      -        1.076   1.347       -
16   1.109   1.062      -        1.130   1.191       -
18   1.069   1.167      -        1.072   1.248       -
20   0.929   1.016      -        1.071   1.190       -
22   1.011   1.005      -        1.122   0.980       -
24   0.942   1.021      -        0.985   0.937       -
26   0.909   1.077      -        1.190   1.206       -
28   0.934   0.986      -        1.018   1.027       -
30   0.989   1.050      -        0.995   0.947       -
32   0.940   0.908      -        0.958   0.994       -

OpenMP - その8。

2009-10-26 16:21:13 | Weblog
GCC4.4.1 から OpenMP3.0 なので、これからはこちらでの実験結果で見ていく。
OpenMP3.0 では、タスク並列化の機能が強化されているそう。

■実験環境
NehalemEP : Xeon(R) CPU X5550 @ 2.67GHz (4cores x 2sockets)
Intabul : Six-Core AMD Opteron(tm) Processor 2435 (6cores x 2sockets)

■コンパイラ
GCC: gcc-4.4.1 (OpenMP3.0)
ICC: icc-11.1 (OpenMP3.0)

■使用したデータ
グラフ:USA-road-d.NY.gr
クエリ:P2P x 256

■実験
dynamic: OpenMP ver. クエリ毎にスレッドを起動を行う。
static: OpenMP ver. スレッドを立ち上げておき、各スレッドで排他的にクエリを分け合う。
Pthreads: Pthreads ver.

CPU Affinity。

2009-10-25 16:20:07 | Weblog
設定方法に関して。

以下は、OMP_NUM_THREADS の数だけスレッドを起動し、それぞれ「i % NUM_CORES(プロセッサのコア数)」に、割り当てる場合。ひとまず順番ずつ割り当てる。このようにすると、スレッドとコアを対応付けることができる。

# pragma omp parallel for schedule(static) private(i)
for (i = 0; i < num_threads; i++) {
  cpu_set_t mask;
  CPU_ZERO(&mask);
  CPU_SET(i % NUM_CORES, &mask);
  if (sched_setaffinity(0, sizeof(cpu_set_t), &mask) == -1) {
    printf("Failed ot set CPU affinityn");
    exit(1);
  }
  /* なんらかの処理 */
  function();
}


ゼミ。

2009-10-23 15:27:59 | Weblog
賑やかなゼミでした。
最適化ソフトウェア開発に関して、いろいろと議論しました。
来られた方の中には小中の同級生も。
それぞれの研究発表もできすごく楽しかったです。
同じ分野にいながら今回初でした。

故障多い?

2009-10-22 15:32:03 | Weblog
■ laqua.indsys.chuo-u.ac.jp の HDD 0 が壊れる。
HDD 0 が壊れ OS が起動しなくなる。良く分からないが RAID 5 でもこのような状況になってしまうのだろうか。正直残念。

修理に来られた方に、直っているかも分からずに評価を求められ、5 段階で 4 にした。HDD の入れ替えだけではボロが出るはずもないし、本人の前ということでなんとなく +1 したが、1 もしくは 2 だった。

■ Aquos
前々から電源の接触が良くないような気がしていたが、とうとう気のせいではなくなってきた。

OpenMP - その7。

2009-10-21 03:04:17 | Weblog
もう少し大きなグラフで。
グラフ : USA-road-d.FLA.gr(1070376 nodes 2712798 arcs)
クエリ : P2P x 256
コンパイラ : gcc-4.1.2

[Pthreads ver.]
   [1]    [2]    [4]    [8]
19.536  9.892  5.040  2.951

OMP_NUM_THREADS=1
schedule(dynamic)  19.541 sec.
 0    1   2   3   4   5   6   7  
 0  256   0   0   0   0   0   0  

schedule(static)  19.450 sec.
 0   1    2   3   4   5   6   7  
 0  256   0   0   0   0   0   0  

schedule(guided)  19.537 sec.
 0   1    2   3   4   5   6   7  
 0  256   0   0   0   0   0   0  


OMP_NUM_THREADS=2
schedule(dynamic)  21.857 sec.
 0    1   2    3   4   5   6   7
 0  134   0  122   0   0   0   0

schedule(static)   20.331 sec.
 0    1   2   3    4   5   6   7
 0  128   0   0  128   0   0   0

schedule(guided)  20.443 sec.
 0    1   2   3   4   5   6    7  
 0  128   0   0   0   0   0  128


OMP_NUM_THREADS=4
schedule(dynamic)  15.731 sec.
 0   1   2   3   4   5   6   7  
 0  54  50   0  66   0   0  86  

schedule(static)  16.541 sec.
 0   1   2   3   4   5   6   7  
64   0   0  64  64   0   0  64  

schedule(guided)  15.768 sec.
 0   1   2   3   4   5   6   7  
 0  56  48   0   0  68   0  84  


OMP_NUM_THREADS=8
schedule(dynamic)  9.828 sec.
 0   1   2   3   4   5   6   7
18  37  47  39  16  32  24  43

schedule(static)  10.563 sec.
 0   1   2   3   4   5   6   7  
20  50  14  32  32  32  44  32  

schedule(guided)   9.932 sec.
 0   1   2   3   4   5   6   7  
37  35  30  43  12  28  18  53  

OpenMP - その6。

2009-10-20 02:10:07 | Weblog
3種類に対して実験を行うとやはり予想通り(実行時間に関して、「schedule(dynamic) <schedule(guided) < schedule(static)」。)となるが、OpenMP の性能だけとは考えにくいほどの差があるのも事実。 グラフ : USA-road-d.NY.gr(264346 nodes 733846 arcs)
クエリ : P2P x 256
コンパイラ : gcc-4.1.2

[データの見方]
schedule の方針、実行時間
各コアの実行クエリ数

[Pthreads ver.]
  [1]    [2]    [4]    [8]
4.748  2.402  1.223  0.695


OMP_NUM_THREADS=4
schedule(dynamic)  3.913 sec.
 0   1   2   3   4   5   6   7
40   0   0  56   0  65   0  95

schedule(static)  4.053 sec.
 0   1   2   3   4   5   6   7
 0  64  64   0   0  64   0  64

schedule(guided)  3.977 sec.
 0   1   2   3   4   5   6   7
42   0   0  64  63   0   0  87


OMP_NUM_THREADS=8
schedule(dynamic)  2.235 sec.
 0   1   2   3   4   5   6   7  
17  43  34  16  23  40  37  46  

schedule(static)  2.522 sec.
 0   1   2   3   4   5   6   7
12  32  22  32  42  32  32  52

schedule(guided)  2.384 sec.
 0   1   2   3   4   5   6   7
22  28  29  19  41  41  32  44

OpenMP - その5。

2009-10-19 01:54:28 | Weblog
OpenMP に関して、schedule の方針は 3 パターンある。

・schedule(static, chunk)
chuck で loop を静的に分割

・schedule(dynamic, chunk)
chunk を 動的に空きスレッドに割り当てる

・schedule(guided, chunk)
指数関数的に分割。ようするに最初は大きく分割、後半は少なく分割。

その他、環境変数で指定するものもあり。
・schedule(runtime)


これらには、それぞれ実装に特性があるそうで単に機能だけで選ぶのは良くなさそう。しかしながら、このブログで公開した結果は最短路ソルバー(並列部分は、粒度の大きな関数)なので、どれでもそこそこ性能は出るはずだが、うまくいかない。

rpm-Fusion。

2009-10-18 17:40:36 | Weblog
Fedora で mp3 を聞こうと思おうと totem player で開くも codec がないとのこと。
検索すると、"Getting MP3 Support in Fedora Using RPMFusion Repositories" という動画を発見。参考にしました。

1. http://rpmfusion.org/

2. Configuration タブを開き、次の Repository を登録。
 「RPM Fusion free for Fedora 10 and 11」
 「RPM Fusion nonfree for Fedora 10 and 11」

3. 「Gstreamer streaming media framework」らをインストール。