Arcane  v4.1.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
RunCommandLaunch.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* RunCommandLaunch.cc (C) 2000-2025 */
9/* */
10/* RunCommand pour le parallélisme hiérarchique. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
16/*---------------------------------------------------------------------------*/
17/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28namespace
29{
30 void _setGroupSize(Accelerator::RunCommand& command, Int32 group_size)
31 {
32 if ((group_size % 32) != 0)
33 ARCANE_FATAL("group_size '{0}' is not a multiple of 32", group_size);
34 // TODO: vérifier que la valeur ne sera pas surchargée par la suite.
35 command.addNbThreadPerBlock(group_size);
36 }
37} // namespace
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
43makeWorkGroupLoopRange(RunCommand& command, Int32 nb_group, Int32 group_size)
44{
45 Int32 total_size = nb_group * group_size;
46 _setGroupSize(command, group_size);
47 return WorkGroupLoopRange(total_size, nb_group, group_size);
48}
49
50/*---------------------------------------------------------------------------*/
51/*---------------------------------------------------------------------------*/
52
55makeWorkGroupLoopRange(RunCommand& command, Int32 nb_element, Int32 nb_group, Int32 group_size)
56{
57 // Calcule automatiquement la taille d'un groupe si l'argument vaut '0'.
58 if (group_size == 0) {
59 if (nb_group != 0)
60 ARCANE_FATAL("Value of argument 'nb_group' has to be '0' if 'group_size' is '0'");
61 // TODO: pour l'instant on met 256 par défaut mais il faudrait peut-être
62 // mettre une valeur plus grande sur CPU.
63 group_size = 256;
64 nb_group = nb_element / group_size;
65 }
66 if ((nb_element % group_size) != 0)
67 ++nb_group;
68
69 _setGroupSize(command, group_size);
70 return WorkGroupLoopRange(nb_element, nb_group, group_size);
71}
72
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
75
76} // namespace Arcane
77
78/*---------------------------------------------------------------------------*/
79/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Types et macros pour gérer le parallélisme hiérarchique sur les accélérateurs.
Gestion d'une commande sur accélérateur.
Intervalle d'itération d'une boucle utilisant le parallélisme hiérarchique.
WorkGroupLoopRange makeWorkGroupLoopRange(RunCommand &command, Int32 nb_group, Int32 group_size)
Créé un intervalle d'itération pour la commande command.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int32_t Int32
Type entier signé sur 32 bits.