0

我正在尝试执行以下操作:

  1. 声明并初始化 a compute::vectorn每个元素为1^2, 2^2, 3^2...n^2
  2. 当向量的大小 > 1 时
    :对于 i = 0 到(向量的大小 - 1):n[i] += n[i+1]
    b。从向量中删除最后一个元素
  3. 对向量中的剩余元素进行平方根。

我用 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 瓶颈应该会大大减少。

4

0 回答 0