Arcane  v4.1.2.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
TestReduce1.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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 "arccore/base/PlatformUtils.h"
11
12#include "arccore/common/accelerator/Runner.h"
13#include "arccore/common/accelerator/RunQueue.h"
14#include "arccore/common/NumArray.h"
15
19#include "arccore/accelerator/internal/Initializer.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24using namespace Arcane;
25using namespace Arcane::Accelerator;
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30Int64 _testReduceDirect(RunQueue queue, Int32 nb_value, Int32 nb_loop)
31{
32 std::cout << "Sizeof (ReducerSum2<Int64>) = " << sizeof(ReducerSum2<Int64>) << "\n";
33 eMemoryResource mem = queue.memoryResource();
34 // Teste la somme de deux tableaux 'a' et 'b' dans un tableau 'c'.
35
36 // Définit 2 tableaux 'a' et 'b' et effectue leur initialisation.
38 c.resize(nb_value);
39 {
40 auto command = makeCommand(queue);
41 auto out_c = viewOut(command, c);
42 command << RUNCOMMAND_LOOP1(iter, nb_value)
43 {
44 auto [i] = iter();
45 out_c(i) = (i + 2) + (i + 3);
46 };
47 }
48
49 Int64 total_x = {};
50 double x = Platform::getRealTime();
51 {
52 SmallSpan<const Int64> c_view(c);
53 for (int j = 0; j < nb_loop; ++j) {
54 auto command = makeCommand(queue);
55 ReducerSum2<Int64> reducer(command);
56 command << RUNCOMMAND_LOOP1(iter, nb_value, reducer)
57 {
58 reducer.combine(c_view[iter]);
59 };
60 Int64 tx = reducer.reducedValue();
61 total_x += tx;
62 }
63 }
64 double y = Platform::getRealTime();
65 std::cout << "** TotalReduceDirect=" << total_x << " time=" << (y - x) << "\n";
66 return total_x;
67}
68
69TEST(ArccoreAccelerator, TestReduceDirect)
70{
71 Accelerator::Initializer x(true, 0);
72 Runner runner(x.executionPolicy());
73 RunQueue queue(makeQueue(runner));
74 if (queue.isAcceleratorPolicy())
76 Int32 nb_loop = 1500;
77 if (arccoreIsDebug())
78 nb_loop /= 20;
79 Int32 nb_value = 1000000;
80 Int64 expected_value = 1000004000000;
81
82 {
83 // Test avec RunQueue synchrone
84 std::cout << "Test Sync\n";
85 Int64 v = _testReduceDirect(queue, nb_value, nb_loop);
86 Int64 v2 = v /= nb_loop;
87 std::cout << "V=" << v2 << "\n";
88 ASSERT_EQ(v2, expected_value);
89 }
90 {
91 // Test avec RunQueue asynchrone
92 std::cout << "Test Asynchronous\n";
93 queue.setAsync(true);
94 Int64 v = _testReduceDirect(queue, nb_value, nb_loop);
95 Int64 v2 = v /= nb_loop;
96 std::cout << "V=" << v2 << "\n";
97 ASSERT_EQ(v2, expected_value);
98 }
99}
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
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 1D sur accélérateur avec arguments supplémentaires.
Classe pour initialiser le runtime accélérateur.
Definition Initializer.h:31
void setAsync(bool v)
Positionne l'asynchronisme de l'instance.
Definition RunQueue.cc:299
eMemoryResource memoryResource() const
Ressource mémoire utilisée pour les allocations avec cette instance.
Definition RunQueue.cc:372
void setMemoryRessource(eMemoryResource mem)
Positionne la ressource mémoire utilisée pour les allocations avec cette instance.
Definition RunQueue.cc:351
bool isAcceleratorPolicy() const
Indique si l'instance est associée à un accélérateur.
Definition RunQueue.cc:331
Gestionnaire d'exécution pour accélérateur.
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
Vue d'un tableau d'éléments de type T.
Definition Span.h:801
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.
auto viewOut(const ViewBuildInfo &vbi, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.
RunQueue makeQueue(const Runner &runner)
Créé une file associée à runner.
ARCCORE_BASE_EXPORT Real getRealTime()
Temps Real utilisé en secondes.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ARCCORE_BASE_EXPORT bool arccoreIsDebug()
Vrai si la macro ARCCORE_DEBUG est définie.
eMemoryResource
Liste des ressources mémoire disponibles.
@ Device
Alloue sur le device.