- 设备:特斯拉 C2050
- 操作系统:Windows 7 企业版
- IDE:VS 2012
大家好。我正在使用 AMP C++ 进行一些体积计算。
我有数百万个四面体,一点在 (0,0,0)。所以我可以用一种简单的方式得到四面体的体积:
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++ 花费 0.085 秒来完成 1024 * 1024 * 2 个三角形的计算。但是 AMP C++ 代码需要 0.530 秒。比 c++ 代码要多得多。
在网上搜索后,有一个提示:如果我们先预热设备,我们可以得到“实时”计算的时间成本。
所以我首先计算 128 个三角形来预热设备(花费大约 0.2 秒),然后通过计算 1024 * 1024 * 2 个三角形得到体积。它变得更快(花费大约 0.091 秒),但仍然比 CPU(单核)代码慢。
我想知道为什么,以及任何可以帮助我加快计算速度的人。
非常感谢。