8
votes

Collections de données parallèles dans F #

Laquelle de la liste, du tableau ou de la SEQ est plus efficace pour le traitement parallèle et peut facilement mettre en œuvre des opérations parallèles telles que Parmap code>, Parfilter code>, etc.

Edit: em> Merci pour les suggestions. array.parallall code> ressemble à une bonne option. A également vérifié pseq.fs code> et j'ai une question sur la manière dont le PMAP ci-dessous fonctionne. P> xxx pré>

est un Un nouveau thread s'engage-t-il pour chaque élément de la séquence? Si tel est le cas, existe-t-il une façon de briser la SEQ en morceaux et de créer une nouvelle tâche pour que chaque morceau soit évaluée en parallèle? P>

Je voudrais aussi voir s'il existe un PMAP similaire Mise en œuvre pour la liste. J'ai trouvé Tomas a une implémentation code> parallelliste code> dans son blog post ici . Mais je ne suis pas sûr de convertir une liste en une liste pour effectuer une évaluation parallèle n'engage pas trop de frais généraux et si cela peut être évité? P>

EDIT: strong> Merci pour toutes vos entrées. Tomas a répondu à ma question originale. P>

Répondre à ma propre question dans la première modification: p>

J'ai essayé de casser une grande liste en morceaux puis appliquez ASYNC à chaque subliste. P>

let pmapchunk f xs =
    let chunks = chunk chunksize xs
    seq { for chunk in chunks -> async { return (Seq.map f) chunk } }
    |> Async.Parallel
    |> Async.RunSynchronously
    |> Seq.concat


1 commentaires

Cela dépend, mais vous voulez presque certainement array.parallallal et non async .


3 Réponses :


0
votes

de manière réaliste, la surcharge des types de collecte de commutation est minuscule par rapport au coût de fonctionnement de l'ASYNC, de sorte que le type de collecte n'a pas d'importance.

après avoir dit que, liste a tendance à maillage plus bien avec la syntaxe F # afin qu'il soit le plus gentil


1 commentaires

Liste est le pire type de collection possible pour la programmation parallèle car il est embarrassant séquentiel.



9
votes

Il existe une implémentation parallèle de certaines opérations de réseau dans la bibliothèque F #. En général, travailler avec des tableaux va probablement être le plus efficace si les opérations individuelles prennent beaucoup de temps.

  • Jetez un coup d'œil au module array.parallallal. / code>. Il contient des fonctions pour la création de tableau ( init ), pour effectuer des calculs avec des éléments ( mapper ) et aussi choisir fonction pouvant être utilisée pour implémenter le filtrage .

    Si vous écrivez un pipeline complexe d'opérations qui sont assez simples, mais il y en a un grand nombre d'entre eux, vous devrez utiliser Plinq, qui parallement la ligne de conduite entière par opposition à la paralletic des opérations individuelles ( comme carte).

    • Jetez un coup d'oeil au module PSEQ de F # Powerpack pour une enveloppe conviviale F # - Il définit < Code> PSEQ <'T> Type et les fonctions habituelles pour travailler avec eux. Ce publication du blog contient également quelques informations utiles.

2 commentaires

Merci. J'ai rencontré array.parallallal , pSEQ , ainsi que parallelliste sur votre blog. Les deux derniers ne semblent pas être inclus dans la référence de la bibliothèque, seul Array.ParallelL fait. J'ai édité la question, s'il vous plaît jeter un oeil.


«Travailler avec des tableaux va probablement être le plus efficace si les opérations individuelles prennent beaucoup de temps»? Je m'attendrais à ce que des matrices soient relativement plus rapides lorsque les opérations individuelles sont rapides.



1
votes

Avec la suggestion de Tomas pour regarder array.parallallel , il convient de noter que les tableaux (et les collections sauvegardées de tableau) seront toujours les plus efficaces pour traverser (carte, iter, ... ) parce qu'ils sont stockés dans la mémoire contiguë.


0 commentaires