какая архитектура или шаблоны дизайна подходят для этого приложения? - PullRequest
5 голосов
/ 02 января 2012

Я исследую архитектуру для создания приложения на 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

Я не знаю, какая архитектура или шаблон проектирования подходит для этого.Было бы здорово, если вы дадите мне некоторые артефакты (документы или примеры приложений) для дальнейшего чтения.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 02 января 2012

Обычно для реализации таких проектов используются пулы потоков.Они масштабируются практически бесконечно для независимых процессов.Вы можете найти простые реализации в 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 голосов
/ 02 января 2012

Я думаю, что «Стратегический метод» полезен.В каждом ядре каждый фильтр помещается как объект в вектор, например:

std::vector<filter> filters;

затем

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

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

Итерируем по фильтру, а не по входу.Таким образом, мы можем добавить / del фильтр во время выполнения.

вроде:

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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...