c++ amp ソート

GPUによる頭悪そうな総当たりソートプログラム。


#include
#include
using namespace concurrency;
void test_sort()
{
std::vector data(16);

// random value
data[0] = 8;
data[1] = 4;
data[2] = 3;
data[3] = 7;
data[4] = 6;
data[5] = 5;
data[6] = 2;
data[7] = 1;

array a(2,8, data.begin(), data.end()); // 2x8

int input_len = data.size() / 2;

// GPU総当たりソート
parallel_for_each(
a.extent,
[=, &a](index<2> idx) restrict(amp) // 2 is two dimension.
{
int x = idx[0]; // 0-1 (0:input, 1:output)
int y = idx[1]; // 0-7

UINT order = 0;

if ( x == 0 )
{
for( auto i = 0; i < input_len; i++ )
{
if ( a[index<2>(0,i)] < a[idx] )
{
order++;
}
}
a[ index<2>(1,y) ] = order;
}
}
);


// 結果
_ASSERT( input_len == 8 );

data = a;

for (int i = 0; i < input_len; i++)
{
std::wcout << data[i] << L',' ; // 8,4,3,7,6,5,2,1 input value
}
std::wcout << L"\n";

for (int i = input_len; i < input_len*2; i++)
{
std::wcout << data[i] << L',' ; // 7,3,2,6,5,4,1,0 result value
}
std::wcout << L"\n";

std::vector out(input_len);
for (int i = 0; i < input_len; i++)
{
out[ data[i+input_len] ] = data[i];
}

for (int i = 0; i < input_len; i++)
{
std::wcout << out[i] << L',' ; // 1,2,3,4,5,6,7,8 sort value
}

std::wcout << L"\n";
}

力まかせです。