Arcane permet d'effectuer sur accélérateur les trois types classiques de réduction (Min
, Max
et Somme
). Il existe deux possibilités pour effectuer des réductions :
Réductions via une boucle
Les classes ReducerMax2, ReducerMin2 et ReducerSum2 permettent d'effectuer des réductions sur accélérateurs. Elles s'utilisent à l'intérieur des boucles telles que RUNCOMMAND_LOOP1() ou RUNCOMMAND_ENUMERATE() ou RUNCOMMAND_MAT_ENUMERATE().
Il faut d'abord déclarer un instance d'une des classes de réduction pui la passer en paramètre supplémentaires des boucles. Par exemple :
{
auto command = makeCommand(queue);
Arcane::Accelerator::ReducerMin2<double> minimum_reducer(command);
auto in_my_variable = viewIn(command,my_variable);
{
minimum_reducer.combine(in_my_variable[cid]);
};
info() << "MinValue=" << minimum_reducer.reducedValue();
}
Types et fonctions pour gérer les synchronisations sur les accélérateurs.
Types et macros pour gérer les énumérations des entités sur les accélérateurs.
#define RUNCOMMAND_ENUMERATE(ItemTypeName, iter_name, item_group,...)
Macro pour itérer sur accélérateur sur un groupe d'entités.
File d'exécution pour un accélérateur.
- Avertissement
- Chaque instance ne peut être utilisée qu'une seule fois.
Il est possible d'utiliser plusieurs instances de réduction si on souhaite réaliser plusieurs réductions à la fois. Par exemple:
{
auto command = makeCommand(queue);
Arcane::Accelerator::ReducerMin2<double> minimum_reducer(command);
Arcane::Accelerator::ReducerMax2<double> maximum_reducer(command);
auto in_my_variable = viewIn(command,my_variable);
{
minimum_reducer.combine(in_my_variable[cid]);
maximum_reducer.combine(in_my_variable[cid]);
};
info() << "MinValue=" << minimum_reducer.reducedValue();
info() << "MaxValue=" << maximum_reducer.reducedValue();
}
Réductions directes
La classe GenericReducer permet de lancer une commande spécifique dédiée à la réduction. Une instance de GenericReducer peut être utilisée plusieurs fois.