【问题标题】:What is the fastest way of Boost::compute vector partial sumBoost::compute向量部分和的最快方法是什么
【发布时间】:2018-05-15 02:34:47
【问题描述】:

我有一个 10M 浮点数的向量。 我想知道每 100 个元素的总和,所以总共有 10000 个总和。 最快的方法是什么?

【问题讨论】:

  • 如果可以使用OpenCL 2,那我推荐@huseyin的回答here

标签: boost opencl boost-compute


【解决方案1】:

我建议使用reduce_by_key 算法、花哨的迭代器和 Boost.Compute lambda expr。每 100 个元素用相同的键标记并减少。我不确定您是否可以将keys_output 替换为discard_iterator 以节省一些性能。

boost::compute::vector<int> keys_output(values_input.size()/100, context);
boost::compute::vector<int> values_output(values_input.size()/100, context);

boost::compute::reduce_by_key(
    boost::compute::make_transform_iterator(
      boost::compute::make_counting_iterator<int>(0),
      boost::compute::_1 / 100
    ),
    boost::compute::make_transform_iterator(
      boost::compute::make_counting_iterator<int>(values_input.size()),
      boost::compute::_1 / 100
    ),
    values_input.begin(),
    keys_output.begin(), 
    values_output.begin(),
    queue
 );

【讨论】:

  • 肯定没有手写 OpenCL 代码那么快。这是一个特例。在大多数 GPU 上,您将能够通过一个或两个步骤(内核)将向量中的每 100 个元素相加。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2019-06-25
  • 1970-01-01
相关资源
最近更新 更多