2012-01-02 111 views
5

我正在研究用于在C++中创建应用程序以在不同内核中同时处理多个输入的体系结构。每个输入同时在一个内核中处理。核心上的每个进程都将通过相同的过滤器进行处理。例如:filter1.apply(),filter2.apply()和filter3.apply()。下面是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 

我不知道哪种架构或设计模式适合于此。如果您给我一些文物(文档或示例应用程序)以进一步阅读,那将是非常棒的。

在此先感谢。

+0

@Joachim:感谢您的刊物。实际上,我也做得更好:) – olidev 2012-01-02 13:11:16

+0

正如一个侧面说明,它看起来像是如果你能以某种方式将过滤器序列编译成单个过滤器,那么这可能是一个净赢,因为你总是在做同样的顺序的东西 - 有点像OpenGL中的显示列表。 – 2012-01-02 13:15:14

+0

在单个过滤器中编译过滤器并不好,因为函数的作用域(行数)非常大。我希望这种架构在未来能够更灵活地添加新的过滤器。例如:过滤器4和过滤器5添加,然后我只是简单地调用:filter1.apply(),filter2.apply(),filter3.apply(),filter4.apply()和filter5.apply()。 – olidev 2012-01-02 13:18:09

回答

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)))); 
}); 
+0

只需添加一些东西,如果您不知道您有多少次迭代或任务,TBB还提供了一个称为parallel_do的功能,它可以“煮到做完”。 – inf 2012-01-02 13:31:14

+0

我在哪里可以找到TBB? – olidev 2012-01-02 18:50:20

+0

我不确定是否使用这个,因为这个过滤器的输入是下一个过滤器的输出。输入是一个图像数组,但它不是联合,它们可以是以下类型之一:int,float或char。我不知道这个是否合适? – olidev 2012-01-02 23:53:18

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