Arcane  v4.1.1.0
Documentation utilisateur
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/*---------------------------------------------------------------------------*/
18/*!
19 * \file RunCommandLaunch.h
20 *
21 * \brief Types et macros pour gérer le parallélisme hiérarchique sur les accélérateurs.
22 */
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 ARCCORE_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
53//! Créé un intervalle d'itération pour la commande \a command pour \a nb_element
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 ARCCORE_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/*---------------------------------------------------------------------------*/
Types et macros pour gérer le parallélisme hiérarchique sur les accélérateurs.
Intervalle d'itération d'une boucle utilisant le parallélisme hiérarchique.
ARCCORE_ACCELERATOR_EXPORT 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.