Contenu principal

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

parfeval

Exécuter la fonction sur un worker du pool parallèle

Description

F = parfeval(fcn,numFcnOut,X1,...,Xm) planifie l'exécution de la fonction fcn. MATLAB® exécute la fonction en utilisant un pool parallèle s'il en existe un disponible. Sinon, il exécute la fonction en série.

Vous pouvez partager votre code parallèle qui utilise cette syntaxe avec les utilisateurs MATLAB qui n'ont pas Parallel Computing Toolbox™ .

MATLAB évalue de manière asynchrone la fonction fcn sur chaque worker avec les arguments d'entrée spécifiés X1,…Xm et renvoie numFcnOut arguments de sortie.

MATLAB renvoie l'objet Future F avant que la fonction fcn ne termine son exécution. Vous pouvez utiliser fetchOutputs pour récupérer les résultats du futur. Pour arrêter l'exécution de la fonction fcn, utilisez la fonction cancel. Pour plus d'informations sur les contrats à terme, voir Future .

Si un pool parallèle est ouvert, MATLAB utilise ce pool parallèle pour exécuter la fonction fcn .

Si un pool parallèle n'est pas ouvert, le comportement dépend de l'activation ou non de la création automatique de pool.

  • La création automatique de pool est activée — MATLAB démarre un pool parallèle en utilisant le profil de cluster par défaut, puis utilise ce pool parallèle pour exécuter la fonction fcn. La création automatique de pool est activée par défaut.

    Vous pouvez forcer manuellement ce comportement en spécifiant parpool à l'argument pool pool .

  • La création automatique de pool est désactivée — MATLAB exécute la fonction fcn à l'aide de l'exécution différée.

    Vous pouvez forcer manuellement ce comportement en spécifiant parallel.Pool.empty à l'argument pool pool .

exemple

F = parfeval(pool,fcn,numFcnOut,X1,...,Xm) planifie l'exécution de la fonction fcn en utilisant le pool pool . Utilisez cette syntaxe lorsque vous souhaitez spécifier un pool au moment de l’exécution.

Pour exécuter du code en arrière-plan, consultez la page de fonction MATLAB parfeval .

exemple

Exemples

réduire tout

Utilisez parfeval pour demander l’exécution asynchrone d’une fonction sur un worker.

Soumettez une seule demande au pool parallèle. Récupérez les sorties en utilisant la fonction fetchOutputs.

f = parfeval(@magic,1,10);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to parallel pool with 6 workers.
value = fetchOutputs(f);
value(1)
ans = 92

Spécifiez plusieurs requêtes futures dans une boucle for et collectez les résultats dans un vecteur dès qu'ils sont disponibles. Pour plus d'efficacité, préallouez un tableau d'objets futurs avant de démarrer la boucle.

f(1:10) = parallel.FevalFuture;
for idx = 1:10
    f(idx) = parfeval(@magic,1,idx);
end

Récupérez les sorties futures individuelles dès qu'elles sont disponibles en utilisant fetchNext . Si aucun élément du tableau d'objets FevalFuture n'est disponible lorsque vous appelez fetchNext, MATLAB attend qu'un élément devienne disponible.

magicResults = cell(1,10);
for idx = 1:10
    [completedIdx,value] = fetchNext(f);
    magicResults{completedIdx} = value;
    fprintf("Got result with index: %d.\n",completedIdx)
end
Got result with index: 1.
Got result with index: 2.
Got result with index: 3.
Got result with index: 7.
Got result with index: 8.
Got result with index: 9.
Got result with index: 10.
Got result with index: 4.
Got result with index: 5.
Got result with index: 6.

Démarrez un pool parallèle en utilisant le profil de cluster distant myMJSCluster .

myClusterPool = parpool(myMJSCluster,15);
Starting parallel pool (parpool) using the 'myMJSCluster' profile ...
Connected to parallel pool with 15 workers.

Utilisez parfeval pour calculer la somme des éléments de chaque colonne d'une matrice de 1000 par 1000 sur le pool myClusterPool. Récupérer les résultats.

