Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ThreadBindingMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ThreadBindingMng.cc (C) 2000-2021 */
9/* */
10/* Gestionnaire pour punaiser les threads. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/impl/internal/ThreadBindingMng.h"
15
16#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/PlatformUtils.h"
19#include "arcane/utils/IProcessorAffinityService.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30void ThreadBindingMng::
31initialize(ITraceMng* tm,const String& strategy)
32{
33 m_trace_mng = tm;
34 m_bind_strategy = strategy;
35 // Si la strategie n'est pas nulle, s'attache à l'observable du TaskFactory
36 // pour être notifié de la création du thread.
37 if (!m_bind_strategy.null()){
38 if (m_bind_strategy!="Simple")
39 ARCANE_FATAL("Invalid strategy '{0}'. Valid values are : 'Simple'",m_bind_strategy);
40 m_max_thread = TaskFactory::nbAllowedThread();
41 if (tm)
42 tm->info() << "Thread binding strategy is '" << m_bind_strategy << "'";
43 m_observer_pool.addObserver(this,&ThreadBindingMng::_createThreadCallback,
45 }
46}
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50
51void ThreadBindingMng::
52_createThreadCallback()
53{
54 // TODO: ne pas dépasser le nombre max de threads alloués, sinon afficher un
55 // message d'avertissement
56 ITraceMng* tm = m_trace_mng;
57 Int32 thread_index = m_current_thread_index;
58 ++m_current_thread_index;
59
60 IProcessorAffinityService* pas = platform::getProcessorAffinityService();
61 if (!pas){
62 if (tm)
63 tm->info() << "WARNING: Can not bind thread because there is no 'IProcessorAffinityService'";
64 return;
65 }
66
67 if (tm){
68 if (thread_index<m_max_thread){
69 pas->bindThread(thread_index);
70 tm->info() << "Binding thread index=" << thread_index << " cpuset=" << pas->cpuSetString();
71 }
72 else
73 tm->info() << "WARNING: thread index is greater than maximum number of allowed thread. No binding done";
74 }
75}
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
80} // End namespace Arcane
81
82/*---------------------------------------------------------------------------*/
83/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classes, Types et macros pour gérer la concurrence.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
void addObserver(T *obj, void(T::*func)(const IObservable &), IObservable *oba)
Ajoute un observateur.
static Int32 nbAllowedThread()
Nombre de threads utilisés au maximum pour gérer les tâches.
static IObservable * createThreadObservable()
Observable appelé lors de la création d'un thread pour une tâche.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
TraceMessage info() const
Flot pour un message d'information.
IProcessorAffinityService * getProcessorAffinityService()
Service utilisé pour la gestion de l'affinité des processeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-