2012-01-02 176 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; 
}; 
相關問題