【问题标题】:which architecture or design patterns are suitable for this application?哪些架构或设计模式适合此应用程序?
【发布时间】:2012-01-31 20:08:43
【问题描述】:

我正在研究一种用于在 C++ 中创建应用程序以在不同内核中同时处理多个输入的架构。每个输入同时在一个内核中处理。每个进程放在一个核心上,相同的过滤器都会被处理通过。例如:filter1.apply()、filter2.apply() 和 filter3.apply()。 4 核 4 输入的流程如下所示:

[核心 1] [核心 2] [核心 3] [核心 4] | | | | V V V V 输入1 输入2 输入3 输入4 | | | | V V V V 过滤器1 过滤器1 过滤器1 过滤器1 | | | | V V V V 过滤器2 过滤器2 过滤器2 过滤器2 | | | | V V V V 过滤器3 过滤器3 过滤器3 过滤器3 | | | | V V V V 输出1 输出2 输出3 输出4

我不知道哪种架构或设计模式适合这个。如果您能给我一些工件(文档或示例应用程序)以供进一步阅读,那就太好了。

提前致谢。

【问题讨论】:

  • @Joachim:感谢您的编辑。实际上,我也做得更好:)
  • 顺便说一句,看起来如果您可以以某种方式将过滤器序列编译为单个过滤器,那么这可能是一个净赢,因为您总是在做同样的事情 - 一个有点像 OpenGL 中的显示列表。
  • 在单个过滤器中编译过滤器并不好,因为函数的范围(行数)非常大。我希望这种架构在未来能够更灵活地添加新的过滤器。例如:添加过滤器 4 和过滤器 5,然后我只是简单地调用:filter1.apply()、filter2.apply()、filter3.apply()、filter4.apply() 和 filter5.apply()。
  • 很公平 - 通常需要在性能/灵活性之间进行权衡。
  • 如果过滤器非常特殊,DSL 可能会有所帮助。这样您还可以在编译时优化过滤器表达式。

标签: c++ multithreading architecture


【解决方案1】:

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

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;
};

【讨论】:

    【解决方案2】:

    通常使用线程池来实现这样的设计。对于独立的流程,它们几乎可以无限扩展。您可以在 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 的不错的功能,它可以“烹饪直到完成”。
    • 我不确定我是否使用它,因为这个过滤器的输入是下一个过滤器的输出。输入是一个图像数组,但它不是联合,它们可以是任何一种类型:int、float 或 char。不知道这个合适不?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多