f = parfeval(myClusterPool,@sum,1,rand(1000));
results = fetchOutputs(f)'
results = 1000×1

  509.8296
  483.2762
  505.1542
  479.3408
  489.2463
  512.2336
  495.8580
  499.5442
  487.5374
  491.4364
      ⋮

Cet exemple montre comment mettre à jour une interface utilisateur lorsque les calculs sont terminés. Lorsque vous déchargez les calculs sur les workers à l'aide de parfeval, toutes les interfaces utilisateur restent réactives pendant que les workers effectuent les calculs. Vous pouvez utiliser waitbar pour créer une interface utilisateur simple.

  • Utilisez afterEach pour mettre à jour l'interface utilisateur une fois chaque calcul terminé.

  • Utilisez afterAll pour mettre à jour l'interface utilisateur une fois tous les calculs terminés.

Utilisez waitbar pour créer un handle de figure, h . Lorsque vous utilisez afterEach ou afterAll, la fonction waitbar met à jour le handle de figure. Pour plus d'informations sur les objets handle, voir Handle Object Behavior .

h = waitbar(0,'Waiting...');

Utilisez parfeval pour calculer la partie réelle des valeurs propres de matrices aléatoires. Avec les préférences par défaut, parfeval crée automatiquement un pool parallèle si aucun n'a déjà été créé. Pour plus d'efficacité, préallouez un tableau d'objets Future.

f(1:100) = parallel.FevalFuture;
for idx = 1:100
    f(idx) = parfeval(@(n) real(eig(randn(n))),1,5e2); 
end

Vous pouvez utiliser afterEach pour appeler automatiquement des fonctions sur chacun des résultats des calculs parfeval. Utilisez afterEach pour planifier un autre ensemble d'objets futurs afin de calculer la plus grande valeur dans chacun des tableaux de sortie après la fin de chaque futur dans f.

maxFuture = afterEach(f,@max,1);

Vous pouvez utiliser la propriété State pour obtenir le statut des contrats à terme. Définissez une fonction anonyme qui met à jour la longueur fractionnaire de la barre d'attente de h à la fraction des objets Future qui ont terminé leur exécution. La fonction anonyme updateWaitbar calcule la moyenne d'un tableau logique dans lequel un élément est true si la propriété State de l'objet Future correspondant dans f est "finished".

updateWaitbar = @(~) waitbar(mean({f.State} == "finished"),h);

Utilisez afterEach et updateWaitbar pour mettre à jour la longueur de la barre d'attente fractionnaire après la fin de chaque futur dans maxFuture. Utilisez afterAll et delete pour fermer la barre d'attente une fois tous les calculs terminés.

updateWaitbarFutures = afterEach(f,updateWaitbar,0);
afterAll(updateWaitbarFutures,@(~) delete(h),0)

Utilisez afterAll et histogram pour afficher un histogramme des résultats dans maxFuture une fois tous les futurs terminés.

showsHistogramFuture = afterAll(maxFuture,@histogram,0);

Arguments d'entrée

réduire tout

Fonction à exécuter sur un worker, spécifiée comme un handle de fonction.

Exemple : fcn = @sum

Types de données : function_handle

Nombre d'arguments de sortie demandés à la fonction fcn, spécifié sous la forme d'un entier non négatif.

numFcnOut est le nombre d'arguments de sortie que vous demandez lorsque vous exécutez fcn(X1,...,Xm) .

Types de données : single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Arguments d'entrée, spécifiés sous la forme d'une liste de variables ou d'expressions séparées par des virgules. Le pool de travail parallèle entre ces arguments dans la fonction fcn.

Pool, spécifié comme un objet parallel.Pool.

  • Pour créer un pool parallèle, utilisez parpool.

  • Pour obtenir le pool d'arrière-plan, utilisez backgroundPool .

Exemple : parpool("Processes");

Exemple : backgroundPool;

Arguments de sortie

réduire tout

Future, renvoyé sous forme d'objet parallel.FevalFuture.

  • Utilisez fetchOutputs ou fetchNext pour récupérer les résultats de F .

  • Utilisez afterEach ou afterAll pour exécuter une fonction lorsque F termine un calcul ou tous les calculs, respectivement.

Capacités étendues

développer tout

Historique des versions

Introduit dans R2013b

développer tout