我正在尝试执行以下操作:
- 声明并初始化 a
compute::vector
,n
每个元素为1^2
,2^2
,3^2
...n^2
- 当向量的大小 > 1 时
:对于 i = 0 到(向量的大小 - 1):n[i] += n[i+1]
b。从向量中删除最后一个元素 - 对向量中的剩余元素进行平方根。
我用 Boost.Compute 以这种方式实现了这个:
BOOST_COMPUTE_FUNCTION(double, square, (double x),
{
return x*x;
});
uint32_t cl_benchmark(const compute::device& gpu) {
compute::context ctx(gpu);
compute::command_queue queue(ctx, gpu);
//Starts measuring time from this line
compute::vector<double> v(size, ctx);
compute::iota(v.begin(), v.end(), 1, queue);
compute::transform( // b^2 and c^2 in one function
v.begin(), v.end(), v.begin(), square, queue
);
for (uint32_t temp_size = size; temp_size > 1; temp_size--) {
compute::adjacent_difference( // b^2 + c^2
v.begin(), v.end(), v.begin(), compute::plus<double>(), queue
);
v.erase(v.begin(), queue);
}
compute::transform( // sqrt(a)
v.begin(), v.end(), v.begin(), compute::sqrt<double>(), queue
);
//Stops measuring time
}
哪个有效,但经过测试它非常慢:
大小 6000 时间 551 毫秒
大小 7024 时间 1870 毫秒
大小 8048 时间 8262 毫秒
我知道编译内核以及将数据复制到 GPU 都需要时间,但结果对我来说似乎还是有点不对劲。
我只用单核 CPU 处理实现了类似的东西,它可以在 2 秒内处理大小约为 150k 的算法。
我怀疑for
循环是瓶颈,它不断编译新adjacent_difference
内核。这就是为什么我想知道它是否可以并行化?
据我了解,如果它不再adjacent_difference
为每次迭代编译新的,CPU 瓶颈应该会大大减少。