Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
TestReduce.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#include <gtest/gtest.h>
9
10#include "arcane/accelerator/core/Runner.h"
11#include "arcane/accelerator/core/RunQueue.h"
14
15/*---------------------------------------------------------------------------*/
16/*---------------------------------------------------------------------------*/
17
18extern "C++" void arcaneRegisterDefaultAcceleratorRuntime();
19extern "C++" Arcane::Accelerator::eExecutionPolicy arcaneGetDefaultExecutionPolicy();
20
21using namespace Arcane;
22using namespace Arcane::Accelerator;
23
24namespace
25{
26void _doInit()
27{
28 arcaneRegisterDefaultAcceleratorRuntime();
29}
30Arcane::Accelerator::eExecutionPolicy _defaultExecutionPolicy()
31{
32 return arcaneGetDefaultExecutionPolicy();
33}
34} // namespace
35
36void _doReduce1()
37{
38 std::cout << "DO_REDUCE_1\n";
39 Runner runner(_defaultExecutionPolicy());
40 RunQueue queue(makeQueue(runner));
41 {
42 RunCommand command(makeCommand(queue));
43 Int32 nb_iter = 96;
44 ReducerSum2<Int64> reducer_sum(command);
45 command << RUNCOMMAND_LOOP1(iter, nb_iter, reducer_sum)
46 {
47 auto [i] = iter();
48 reducer_sum.combine(i + 1);
49 };
50 Int64 computed_sum = reducer_sum.reducedValue();
51 std::cout << "NB_ITER=" << nb_iter << "\n";
52 std::cout << "VALUE sum=" << computed_sum
53 << "\n";
54 Int64 expected_sum = (nb_iter * (nb_iter + 1)) / 2;
55 std::cout << "VALUE sum=" << computed_sum
56 << " expected=" << expected_sum
57 << "\n";
58 ASSERT_EQ(computed_sum, expected_sum);
59 }
60}
61
62void _doReduce2()
63{
64 std::cout << "DO_REDUCE_2\n";
65 Runner runner(_defaultExecutionPolicy());
66 RunQueue queue(makeQueue(runner));
67 {
68 RunCommand command(makeCommand(queue));
69 Int32 nb_iter = 4356;
70 ReducerSum2<Int64> reducer_sum(command);
71 ReducerMax2<Int64> reducer_max(command);
72 ReducerMin2<Int64> reducer_min(command);
73 command << ::Arcane::Accelerator::impl::makeExtendedArrayBoundLoop(Arcane::ArrayBounds<MDDim1>(nb_iter),
74 reducer_sum, reducer_max, reducer_min)
75 << [=] ARCCORE_HOST_DEVICE(Arcane::ArrayIndex<1> iter, ReducerSum2<Int64> & reducer_sum, ReducerMax2<Int64> & reducer_max,
76 ReducerMin2<Int64> & reducer_min) {
77 auto [i] = iter();
78 reducer_sum.combine(i + 1);
79 reducer_min.combine(i + 5);
80 reducer_max.combine(i - 5);
81 };
82 Int64 computed_sum = reducer_sum.reducedValue();
83 Int64 computed_min = reducer_min.reducedValue();
84 Int64 computed_max = reducer_max.reducedValue();
85 std::cout << "VALUE sum=" << computed_sum
86 << " min=" << computed_min
87 << " max=" << computed_max
88 << "\n";
89
90 Int64 expected_sum = (nb_iter * (nb_iter + 1)) / 2;
91
92 std::cout << "VALUE sum=" << computed_sum
93 << " expected=" << expected_sum
94 << "\n";
95 std::cout << "MIN/MAX VALUE min=" << computed_min
96 << " max=" << computed_max
97 << "\n";
98
99 ASSERT_EQ(computed_sum, expected_sum);
100 ASSERT_EQ(computed_min, 5);
101 ASSERT_EQ(computed_max, (nb_iter - 6));
102 }
103}
104
105TEST(ArcaneAccelerator, Reduce)
106{
107 _doInit();
108
109 bool is_copyable = std::is_trivially_copyable_v<ReducerSum2<Int64>>;
110 std::cout << "IS_REDUCE_COPYABLE=" << is_copyable << "\n";
111 //ASSERT_TRUE(is_copyable);
112
113 _doReduce1();
114 _doReduce2();
115}
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
Types et fonctions pour gérer les synchronisations sur les accélérateurs.
Types et macros pour gérer les boucles sur les accélérateurs.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle sur accélérateur avec arguments supplémentaires pour les réductions.
Classe pour effectuer une réduction 'max'.
Definition Reduce.h:775
Classe pour effectuer une réduction 'min'.
Definition Reduce.h:801
Classe pour effectuer une réduction 'somme'.
Definition Reduce.h:750
Gestion d'une commande sur accélérateur.
File d'exécution pour un accélérateur.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:68
Espace de nom pour l'utilisation des accélérateurs.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
RunQueue makeQueue(const Runner &runner)
Créé une file associée à runner.
eExecutionPolicy
Politique d'exécution pour un Runner.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-