Advertisement
shobomaru

ParallelTest

Nov 18th, 2012
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.38 KB | None | 0 0
  1. // CppAmp_BrickSort.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. //#include <stdlib.h>
  7. //#include <time.h>
  8. //#include <amp.h>
  9. //#include <ppl.h>
  10.  
  11. #define N ( 50 )
  12.  
  13.  
  14. // 基本的な奇偶転置ソート
  15. void oddEvenSort( int num, int* ary1 )
  16. {
  17.     int flag = 1;
  18.  
  19.     while( flag ) {
  20.         flag = 0;
  21.         for( int i = 0; i < num - 1; i+= 2 ) {
  22.             int v1 = ary1[ i ];
  23.             int v2 = ary1[ i + 1 ];
  24.             if( v1 > v2 ) {
  25.                 ary1[ i ] = v2;
  26.                 ary1[ i + 1 ] = v1;
  27.                 flag = 1;
  28.             }
  29.         }
  30.         for( int i = 1; i < num - 1; i+= 2 ) {
  31.             int v1 = ary1[ i ];
  32.             int v2 = ary1[ i + 1 ];
  33.             if( v1 > v2 ) {
  34.                 ary1[ i ] = v2;
  35.                 ary1[ i + 1 ] = v1;
  36.                 flag = 1;
  37.             }
  38.         }
  39.     }
  40. }
  41.  
  42. // for文を0から順番に回すようにした奇偶転置ソート
  43. void oddEvenSort2( int num, int* ary1 )
  44. {
  45.     int flag = 1;
  46.  
  47.     while( flag ) {
  48.         flag = 0;
  49.         for( int i = 0; i < num / 2; i++ ) {
  50.             int v1 = ary1[ 2 * i ];
  51.             int v2 = ary1[ 2 * i + 1 ];
  52.             if( v1 > v2 ) {
  53.                 ary1[ 2 * i ] = v2;
  54.                 ary1[ 2 * i + 1 ] = v1;
  55.                 flag = 1;
  56.             }
  57.         }
  58.         for( int i = 0; i < ( num - 1 ) / 2; i++ ) {
  59.             int v1 = ary1[ 2 * i + 1 ];
  60.             int v2 = ary1[ 2 * i + 2 ];
  61.             if( v1 > v2 ) {
  62.                 ary1[ 2 * i + 1 ] = v2;
  63.                 ary1[ 2 * i + 2 ] = v1;
  64.                 flag = 1;
  65.             }
  66.         }
  67.     }
  68. }
  69.  
  70. // OpenMPで並列化した奇偶転置ソート
  71. void oddEvenSortOpenMP( int num, int* ary1 )
  72. {
  73.     int flag = 1;
  74.  
  75.     while( flag ) {
  76.         flag = 0;
  77. #pragma omp parallel for
  78.         for( int i = 0; i < num - 1; i+= 2 ) {
  79.             int v1 = ary1[ i ];
  80.             int v2 = ary1[ i + 1 ];
  81.             if( v1 > v2 ) {
  82.                 ary1[ i ] = v2;
  83.                 ary1[ i + 1 ] = v1;
  84.                 flag = 1;
  85.             }
  86.         }
  87. #pragma omp parallel for
  88.         for( int i = 1; i < num - 1; i+= 2 ) {
  89.             int v1 = ary1[ i ];
  90.             int v2 = ary1[ i + 1 ];
  91.             if( v1 > v2 ) {
  92.                 ary1[ i ] = v2;
  93.                 ary1[ i + 1 ] = v1;
  94.                 flag = 1;
  95.             }
  96.         }
  97.     }
  98. }
  99.  
  100. // C++ AMPで並列化した奇偶転置ソート
  101. void oddEvenSortAmp( int num, int* ary1 )
  102. {
  103.     concurrency::array_view< int, 1 > av1( num, ary1 );
  104.  
  105.     int flag = 1;
  106.     concurrency::array_view< int, 1 > aFlag( 1, &flag );
  107.  
  108.     while( aFlag[ 0 ] ) {
  109.         aFlag[ 0 ] = 0;
  110.  
  111.         concurrency::extent< 1 > extent;
  112.         extent = av1.extent / 2;
  113.  
  114.         concurrency::parallel_for_each(
  115.             extent,
  116.             [=]( concurrency::index< 1 > idx ) restrict( amp )
  117.         {
  118.             int v1 = av1[ 2 * idx ];
  119.             int v2 = av1[ 2 * idx + 1 ];
  120.             if( v1 > v2 ) {
  121.                 av1[ 2 * idx ] = v2;
  122.                 av1[ 2 * idx + 1 ] = v1;
  123.                 aFlag[ 0 ] = 1;
  124.             }
  125.         } );
  126.  
  127.         extent = ( av1.extent - 1 ) / 2;
  128.  
  129.         concurrency::parallel_for_each(
  130.             extent,
  131.             [=]( concurrency::index< 1 > idx ) restrict( amp )
  132.         {
  133.             int v1 = av1[ 2 * idx + 1 ];
  134.             int v2 = av1[ 2 * idx + 2 ];
  135.             if( v1 > v2 ) {
  136.                 av1[ 2 * idx + 1 ] = v2;
  137.                 av1[ 2 * idx + 2 ] = v1;
  138.                 aFlag[ 0 ] = 1;
  139.             }
  140.         } );
  141.     }
  142. }
  143.  
  144. // Microsoft PPLで並列化した奇偶転置ソート
  145. void oddEvenSortPPL( int num, int* ary1 )
  146. {
  147.     int flag = 1;
  148.  
  149.     while( flag ) {
  150.         flag = 0;
  151.         concurrency::parallel_for( 0, num - 1, 2, [&]( int i )
  152.         {
  153.             int v1 = ary1[ i ];
  154.             int v2 = ary1[ i + 1 ];
  155.             if( v1 > v2 ) {
  156.                 ary1[ i ] = v2;
  157.                 ary1[ i + 1 ] = v1;
  158.                 flag = 1;
  159.             }
  160.         } );
  161.         concurrency::parallel_for( 1, num - 1, 2, [&]( int i )
  162.         {
  163.             int v1 = ary1[ i ];
  164.             int v2 = ary1[ i + 1 ];
  165.             if( v1 > v2 ) {
  166.                 ary1[ i ] = v2;
  167.                 ary1[ i + 1 ] = v1;
  168.                 flag = 1;
  169.             }
  170.         } );
  171.     }
  172. }
  173.  
  174. void bench( int m )
  175. {
  176.     srand( 123456789 );
  177.  
  178.     int *ary1 = new int[ N ];
  179.     for( int i = 0; i < N; i++ ) {
  180.         ary1[ i ] = ( rand() >> 1 ) * ( rand() >> 1 ) * ( rand() >> 1 );
  181.     }
  182.  
  183.     clock_t start, end;
  184.     start = clock();
  185.  
  186.     switch( m ) {
  187.     case 1: oddEvenSort( N, ary1 ); break;
  188.     case 2: oddEvenSort2( N, ary1 ); break;
  189.     case 3: oddEvenSortOpenMP( N, ary1 ); break;
  190.     case 4: oddEvenSortPPL( N, ary1 ); break;
  191.     case 5: oddEvenSortAmp( N, ary1 ); break;
  192.     default: throw "バグバグ";
  193.     }
  194.  
  195.     end = clock();
  196.     printf( "%d の実行時間は %f [sec]のようです\n",
  197.         m, ( (double)end - start ) / CLOCKS_PER_SEC );
  198.  
  199.     int prev = INT_MIN;
  200.     for( int i = 0; i < N; i++ ) {
  201.         //printf( "%d\n", ary1[ i ] );
  202.         if( prev > ary1[ i ] ) {
  203.             throw "ソートできてねぇだろボケェェェェェ";
  204.         }
  205.         prev = ary1[ i ];
  206.     }
  207.  
  208.     delete[] ary1;
  209. }
  210.  
  211. int _tmain(int argc, _TCHAR* argv[])
  212. {
  213.     bench( 1 );
  214.     bench( 2 );
  215.     bench( 3 );
  216.     bench( 4 );
  217.     bench( 5 );
  218.  
  219.     puts( "おしまい" );
  220.     return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement