Tags: , | Posted by usagi on 2010/06/23 7:31 | コメント (4)

ネタ元 → 並列処理が向かないかもしれない例 @ 東方算程譚

先ずはお家元のコードをそのまま Phenom II X4 940 で動かした結果。4コアにござる。
(環境: VS2010, x64 ,Windows 7)

109 (single)
1107 (multi)

で、うちのタイトルにあるように、ちょろっと改変

C++, using GeSHi 1.0.8.8
  1. // PPLで並行処理
  2. void multi_bubble_sort(int* data, int N) {
  3. bool swapped;
  4. auto swapper = [&](int i) {
  5. if ( data[i] > data[i+1] ) {
  6. iter_swap(data+i,data+i+1);
  7. swapped = true;
  8. }
  9. };
  10. do {
  11. swapped = false;
  12. //parallel_for(0,N-1,2,swapper); // へーこー
  13. //parallel_for(1,N-1,2,swapper); // しょり
  14. parallel_invoke(
  15. [&](){for ( int i = 0; i < N-1; i += 2 ) { swapper(i); }},
  16. [&](){for ( int i = 1; i < N-1; i += 2 ) { swapper(i); }}
  17. );
  18. } while ( swapped );
  19. }
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;

申し訳ありませんでした!

コメント

επιστημη
επιστημη on 2010/06/23 8:45 偶数swapと奇数swapを並行させちゃソートしてくんないですよぅ...
usagi
usagi on 2010/06/23 8:53 > 偶数swapと奇数swapを並行させちゃソートしてくんないですよぅ...
朝っぱらからアホやらかしましたOTL
遊びは後にしてとりあえず記事に追記しときます=w=;
επιστημη
επιστημη on 2010/06/23 9:15 Debug-modeでいっぺん動かしてりゃassertにひっかかってくれたんちゃうかなー...
usagi
usagi on 2010/06/23 15:46 ううう、ごめんなさいごめんなさいorz
寝ぼけてたってレベルじゃなくごめんなさいいいい
コメント可能な期間を過ぎました