2012-01-02 11 views
5

私は、異なるコアで複数の入力を同時に処理するために、C++でアプリケーションを作成するためのアーキテクチャを研究しています。各入力は同時に1つのコアで処理されます。コア上の各プロセスは、同じフィルタが処理されます。例: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 

このアーキテクチャに適しているかどうかはわかりません。あなたが私にいくつかのアーティファクト(ドキュメントやサンプルアプリケーション)を与えて、さらに読むことができれば、素晴らしいことでしょう。

ありがとうございます。

+0

@Joachim:エディションに感謝。実際には、私もそれを良くしていました:) – olidev

+0

ちょうど副次的なものとして、あなたが何とか1つのフィルターにフィルターシーケンスをコンパイルできたら、それは同じシーケンスをいつもやっているからです物事 - OpenGLの表示リストのようなビット。 –

+0

フィルタを1つのフィルタでコンパイルするのは、関数のスコープ(行数)が非常に大きいためにうまくいきません。将来このアーキテクチャで新しいフィルタを追加する柔軟性を持たせたいと考えています。たとえば、フィルタ4とフィルタ5が追加された場合、filter1.apply()、filter2.apply()、filter3.apply()、filter4.apply()、filter5.apply()という名前を呼び出しただけです。 – olidev

答えて

3

通常、スレッドプールはこのような設計を実装するために使用されます。彼らは独立したプロセスのために事実上無限に拡張できます。簡単な実装はTBBとPPLで見つけることができます。これらは、多くの標準アルゴリズムとコンテナの並行性に関連するバージョンを提供します。たとえば、このサンプルでは、​​複数のスレッドから同時に安全に変更できるvectorのようなコンテナであるconcurrent_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

+0

TBBはどこにありますか? – olidev

+0

このフィルタの入力が次のフィルタの出力であるため、これを使用するかどうかはわかりません。入力はイメージ配列ですが、共用体ではありません。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; 
}; 
関連する問題