Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // CppAmp_BrickSort.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
- //
- #include "stdafx.h"
- //#include <stdlib.h>
- //#include <time.h>
- //#include <amp.h>
- //#include <ppl.h>
- #define N ( 50 )
- // 基本的な奇偶転置ソート
- void oddEvenSort( int num, int* ary1 )
- {
- int flag = 1;
- while( flag ) {
- flag = 0;
- for( int i = 0; i < num - 1; i+= 2 ) {
- int v1 = ary1[ i ];
- int v2 = ary1[ i + 1 ];
- if( v1 > v2 ) {
- ary1[ i ] = v2;
- ary1[ i + 1 ] = v1;
- flag = 1;
- }
- }
- for( int i = 1; i < num - 1; i+= 2 ) {
- int v1 = ary1[ i ];
- int v2 = ary1[ i + 1 ];
- if( v1 > v2 ) {
- ary1[ i ] = v2;
- ary1[ i + 1 ] = v1;
- flag = 1;
- }
- }
- }
- }
- // for文を0から順番に回すようにした奇偶転置ソート
- void oddEvenSort2( int num, int* ary1 )
- {
- int flag = 1;
- while( flag ) {
- flag = 0;
- for( int i = 0; i < num / 2; i++ ) {
- int v1 = ary1[ 2 * i ];
- int v2 = ary1[ 2 * i + 1 ];
- if( v1 > v2 ) {
- ary1[ 2 * i ] = v2;
- ary1[ 2 * i + 1 ] = v1;
- flag = 1;
- }
- }
- for( int i = 0; i < ( num - 1 ) / 2; i++ ) {
- int v1 = ary1[ 2 * i + 1 ];
- int v2 = ary1[ 2 * i + 2 ];
- if( v1 > v2 ) {
- ary1[ 2 * i + 1 ] = v2;
- ary1[ 2 * i + 2 ] = v1;
- flag = 1;
- }
- }
- }
- }
- // OpenMPで並列化した奇偶転置ソート
- void oddEvenSortOpenMP( int num, int* ary1 )
- {
- int flag = 1;
- while( flag ) {
- flag = 0;
- #pragma omp parallel for
- for( int i = 0; i < num - 1; i+= 2 ) {
- int v1 = ary1[ i ];
- int v2 = ary1[ i + 1 ];
- if( v1 > v2 ) {
- ary1[ i ] = v2;
- ary1[ i + 1 ] = v1;
- flag = 1;
- }
- }
- #pragma omp parallel for
- for( int i = 1; i < num - 1; i+= 2 ) {
- int v1 = ary1[ i ];
- int v2 = ary1[ i + 1 ];
- if( v1 > v2 ) {
- ary1[ i ] = v2;
- ary1[ i + 1 ] = v1;
- flag = 1;
- }
- }
- }
- }
- // C++ AMPで並列化した奇偶転置ソート
- void oddEvenSortAmp( int num, int* ary1 )
- {
- concurrency::array_view< int, 1 > av1( num, ary1 );
- int flag = 1;
- concurrency::array_view< int, 1 > aFlag( 1, &flag );
- while( aFlag[ 0 ] ) {
- aFlag[ 0 ] = 0;
- concurrency::extent< 1 > extent;
- extent = av1.extent / 2;
- concurrency::parallel_for_each(
- extent,
- [=]( concurrency::index< 1 > idx ) restrict( amp )
- {
- int v1 = av1[ 2 * idx ];
- int v2 = av1[ 2 * idx + 1 ];
- if( v1 > v2 ) {
- av1[ 2 * idx ] = v2;
- av1[ 2 * idx + 1 ] = v1;
- aFlag[ 0 ] = 1;
- }
- } );
- extent = ( av1.extent - 1 ) / 2;
- concurrency::parallel_for_each(
- extent,
- [=]( concurrency::index< 1 > idx ) restrict( amp )
- {
- int v1 = av1[ 2 * idx + 1 ];
- int v2 = av1[ 2 * idx + 2 ];
- if( v1 > v2 ) {
- av1[ 2 * idx + 1 ] = v2;
- av1[ 2 * idx + 2 ] = v1;
- aFlag[ 0 ] = 1;
- }
- } );
- }
- }
- // Microsoft PPLで並列化した奇偶転置ソート
- void oddEvenSortPPL( int num, int* ary1 )
- {
- int flag = 1;
- while( flag ) {
- flag = 0;
- concurrency::parallel_for( 0, num - 1, 2, [&]( int i )
- {
- int v1 = ary1[ i ];
- int v2 = ary1[ i + 1 ];
- if( v1 > v2 ) {
- ary1[ i ] = v2;
- ary1[ i + 1 ] = v1;
- flag = 1;
- }
- } );
- concurrency::parallel_for( 1, num - 1, 2, [&]( int i )
- {
- int v1 = ary1[ i ];
- int v2 = ary1[ i + 1 ];
- if( v1 > v2 ) {
- ary1[ i ] = v2;
- ary1[ i + 1 ] = v1;
- flag = 1;
- }
- } );
- }
- }
- void bench( int m )
- {
- srand( 123456789 );
- int *ary1 = new int[ N ];
- for( int i = 0; i < N; i++ ) {
- ary1[ i ] = ( rand() >> 1 ) * ( rand() >> 1 ) * ( rand() >> 1 );
- }
- clock_t start, end;
- start = clock();
- switch( m ) {
- case 1: oddEvenSort( N, ary1 ); break;
- case 2: oddEvenSort2( N, ary1 ); break;
- case 3: oddEvenSortOpenMP( N, ary1 ); break;
- case 4: oddEvenSortPPL( N, ary1 ); break;
- case 5: oddEvenSortAmp( N, ary1 ); break;
- default: throw "バグバグ";
- }
- end = clock();
- printf( "%d の実行時間は %f [sec]のようです\n",
- m, ( (double)end - start ) / CLOCKS_PER_SEC );
- int prev = INT_MIN;
- for( int i = 0; i < N; i++ ) {
- //printf( "%d\n", ary1[ i ] );
- if( prev > ary1[ i ] ) {
- throw "ソートできてねぇだろボケェェェェェ";
- }
- prev = ary1[ i ];
- }
- delete[] ary1;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- bench( 1 );
- bench( 2 );
- bench( 3 );
- bench( 4 );
- bench( 5 );
- puts( "おしまい" );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement