10
votes

Python MultiProcessing: restreindre le nombre de cœurs utilisés

Je veux savoir comment distribuer n tâches indépendantes à exactement des processeurs sur une machine qui a des noyaux, où l> m. Je ne veux pas utiliser tous les processeurs parce que je veux toujours avoir des E / S disponibles. Les solutions que j'ai essayées semblent être distribuées à tous les processeurs, enlèvent le système.

Je suppose que le module multiprofesseur est le moyen d'aller.

Je fais des simulations numériques. Mon fond est en physique, pas informatique, donc malheureusement, je ne comprends souvent pas complètement les discussions impliquant des modèles de tâches standard tels que serveur / client, producteur / consommateur, etc.

Voici quelques modèles simplifiés que je "VE essayé:

suppose que j'ai une fonction run_sim (** kwargs) (voir aussi ci-dessous) qui exécute une simulation et une longue liste de kwargs pour les simulations, et j'ai une machine à 8 noyau. xxx

lorsque je regarde l'utilisation du processeur avec "haut" puis "1", tous les processeurs semblent être utilisés de toute façon dans les deux cas . Ce n'est pas hors de question que je suis mal interpréte la sortie du "haut", mais si le run_simulation () est un processeur intensive, la machine se tourne fortement.

Simulation hypothétique et données: xxx


2 commentaires

Ceci est évidemment dépendant du système d'exploitation, espérons que c'est Linux :)


Une meilleure solution pourrait être d'exécuter votre processus avec Nice


5 Réponses :


2
votes

Vous voudrez peut-être examiner le package suivant:

http://pypi.python.org/pypi/affinité

C'est un package qui utilise sched_seffinity et programmer _getaffinity.

L'inconvénient est qu'il est hautement spécifique à Linux.


0 commentaires

3
votes

Si vous êtes sous Linux, utilisez le groupe de tâches lorsque vous lancez le programme

Un enfant créé via Fork (2) hérite du masque d'affinité de la CPU de son parent. Le masque d'affinité est préservé à travers un métier (2).

TaskSet (1)
Manuel de l'utilisateur Linux
TaskSet (1)

nom TaskSet - Récupérez ou définissez l'affinité CPU d'un processus

Synopsis TaskSet [Options] Mask Command [Arg] ... TaskSet [Options] -P [Masque] PID

Description TaskSet est utilisé pour définir ou récupérer l'affinité de la CPU d'une exécution processus étant donné son PID ou lancer un Nouveau Commande avec une affinité CPU donnée. L'affinité CPU est un planificateur propriété qui "lie" un processus à un étant donné ensemble de processeurs sur le système. Le planificateur Linux honorera le Étant donné l'affinité de la CPU et le processus Ne fera pas courir sur tout autre processeur. Notez que le planificateur Linux également Soutient l'affinité naturelle de la CPU: le planificateur tente de conserver des processus sur le même processeur aussi long que possible pour raisons de performance. Par conséquent, forçage Une affinité spécifique de la CPU n'est utile que dans certaines applications.

L'affinité de la CPU est représenté comme un masque de bit, avec l'ordre le plus bas bit correspondant au premier logique CPU et le bit de commande le plus élevé correspondant au dernier processeur logique. Tous les processeurs ne peuvent exister pas sur un système donné TEM Mais un masque peut spécifier davantage de processeurs que sont présents. Une récupération masque ne reflèvera que les bits qui Cor- répondre aux processeurs physiquement sur le système. Si un masque invalide est donné (c'est-à-dire celui qui correspond à non CPU valides sur le système actuel) Une erreur est renvoyée. Les Les masques sont généralement donnés dans hexadécimal.


0 commentaires

2
votes

sur ma machine à double noyau Le nombre total de processus est honoré, c'est-à-dire si je fais xxx

alors je ne vois qu'un seul processeur utilisé à un moment donné. Le processus est libre de migrer vers un processeur différent , mais l'autre processeur est inactif. Je ne vois pas comment tous vos processeurs peuvent être utilisés en même temps, je ne suis donc pas suivi de la manière dont cela peut être lié à vos problèmes d'E / S. Bien sûr, si votre simulation est liée à I / O, vous verrez alors des E / S molles, quelle que soit l'utilisation du cœur ...


1 commentaires

On dirait que le sommet montre tout le processeur utilisé, alors je suppose que l'interface utilisateur est lente, plutôt que du goulot d'étranglement d'E / S actuel.



1
votes

Probablement une observation muette, les pls pardonnent mon inexpérience en python.

Mais votre sondage en boucle tandis que pour les tâches finies ne va pas dormir et consommer un noyau de tous les temps, n'est-ce pas?

L'autre chose à noter est que si vos tâches sont liées à I / O, vous devez être ajusté au nombre de disques parallèles (?) Vous avez ... S'ils sont montés NFS dans une machine différente, vous pourriez potentiellement avoir M> l.

g'luck!


0 commentaires

1
votes

Vous pouvez essayer d'utiliser le module Pypar. Je ne sais pas comment utiliser l'affinité pour définir l'affinité de la CPU d'un certain cœur utilisant l'affinité


0 commentaires