【问题标题】:Optimize histogram update优化直方图更新
【发布时间】:2017-04-27 16:19:41
【问题描述】:

我正在更新一个直方图,该直方图使用一个简单的整数数组表示,其中包含 16 个 bin,如下所示。

const int binSize = 4096;
int histogram[16];

unsigned short inData[1024];  // This is my input data. Short is 16 bits
for(int i = 0; i < 1024; ++i)
{
   ++histogram[inData[i] / binSize];
}

我非常频繁地运行这个操作,所以这成为了一个瓶颈,因为这个循环没有被 DSP 并行化,因为多个 bin 不能同时更新。我该如何优化它?

我在 TI DSP C6000 系列上运行此代码。

【问题讨论】:

  • 它是C++,我也可以用纯c实现这个
  • 如果你阅读的频率远低于你的写作频率,你可以为每个线程创建一个数组。
  • 有 C,还有 C++。没有 C++ 就没有 C 之类的东西。悬而未决的问题是您是使用 C(.c 文件)还是 C++(.cpp 文件)编写。
  • 那么我所说的就成立了。您可以通过为每个 whatever 设置一个数组来并行写入数组。如果您的写作频率远高于阅读频率,这将有所帮助。
  • @Beginner 不需要“由不同线程创建”

标签: c++ optimization signal-processing


【解决方案1】:

举例说明 cmets 的含义:

#include <array>
#include <algorithm>
#include <boost/range/adaptor/transformed.hpp>
using Histogram = std::array<int, 16>;

Histogram from_short(short num)
{
    Histogram result;
    result[num / 4096] = 1;
    return result;
}

Histogram add(const Histogram & lhs, const Histogram & rhs)
{
    Histogram result;
    for (size_t i = 0; i < 16; ++i) { result[i] = lhs[i] + rhs[i]; }
    return result;
}

auto singles = indata | boost::adaptors::transformed(from_short);
Histogram histogram = std::reduce(begin(singles), end(singles), Histogram{}, add);

另一种选择:

std::sort(begin(indata), end(indata));
short * previous = begin(indata);
for (size_t i = 0; i < 15; ++i)
{
    short * current = std::lower_bound(indata, 4096 * (i + 1));
    histogram[i] = std::distance(previous, current);
    previous = current;
}
histogram[16] = std::distance(previous, end(indata));

【讨论】:

  • @BЈовић 没有。 OP 发现数据依赖性正在阻止他的代码被并行化。第一个解决方案确保数据中没有 read-after-write 依赖
  • 这有点远了.. 排序没有意义,除非你试图让它变慢
  • 这些是计算相同结果的不同算法。 OP 要求优化这个计算,我建议“测量这些,看看它们是否更快”
猜你喜欢
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 2021-02-05
  • 2013-09-13
  • 2015-06-23
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
相关资源
最近更新 更多