自己紹介

太田一樹。
東京の大学の情報科学科に通う大学生。moratorium満喫中。

お勧め書籍

あわせて読みたい

あわせて読みたいブログパーツ

Search


Category Archives

Recent Entries

  1. はてな合宿
  2. ICFP2008
  3. カーネル読書会で発表してきました。
  4. 「プロトコルバッファー」がオープンソース化
  5. カーネル読書会
  6. 複数マシンへHadoopをインストールする
  7. 東京大学理学部情報科学科のHPがリニューアル
  8. tbb::parallel_sort
  9. Erlang勉強会
  10. iアプリ

2008年06月21日

tbb::parallel_sort

oxyたんがstd::sort速くなったらいいなあと呟いていたので、Intel TBBを試してみた。

インテル スレッディング・ビルディング・ブロック ―マルチコア時代のC++並列プログラミング

id:nishidakeisukeさんも最近書かれていましたね。

- インテル スレッディング・ビルディング・ブロック

オライリーの本自体は4月ぐらいに読み終わっていたのだが、実際に試してなかったので試してみた。

ダウンロードして来てビルド。

pficore% wget "http://www.threadingbuildingblocks.org/uploads/77/111/2.1/tbb21_20080605oss_src.tgz"
pficore% tar vzxf tbb21_20080605oss_src.tgz
pficore% cd tbb21_20080605oss/
pficore% make
pficore% sudo make install
Password:
make: *** ターゲット `install' を make するルールがありません.  中止.

なんかmake installが無い。とりあえずビルドされたものが出来てるディレクトリに謎のシェルスクリプトを発見。sourceしてみた。

pficore% cat build/linux_em64t_gcc_cc4.1.2_libc2.5_kernel2.6.20_release/tbbvars.sh
#!/bin/sh
[ -z "${TBB21_INSTALL_DIR}" ] && export TBB21_INSTALL_DIR="/home/kzk/tarball/tbb21_20080605oss" #
tbb_bin="${TBB21_INSTALL_DIR}/build/linux_em64t_gcc_cc4.1.2_libc2.5_kernel2.6.20_release" #
if [ -z "$CPATH" ]; then #
    export CPATH="${TBB21_INSTALL_DIR}/include" #
else #
    export CPATH="${TBB21_INSTALL_DIR}/include:$CPATH" #
fi #
if [ -z "$LIBRARY_PATH" ]; then #
    export LIBRARY_PATH="${tbb_bin}" #
else #
    export LIBRARY_PATH="${tbb_bin}:$LIBRARY_PATH" #
fi #
if [ -z "$LD_LIBRARY_PATH" ]; then #
    export LD_LIBRARY_PATH="${tbb_bin}" #
else #
    export LD_LIBRARY_PATH="${tbb_bin}:$LD_LIBRARY_PATH" #
fi #
 #
pficore% source build/linux_em64t_gcc_cc4.1.2_libc2.5_kernel2.6.20_release/tbbvars.sh
pficore% echo $TBB21_INSTALL_DIR
/home/kzk/tarball/tbb21_20080605oss

これで動くだろうけどなんか嫌だ。install target作って欲しいです > Intelの中の人。

次は適当にビルドして実行する。コードはこんな感じ。

#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <tbb/parallel_sort.h>
#include <tbb/task_scheduler_init.h>
using namespace std;

double gettimeofday_sec()
{
  struct timeval tv;
  gettimeofday(&tv, NULL);
  return tv.tv_sec + (double)tv.tv_usec*1e-6;
}

int
main(int argc, char **argv)
{
  int s = 500000000;
  vector<int> v(s);
  for(unsigned int i=0; i<s; i++)
    v[i] = rand();

  double t1 = gettimeofday_sec();
  if(strcmp(argv[1], "tbb") == 0){
    tbb::task_scheduler_init init;
    tbb::parallel_sort(v.begin(), v.end());
  }else{
    sort(v.begin(), v.end());
  }
  double t2 = gettimeofday_sec();
  cout << "sort time: " << t2 - t1 << endl;
  return 0;
}

2Gをソートしてみます。Core 2 Duo 6600 2.4G でビルド & 実行。

pficore% g++ -o parallel_sort -O2 -I${TBB21_INSTALL_DIR}/include parallel_sort.cpp -ltbb
pficore% time ./parallel_sort std
sort time: 70.4624
./parallel_sort std  76.36s user 1.85s system 99% cpu 1:18.86 total
pficore% time ./parallel_sort tbb
sort time: 41.6624
./parallel_sort tbb  86.31s user 1.90s system 176% cpu 50.020 total

ちゃんと速くなってますね、すばらしい。

インストール問題さえ無ければ手軽に並列化出来てよい感じ。


trackbacks

trackbackURL:

comments

comment form
comment form