Contenu principal

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

spmd

Exécuter le code en parallèle sur les workers du pool parallèle

Syntaxe

spmd
    statements
end

Description

spmd, statements, end définit une instruction spmd sur une seule ligne. MATLAB® exécute le corps spmd désigné par statements sur plusieurs MATLAB workers simultanément. Chaque worker peut travailler sur un ensemble de données différent ou sur une partie différente de données distribuées, et peut communiquer avec d’autres workers participants tout en effectuant les calculs parallèles. L'instruction spmd ne peut être utilisée que si vous avez Parallel Computing Toolbox™ . Pour exécuter les instructions en parallèle, vous devez d'abord créer un pool de MATLAB workers en utilisant parpool ou faire en sorte que vos préférences parallèles autorisent le démarrage automatique d'un pool.

Dans le corps de l'instruction spmd, chaque MATLAB a une valeur unique de spmdIndex, tandis que spmdSize désigne le nombre total de workers exécutant le bloc en parallèle. Dans le corps de l'instruction spmd, les fonctions de communication pour la communication des jobs (telles que spmdSend et spmdReceive) peuvent transférer des données entre les workers.

Les valeurs renvoyées depuis le corps d'une instruction spmd sont converties en objets Composite sur le client MATLAB. Un objet composite contient des références aux valeurs stockées sur les workers MATLAB distants, et ces valeurs peuvent être récupérées à l'aide de l'indexation de tableau de cellules. Les données réelles sur les workers restent disponibles pour une exécution spmd ultérieure, tant que le composite existe sur le client et que le pool parallèle reste ouvert.

Par défaut, MATLAB utilise tous les workers du pool. Lorsqu'il n'y a pas de pool actif, MATLAB créera un pool et utilisera tous les workers de ce pool. Si vos préférences ne permettent pas la création automatique de pool, MATLAB exécute le corps du bloc localement et crée des objets composites si nécessaire. Vous ne pouvez pas exécuter un bloc spmd si un worker est occupé à exécuter une requête parfeval, sauf si vous utilisez spmd(0).

Pour plus d'informations sur spmd et les objets composites, voir Distribute Arrays and Run SPMD .

Note

Utilisez parfevalOnAll au lieu de parfor ou spmd si vous souhaitez utiliser clear. Cela préserve la transparence de l’espace de travail. Voir Ensure Transparency in parfor-Loops or spmd Statements .

exemple

spmd(n), statements, end utilise n pour spécifier le nombre exact de MATLAB workers à évaluer statements, à condition que n workers soient disponibles dans le pool parallèle. S'il n'y a pas assez de workers disponibles, une erreur est générée. Si n est nul, MATLAB exécute le corps du bloc localement et crée des objets composites, comme s'il n'y avait pas de pool disponible.

exemple

spmd(m,n), statements, end utilise un minimum de m et un maximum de n workers pour évaluer statements. S'il n'y a pas assez de workers disponibles, une erreur est générée. m peut être nul, ce qui permet au bloc de s'exécuter localement si aucun worker n'est disponible.

exemple

Exemples

réduire tout

Créez un pool parallèle et effectuez un calcul simple en parallèle à l'aide de spmd . MATLAB exécute le code à l'intérieur de spmd sur tous les workers du pool parallèle.

parpool(3);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 3).
spmd
  q = magic(spmdIndex + 2);
end

Tracez les résultats.

figure
subplot(1,3,1), imagesc(q{1});
subplot(1,3,2), imagesc(q{2});
subplot(1,3,3), imagesc(q{3});

Une fois les calculs terminés, vous pouvez supprimer le pool parallèle actuel.

delete(gcp);

Si vous avez accès à plusieurs GPU, vous pouvez effectuer vos calculs sur plusieurs GPU en parallèle à l'aide d'un pool parallèle.

Pour déterminer le nombre de GPU disponibles pour une utilisation dans MATLAB, utilisez la fonction gpuDeviceCount.

availableGPUs = gpuDeviceCount("available")
availableGPUs = 3

Démarrez un pool parallèle avec autant de workers que de GPU disponibles. Pour de meilleures performances, MATLAB attribue par défaut un GPU différent à chaque worker.

parpool("Processes",availableGPUs);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 3).

Pour identifier quel GPU chaque worker utilise, appelez gpuDevice à l'intérieur d'un bloc spmd. Le bloc spmd exécute gpuDevice sur chaque worker.

spmd
    gpuDevice
end

Utilisez des fonctionnalités de langage parallèle, telles que parfor ou parfeval, pour distribuer vos calculs aux workers du pool parallèle. Si vous utilisez des fonctions activées gpuArray dans vos calculs, ces fonctions s'exécutent sur le GPU du worker. Pour plus d'informations, voir Exécuter les fonctions MATLAB sur un GPU. Pour un exemple, voir Run MATLAB Functions on Multiple GPUs .

Lorsque vous avez terminé vos calculs, fermez le pool parallèle. Vous pouvez utiliser la fonction gcp pour obtenir le pool parallèle actuel.

delete(gcp("nocreate"));

Si vous souhaitez utiliser un choix différent de GPU, vous pouvez utiliser gpuDevice pour sélectionner un GPU particulier sur chaque worker, en utilisant l'index du GPU. Vous pouvez obtenir l'index de chaque dispositif GPU de votre système en utilisant la fonction gpuDeviceCount.

Supposons que vous ayez trois GPU disponibles dans votre système, mais que vous souhaitiez n'en utiliser que deux pour un calcul. Obtenir les indices des dispositifs.

[availableGPUs,gpuIndx] = gpuDeviceCount("available")
availableGPUs = 3
gpuIndx = 1×3

     1     2     3

Définissez les indices des appareils que vous souhaitez utiliser.

useGPUs = [1 3];

Démarrez votre pool parallèle. Utilisez un bloc spmd et gpuDevice pour associer chaque worker à l’un des GPU que vous souhaitez utiliser, à l’aide de l’index du périphérique. La fonction spmdIndex identifie l'index de chaque worker.

parpool("Processes",numel(useGPUs));
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 2).
spmd
    gpuDevice(useGPUs(spmdIndex));
end

En tant que bonne pratique et pour de meilleures performances, attribuez un GPU différent à chaque worker.

Lorsque vous avez terminé vos calculs, fermez le pool parallèle.

delete(gcp("nocreate"));

Conseils

  • Un bloc spmd s'exécute sur les workers du pool parallèle existant. Si aucun pool n'existe, spmd démarrera un nouveau pool parallèle, sauf si le démarrage automatique des pools est désactivé dans vos préférences parallèles. S'il n'y a pas de pool parallèle et que spmd ne peut pas en démarrer un, le code s'exécute en série dans la session client.

  • Si la propriété AutoAttachFiles dans le profil de cluster pour le pool parallèle est définie sur true, MATLAB effectue une analyse sur un bloc spmd pour déterminer quels fichiers de code sont nécessaires à son exécution, puis attache automatiquement ces fichiers au job du pool parallèle afin que le code soit disponible pour les workers.

  • Pour plus d'informations sur les restrictions et limitations lors de l'utilisation de spmd, voir Run Single Programs on Multiple Data Sets .

  • Pour plus d'informations sur les performances de spmd et d'autres constructions de programmation parallèle, voir Choose Between spmd, parfor, and parfeval .

Capacités étendues

développer tout

Historique des versions

Introduit dans R2008b