No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 1133 | 1134 | 1135 |...| 1321 | 1322 | 1323 || Next»

libstdc++ parallel mode を試す

EuroPar2007で発表のあった The Multi-Core Standard Template Library (MCSTL) が GCC に統合されている(されつつある?)らしいので,セミナーのネタにと試用してみた.GCCのオフィシャルページを見ると libstdc++ parallel mode という名前で統合中らしい.こいつは既存の STL を OpenMP による並列実装の STL に置換しましょうというもので,既存の STL で書かれたコードがそのままで並列プログラムになってくれる.

んで,試そうと思ったら最新のGCCリリースであるところの 4.2.2 にも入っていないということに GCC4.2.2 のビルドが終わった時点で気づき… しょうがないので svn のリポジトリから最新のソースを落としてきて GCC をビルドした(8コアくらいあるマシンで make -j8 とかやるとビルドがとても速い).とりあえずソースの状態で libstdc++-v3/include/parallel というディレクトリがあれば parallel mode が使える.

準備できたので次の std::sort を使ったプログラムを試してみた.

#include <iostream>
#include <algorithm>
#include <vector>
const int count = 1000000, num_tests = 10;
int main(int argc, char **argv)
{
    std::vector<int> v(count);
    for (int i = 0; i < num_tests; i++)
    {
        std::generate(v.begin(), v.end(), rand);
        std::sort(v.begin(), v.end());
        std::cout << "." << std::flush;
    }
}

コンパイルは parallel mode 用のフラグ(-D_GLIBCXX_PARALLEL -fopenmp)を立てればよいらしい.

 g++-XXX test.cpp -o testS -march=native  # sequential mode
 g++-XXX test.cpp -o testP -march=native -D_GLIBCXX_PARALLEL -fopenmp  # parallel mode

Quad の Xeon x2 という8コアで動かした結果は以下のとおり.

> OMP_NUM_THREADS=8 time ./testS   # sequential mode
..........        6.26 real         6.24 user         0.01 sys
> OMP_NUM_THREADS=8 time ./testP   # parallel mode
..........        1.39 real         5.66 user         0.75 sys

普通に4~5倍速くなってるのを確認.すげー.並列プログラミング簡単.とりあえず sort は簡単に並列に動いてくれた.

ついでに, parallel mode は他にも並列実装を持っているらしいので試してみた.

まず std::partial_sum.4.51秒が1.65秒になった.8コアで約四倍.

#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
struct one {
  int operator()() const {
    return 1;
  }
};
const int count = 10000000, num_tests = 10;
int main(int argc, char **argv)
{
    std::vector<int> v(count);
    std::vector<int> r(count);
    std::generate(v.begin(), v.end(), one());
    for (int i = 0; i < num_tests; i++)
    {
        std::partial_sum(v.begin(), v.end(), r.begin());
        std::cout << "." << std::flush;
    }
}

次は std::accumulate.3.20秒が3.79秒に増えた.全要素の和をとるだけなので普通に考えると8コアで8倍いきそうだけど… 速くならない理由は不明.

#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
struct one {
  int operator()() const {
    return 1;
  }
};
const int count = 10000000, num_tests = 10;
int main(int argc, char **argv)
{
    std::vector<int> v(count);
    std::generate(v.begin(), v.end(), one());
    for (int i = 0; i < num_tests; i++)
    {
        int sum = std::accumulate(v.begin(), v.end(), 0);
        std::cout << "." << std::flush;
    }
}

最後に試したのは std::for_each.3.81秒が3.75秒.全要素に独立に関数適用するだけなので8コアで8倍いきそうだけど… 速くならない理由は不明.

#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
struct f {
  void operator()(int &x) const {
    x = x + 1;
  }
};
struct one {
  int operator()() const {
    return 1;
  }
};
const int count = 10000000, num_tests = 10;
int main(int argc, char **argv)
{
    std::vector<int> v(count);
    std::generate(v.begin(), v.end(), one());
    for (int i = 0; i < num_tests; i++)
    {
        std::for_each(v.begin(), v.end(), f());
        std::cout << "." << std::flush;
    }
}

ということで,簡単に並列化できそうな部分でいろいろと失敗した模様.使い方が悪いのか実装途中なのか? よくわからんけどうまく動いた部分に関しては効果が確認できたのでよし.

tramp を Meadow で使ってみる

うまく使えずにごちゃごちゃやってたけど最終的に落ち着いた方法:

(setq tramp-default-method "sshx")

を .emacs に追加して ssh 経由をデフォルトにしつつ, cygwin の ssh-agent でキー認証をかけておいて meadow をそのコマンドラインから起動.

落ちとしては,HOME の設定が meadow 用と cygwin 用で別々になっているため .emacs がうまく読まれなかったり,同じく HOME のせいで known_hosts へのキーの追加に失敗したり,キー追加確認用の YES/NO 選択で応答不能になったりと.

とりあえず HOME の設定を整理しようかなと思う.

runas コマンドと administrator の有効化

管理者権限での実行は runas コマンドで実行アカウントを切り換えればできるらしい.でも,Administrator アカウント自体が有効にされていなかったために何度試しても失敗しまくった.

ということで,Administrator アカウントの有効化:スタートメニューとかのコンピュータの右クリックメニューの管理(コンパネからコンピュータの管理でも可)→ システムツールの下のローカルユーザとグループ → ユーザ → Administrator を選択してプロパティ開いて無効化のチェックをはずして閉じる → Administrator を選択してパスワード設定.これでやりたい放題.

Bookoff 宅本便の結果来た

本棚の整理をして邪魔になった本を一週間ほど前に宅本便で売りに出していたのだけどその結果が今日来てた.ラノベと漫画が半々くらいで結果は以下のとおり.

種類                                        計算金額      商品数
__________________________________________________________________
本                                            4420円      106冊
お値段がつかなかった本                                      0冊
ソフト                                           0円        0点
お値段がつかなかったソフト                                  0点
__________________________________________________________________
商品数合計                                                106点
お値段がつかなかった商品数合計                              0点
お支払金額合計                    5304円(うち割増分       884円)

2割り増しのキャンペーンも入って一冊あたり50円なり.ゴミよりは高いが安いよなぁ.全巻セットとか限定版とかならオークションで売ったほうが手間はかかるけど還元率は高そう.

パーミッション変更が…

Vista でうまくできない.どういう管理になってるんだ? 管理者権限のアカウントだけど管理者権限でプログラムを動かすにはどうすればいいんだろう? いろいろと書込み禁止で作業できん…

Tone Generator とかモスキート音とか

何ヘルツの音まで聞こえるかを tone generator のソフトで試してみた.テレビの音 15kHz は普通に聞こえる.しばらく上げて 17kHz は聞こえる.18kHz くらいから怪しくなる.19kHzになるとある特定の角度に頭を傾けたときに感じるていど(聞くというレベルでなく).20kHz も19kHzと同じ方向のみ頭を振れば変化が感じられる程度.まあ,スピーカの音を最大に引き上げれば聞こえなくもないけど体に悪そう.

«Prev || 1 | 2 | 3 |...| 1133 | 1134 | 1135 |...| 1321 | 1322 | 1323 || Next»
Search
Feeds

Page Top