2008年06月21日
tbb::parallel_sort
oxyたんがstd::sort速くなったらいいなあと呟いていたので、Intel TBBを試してみた。
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
ちゃんと速くなってますね、すばらしい。
インストール問題さえ無ければ手軽に並列化出来てよい感じ。
- by
- at 01:24


comments