2009-09-18 10 views
1

J'ai écrit un programme C qui lit un jeu de données à partir d'un fichier, puis applique un algorithme d'exploration de données pour trouver les clusters et les classes dans les données. En ce moment j'essaye de réécrire ce programme séquentiel multithreaded avec PThreads et je suis débutant à une programmation parallèle et j'ai une question au sujet du nombre de fils de travail qui a lutté mon esprit:Comment déterminer le nombre optimal de threads de travail

Quelle est la meilleure pratique pour trouver le nombre de threads de travail lorsque vous faites une programmation parallèle et comment le déterminez-vous? Essayez-vous un nombre différent de threads et voir ses résultats puis déterminez ou existe-t-il une procédure pour trouver le nombre optimal de threads. Bien sûr, j'étudie cette question du point de vue de la performance.

Répondre

2

Il y a quelques problèmes ici. Comme le dit Alex, le nombre de threads que vous pouvez utiliser est spécifique à l'application, comme l'indique Alex. Mais il y a aussi des contraintes qui viennent du type du problème que vous essayez de résoudre. Est-ce que vos discussions doivent communiquer entre elles ou peuvent-elles fonctionner isolément sur des parties du problème? S'ils ont besoin d'échanger des données, il y aura un nombre maximum de threads au-delà desquels la communication inter-thread dominera, et vous ne verrez plus d'accélération (en fait, le code deviendra plus lent!). Si elles n'ont pas besoin d'échanger des données, les threads égaux au nombre de processeurs seront probablement proches de l'optimum.

  • L'ajustement dynamique du pool de threads à l'architecture sous-jacente pour accélérer la vitesse d'exécution n'est pas une tâche facile! Vous auriez besoin de beaucoup de code supplémentaire pour faire le profilage à l'exécution de vos fonctions. Voir par exemple la façon dont FFTW fonctionne en parallèle. C'est certainement possible, mais il est assez avancé et sera difficile si vous êtes nouveau dans la programmation parallèle. Si, au contraire, le nombre de cœurs estimé est suffisant, alors essayer de déterminer ce nombre à partir du système d'exploitation à l'exécution et générer vos threads en conséquence sera un travail beaucoup plus facile. Pour répondre à votre question sur la technique: La plupart des grands codes parallèles fonctionnent sur des superordinateurs avec une architecture connue et prennent beaucoup de temps à fonctionner. Le meilleur nombre de processeurs n'est pas seulement une fonction du nombre, mais aussi de la topologie de communication (comment les processeurs sont liés). Ils bénéficient donc d'une phase de test où le meilleur nombre de processeurs est déterminé en mesurant le temps pris sur de petits problèmes. Ceci est normalement fait à la main. Si possible, le profilage devrait toujours être préféré aux devinettes basées sur des considérations théoriques.

  • +0

    Je ne prévoyais pas d'exécuter mon code sur HPC ou Grid. Donc, dans mon cas, je prévois d'utiliser OpenMP et PThreads. Donc, mes considérations sont uniquement les SMP. Je vois que ce n'est pas une tâche facile et l'approche actuelle que je suis en train de faire est d'estimer et de permettre à l'utilisateur de le modifier à partir du fichier de configuration si nécessaire. Mais cela ne m'a pas satisfait, alors je me suis demandé s'il existait une meilleure technique existante. – systemsfault

    2

    Vous voulez essentiellement avoir autant de threads prêts à l'emploi que vous avez de cœurs disponibles, ou au plus 1 ou 2 de plus pour vous assurer qu'aucun noyau disponible ne soit laissé inactif. L'astuce consiste à estimer combien de threads seront généralement bloqués en attente d'autre chose (principalement des E/S), car cela dépend totalement de votre application et même d'entités externes indépendantes de votre volonté (bases de données, autres services distribués, etc.) . En fin de compte, une fois que vous avez déterminé combien de threads devraient être optimaux, l'utilisation de benchmarks pour les tailles de pools de threads autour de votre valeur estimée, comme vous le suggérez, est une bonne pratique (à tout le moins vos hypothèses), surtout si, comme il apparaît, vous avez besoin d'obtenir la dernière baisse de performance de votre système!

    +0

    Merci Alex, mais le nombre estimé de threads sera dépendant de la machine dans ce cas n'est-ce pas. J'essaie de trouver un moyen portable. Mais en fait ce que j'essaie de trouver est une sorte de formulation (s'il existe). Après avoir lu votre commentaire, j'ai trouvé le document suivant mais je ne l'ai pas encore lu: http://portal.acm.org/ citation.cfm? id = 346152.346320 – systemsfault

    +0

    Comment le nombre optimal de threads peut-il être le même sur, disons, une machine avec 2 cœurs utilisables, et une avec 8? Bien sûr, cela dépendra de la machine; toute «formulation» qui fait apparaître les choses autrement va juste être ** mauvaise **! -). L'article que vous citez prend en compte les caractéristiques de performances du système et estime les charges de travail en fonction de l'analyse des journaux de serveur (uniquement pour les services Web ou d'autres services réseau, mais c'est ce que l'article traite). –

    Questions connexes