- デバイス: テスラ C2050
- OS : Windows 7 エンタープライズ
- IDE: VS 2012
こんにちは、みんな。ボリュームの計算に AMP C++ を使用しています。
(0,0,0) に 1 つのポイントを持つ何百万もの四面体があります。したがって、四面体の体積を簡単な方法で取得できます。
sum += triangle.x1 * triangle.y2 * triangle.z3 + \
triangle.y1 * triangle.z2 * triangle.x3 + \
triangle.x2 * triangle.y3 * triangle.z1 - \
triangle.x3 * triangle.y2 * triangle.z1 - \
triangle.x2 * triangle.y1 * triangle.z3 - \
triangle.y3 * triangle.z2 * triangle.x1;
そこで、AMP C++ を使用して計算を高速化したいと考えています。
これがコードです。
typedef struct
{
double x1;
double y1;
double z1;
double x2;
double y2;
double z2;
double x3;
double y3;
double z3;
} Triangle;
そして、主な機能は次のとおりです。
accelerator my_accelerator(accelerator::default_accelerator);
accelerator_view acc_view = my_accelerator.get_default_view();
const int BLOCK_SIZE = 64;
int outputSize = int(numTriangles / BLOCK_SIZE);
int dimA = int(numTriangles / BLOCK_SIZE) * BLOCK_SIZE;
std::cout<<dimA<<std::endl;
//copy triangles from host to device
array<Triangle,1> triangle(numTriangles);
copy(vTriangle.begin(),vTriangle.end(), triangle);
//Volume
std::vector<double> volumeCPP;
for (int i=0; i < outputSize; i++)
{
volumeCPP.push_back(double(0));
}
array_view<double,1> volume(outputSize,volumeCPP);
volume.discard_data();
clock_t start,finish;
start = clock();
parallel_for_each(
volume.extent.tile<1>(),
[=, &triangle](tiled_index<1> t_idx) restrict(amp)
{
double sum = 0.0f;
tile_static Triangle tile_triangle[4];
tile_triangle[t_idx.local[0]] = triangle[t_idx.global];
if (t_idx.local[0] == 0)
{
for (int idx=0; idx < BLOCK_SIZE; idx++){
sum += tile_triangle[idx].x1 * tile_triangle[idx].y2 * tile_triangle[idx].z3 + tile_triangle[idx].y1 * tile_triangle[idx].z2 * tile_triangle[idx].x3 + tile_triangle[idx].x2 * tile_triangle[idx].y3 * tile_triangle[idx].z1 - tile_triangle[idx].x3 * tile_triangle[idx].y2 * tile_triangle[idx].z1 - tile_triangle[idx].x2 * tile_triangle[idx].y1 * tile_triangle[idx].z3 - tile_triangle[idx].y3 * tile_triangle[idx].z2 * tile_triangle[idx].x1;
//t_idx.barrier.wait();
}
//t_idx.barrier.wait();
}
volume[t_idx.global] = sum;
}
);
acc_view.wait();
finish = clock();
copy(volume, volumeCPP.begin());
だから、すべての仕事がダウンしています。しかし、興味深いことはです。CPU(シングルコア)コードよりもコストがかかります。
CPU (シングルコア) 上の C++ は、1024 * 1024 * 2 三角形の計算を完了するのに 0.085 秒かかります。しかし、AMP C++ コードのコストは 0.530 秒です。C++ コードよりもはるかに多くの.
インターネットで検索した後、ヒントがあります。最初にデバイスをウォームアップすると、計算で「リアルタイム」コストを取得できます。
そのため、最初に 128 個の三角形を計算してデバイスをウォームアップし (約 0.2 秒かかります)、次に 1024 * 1024 * 2 個の三角形を計算してボリュームを取得します。はるかに高速になりました (約 0.091 秒かかります) が、それでも CPU (シングルコア) コードよりは遅くなります。
理由と、計算を高速化するのを手伝ってくれる人がいれば知りたいです。
どうもありがとう。