2012-01-02 8 views
5

Estoy buscando una arquitectura para crear una aplicación en C++ para procesar múltiples entradas al mismo tiempo en diferentes núcleos. Cada entrada se procesa en un solo núcleo simultáneamente. Cada uno de los procesos en un núcleo, los mismos filtros se procesarán a través de. Por ejemplo: filter1.apply(), filter2.apply() y filter3.apply(). Los procesos se ilustran por 4 núcleos para 4 entradas como a continuación:qué arquitectura o patrones de diseño son adecuados para esta aplicación?

 
[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 

I no sabe que la arquitectura o patrón de diseño es adecuado para esto. Sería genial si me das algunos artefactos (documentos o aplicaciones de muestra) para leer más.

Gracias de antemano.

+0

@Joachim: gracias por tu edición. En realidad, lo estaba haciendo mejor también :) – olidev

+0

Como nota al margen, parece que si de alguna manera pudieras compilar la secuencia de filtro en un solo filtro, entonces eso podría ser una ganancia neta, ya que siempre estás haciendo la misma secuencia de cosas, un poco como listas de visualización en OpenGL. –

+0

compilar los filtros en un solo filtro no es bueno porque el alcance (número de líneas) de una función es muy grande. y me gustaría que esta arquitectura en el futuro sea más flexible para agregar nuevos filtros. por ejemplo, se agregan el filtro 4 y el filtro 5, simplemente llamé simplemente: filter1.apply(), filter2.apply(), filter3.apply(), filter4.apply() y filter5.apply(). – olidev

Respuesta

3

Por lo general, se utilizan grupos de subprocesos para implementar dichos diseños. Se escalan prácticamente infinitamente para procesos independientes. Puede encontrar implementaciones sencillas en TBB y PPL. Ofrecen versiones relacionadas con la concurrencia de muchos algoritmos y contenedores estándar. Por ejemplo, en esta muestra he usado concurrent_vector, que es un contenedor similar a vector que puede mutarse con seguridad desde varios hilos simultáneamente, y parallel_for_each, que ejecuta la función en muchos hilos a la vez.

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

Solo para agregar algo, si no sabes a priori cuantas iteraciones o tareas tiene, TBB también ofrece una bonita característica llamada parallel_do que "cocina hasta que esté listo". – inf

+0

¿dónde puedo encontrar TBB? – olidev

+0

No estoy seguro de si uso esto porque la entrada de este filtro es la salida del siguiente filtro. la entrada es una matriz de imágenes pero no es una unión, pueden ser de cualquiera de los tipos: int, float o char. No sé si este es el adecuado. – olidev

0

Creo que "Método de estrategia" es útil. En cada núcleo, pone cada filtro como un objeto a un vector, como:

std::vector<filter> filters; 

entonces

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

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

iteramos por filtro, no ingresamos. Entonces podemos agregar/del filtro en tiempo de ejecución.

como:

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