哪种架构或设计模式适合这个应用程序?

5
我正在研究如何用C++创建一个架构来同时在不同的核心上处理多个输入。每个输入都是在单个核心上同时进行处理。在每个核心上处理的所有进程中,相同的滤波器都将被处理。例如:filter1.apply()、filter2.apply()和filter3.apply()。以下是4个输入在4个核心上的过程示意图:
[core 1] [core 2] [core 3] [core 4] | | | | V V V V input1 input2 input3 input4 | | | | V V V V filter1 filter1 filter1 filter1 | | | | V V V V filter2 filter2 filter2 filter2 | | | | V V V V filter3 filter3 filter3 filter3 | | | | V V V V output1 output2 output3 output4
我不知道哪种架构或设计模式适合这种情况。如果您能提供一些文档或示例应用程序供我参考,那就太好了。谢谢!

@Joachim:感谢您的编辑。实际上,我也在改进它 :) - olidev
编译单个过滤器不好,因为函数的范围(行数)非常大。我希望未来的架构更加灵活,可以添加新的过滤器。例如:如果添加了第四个和第五个过滤器,则只需调用:filter1.apply(),filter2.apply(),filter3.apply(),filter4.apply()和filter5.apply()。 - olidev
好的,这通常存在着性能/灵活性的权衡。 - Stuart Golodetz
如果过滤器非常专用,DSL可能会有所帮助。这样你也可以在编译时优化过滤器表达式。 - pmr
这些过滤器 - 它们是一次性在完整的输入缓冲区上操作并将完整的输出传递给下一个过滤器,还是存在连续的缓冲区流?原始输入来自哪里 - 文件、视频输入、网络...等等? - Martin James
显示剩余2条评论
2个回答

3

通常线程池被用于实现这样的设计。对于独立进程,它们可以无限扩展。您可以在TBB和PPL中找到易于实现的版本。它们提供了许多标准算法和容器的并发相关版本。例如,在此示例中,我使用了concurrent_vector,这是一个类似于vector的容器,可以安全地从多个线程同时进行修改,并且使用了parallel_for_each,它可以在许多线程上同时运行函数。

concurrent_vector<output> outputs;
std::vector<input> inputs;
parallel_for_each(inputs.begin(), inputs.end(), [](input& input) {
    outputs.push_back(filter3(filter2(filter1(input))));
});

只是补充一点,如果您事先不知道有多少次迭代或任务,TBB还提供了一个很好的功能,称为parallel_do,可以“烹饪至完成”。 - Stephan Dollberg
我不确定是否使用它,因为该过滤器的输入是下一个过滤器的输出。输入是图像数组,但它们不是联合的,可以是int、float或char类型中的任何一种。我不知道这个是否适合? - olidev

0

我认为“策略模式”很有帮助。 在每个核心中,将每个过滤器作为对象放入向量中,例如:

std::vector<filter> filters;

然后

std::for_each(filters.begin(), filters.end(), [input&](f&){f.apply(input);});

====================

我们通过过滤器进行迭代,而不是输入。因此,我们可以在运行时添加/删除过滤器。

例如:

class YourCore {
public:
    void add_filter(const filter& f) {m_filters.add(f);}
    // void del_filter(int index);
    // void del_filter(by name or UID, so change vector to map or unordered_map);
private:
    std::vector<filter> m_filters;
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接