6
votes

Bibliothèque C ++ pour renforcer le pipeline d'exécution

J'ai recherché une bibliothèque de pipeline d'exécution réutilisable en C ++ (bibliothèque de planificateur de travail?). Je n'ai rien trouvé dans Boost . Donc, j'ai finalement découvert deux candidats:

  • Google-Concurrency-bibliothèque li>
  • libpipeline li> ul>

    est-ce que je manque d'autres candidats? Quelqu'un a-t-il utilisé? Dans quelle mesure sont-ils bien en ce qui concerne l'IO parallèle et la multithreading? Ces bibliothèques semblent toujours manquer à la manipulation des dépendances. Par exemple, il ne semble pas clair pour moi comment on écrirait quelque chose comme: p> xxx pré>

    Dans ce cas très simple, le pipeline est marqué sur le haut et le premier chat code> arrête d'exécuter quand tête code> processus arrête de tirer. p>

    Cependant, je ne vois pas comment je peux bénéficier de multi-threading et ou parallèle io dans le cas de: P>

    $ cat /raid1/file1 /raid2/file2 | tr P Q > /tmp/file3
    


2 commentaires

Je pense que vous confondez quelque chose: les pipelines ne signifient pas automatiquement que les étapes individuelles dans le pipeline sont parlécules (comme votre exemple montre), cela signifie simplement que toutes les étapes (ou certaines) peuvent être exécutées. en parallèle et de sondage / poussez des données entre elles.


J'explore Google Concurrency Lib plus loin. Il était juste proposé de faire partie de la norme C ++. Plus d'informations ici Open-std.org/ JTC1 / SC22 / WG21 / DOCS / Documents / 2013 / ...


3 Réponses :


3
votes

Que cherchez-vous est un cadre Dataflow . Pipeline est une forme spécialisée de Dataflow, où tous les composants ont 1 consommateur et 1 producteur.

Boost prend en charge Dataflow, mais malheureux, je ne suis pas familier avec Boost. Voici le lien: http://dancershacker.com/code/dataflow/dataflow/introduction /dataflow.html

Quoi qu'il en soit, vous devez écrire vos composants comme des programmes distincts et utiliser des tuyaux UNIX. Surtout, si votre caractéristique de données est (ou peut être facilement transformée en lignes / texte.

Une option est également d'écrire votre propre chose de Dataflow. Ce n'est pas trop difficile, surtout, lorsque vous avez des restrictions (je veux dire pipe: 1-consommateur / 1 producteur), vous ne devez pas mettre en œuvre un cadre complet de Dataflow. La tuyauterie est à peu près liée à une sorte de fonctions ensemble, en passant son résultat dans son prochain argument. Un cadre Dataflow concerne une interface / modèle de composant et une technique de liaison. (C'est amusant, j'ai écrit un.)


2 commentaires

Boost :: Dataflow est une proposition qui n'a pas été acceptée à Boost.


Liaison cassée: web .Rarchive.org / Web / 20160605053459 / http: //dancershacker.com/ ...



2
votes

Je donnerais des blocs de construction en filetage http://threadingbuildingblocks.org/ a essayez. C'est une source ouverte et une plateforme croisée. L'article Wikipedia est plutôt bon: http://fr.wikipedia.org/wiki/intel_threading_building_blocks < / p>


0 commentaires

2
votes

Je viens de lire aujourd'hui sur raftlib , qui utilise des modèles et des classes pour créer des éléments de pipeline appelés "noyaux". Il permet un pipeline série tel que l'exemple Bash que vous avez montré, en plus des données de données parallèles. De Exemple World Hello sur la page d'accueil:

#include <raft>
#include <raftio>
#include <cstdlib>
#include <string>

class hi : public raft::kernel
{
public:
    hi() : raft::kernel()
    {
       output.addPort< std::string >( "0" ); 
    }

    virtual raft::kstatus run()
    {
        output[ "0" ].push( std::string( "Hello World\n" ) );
        return( raft::stop ); 
    }
};


int
main( int argc, char **argv )
{
    /** instantiate print kernel **/
    raft::print< std::string > p;
    /** instantiate hello world kernel **/
    hi hello;
    /** make a map object **/
    raft::map m;
    /** add kernels to map, both hello and p are executed concurrently **/
    m += hello >> p;
    /** execute the map **/
    m.exe();
    return( EXIT_SUCCESS );
}


0 commentaires