ネタ元 → 並列処理が向かないかもしれない例 @ 東方算程譚
先ずはお家元のコードをそのまま Phenom II X4 940 で動かした結果。4コアにござる。
(環境: VS2010, x64 ,Windows 7)
109 (single)
1107 (multi)
で、うちのタイトルにあるように、ちょろっと改変。
C++, using GeSHi 1.0.8.8
// PPLで並行処理
void multi_bubble_sort(int* data, int N) {
bool swapped;
auto swapper = [&](int i) {
if ( data[i] > data[i+1] ) {
iter_swap(data+i,data+i+1);
swapped = true;
}
};
do {
swapped = false;
//parallel_for(0,N-1,2,swapper); // へーこー
//parallel_for(1,N-1,2,swapper); // しょり
parallel_invoke(
[&](){for ( int i = 0; i < N-1; i += 2 ) { swapper(i); }},
[&](){for ( int i = 1; i < N-1; i += 2 ) { swapper(i); }}
);
} while ( swapped );
}
Parsed in 0.020 seconds at 24.41 KB/s
でもって結果。
406 (parallel_invoke)
でっていう?=w=;
C++とかPPLのりはびりりはびり。
<緊急追記>
επιさんからコメ頂きました通りアルゴリズム的にりはびりどころじゃねーよ!ってコトで、とりあえず打ち消し線!
後でまたちょっといじります!失礼しましたーorz
<追記>
寝ぼけポイントの解説(ぅぅ、死にたくないけど死にたい^^;)
そ・も・そ・も、元のコードのアルゴリズムはparallel_forで偶数組み、奇数組みと順次forループする、そのforループの中を並行処理(parallel_for)するというものです。
僕が今朝書いてしまったうっかりどころではなくとんちんかんなコードは偶数組みと奇数組みのparalle_forの逐次実行を何故かただのforに戻し、アルゴリズム的に逐次実行されるべき2段階のforループを不正に2本並行処理するという意味不明なコードです。
加えて、επιさんからしょんぼりコメント頂きました様に、Debugビルドでのテストを怠った為に、assertで目を覚ます事もなくぼえぼえ~っと記事を垂れ流してしまったのでした;w;
申し訳ありませんでした!
7b9070d2-ecf0-4472-a28d-07dc5a3cc0cf|0|.0