Arcane  v4.1.9.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-2026 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#include "./TestCommon.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26using namespace Arcane;
27using namespace Arcane::Accelerator;
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32extern "C++" Int64
33_testReduceDirect(RunQueue queue, SmallSpan<const Int64> c, Int32 nb_thread,
34 Int32 nb_value, Int32 nb_part, Int32 nb_loop, bool is_async);
35extern "C++" Int64
36_testReduceGridStride(RunQueue queue, SmallSpan<const Int64> c, Int32 nb_thread,
37 Int32 nb_value, Int32 nb_part, Int32 nb_loop, bool is_async);
38
39extern "C++" Int64
40_testReduceEmpty(RunQueue queue, SmallSpan<const Int64> c);
41
42void _doTestReduceDirect(bool use_accelerator, Int32 max_allowed_thread)
43{
44 Accelerator::Initializer x(use_accelerator, max_allowed_thread);
45 Runner runner(x.executionPolicy());
46 RunQueue queue(makeQueue(runner));
47 if (queue.isAcceleratorPolicy())
48 queue.setMemoryRessource(eMemoryResource::Device);
49 Int32 nb_loop = 1000;
50 Int32 nb_value = 1000000;
51 Int64 expected_value = 1000004000000;
52
53 nb_value = 10000000;
54 expected_value = 100000040000000;
55 nb_loop = 100;
56
57 Int32 nb_thread = 256;
58 Int32 nb_part = 1;
59 if (!queue.isAcceleratorPolicy()) {
60 if (arccoreIsDebug())
61 nb_loop /= 20;
62 else
63 nb_loop /= 4;
64 if (nb_loop == 0)
65 nb_loop = 1;
66 }
67 //nb_loop = 1;
68
69 std::cout << "Using accelerator policy name=" << queue.executionPolicy() << "\n";
70 std::cout << "Sizeof (ReducerSum2<Int64>) = " << sizeof(ReducerSum2<Int64>) << " nb_loop=" << nb_loop << "\n";
71
72 eMemoryResource mem = queue.memoryResource();
74 host_c.resize(nb_value);
75 {
76 for (Int32 i = 0; i < nb_value; ++i) {
77 host_c(i) = (i + 2) + (i + 3);
78 };
79 }
80
82 c.copy(host_c);
83
84 nb_part = 1;
85 for (Int32 k = 1; k < 5; ++k) {
86 {
87 Int64 v = _testReduceDirect(queue, c, nb_thread, nb_value, nb_part, nb_loop, false);
88 Int64 v2 = v / nb_loop;
89 ASSERT_EQ(v2, expected_value);
90 }
91 {
92 Int64 v = _testReduceDirect(queue, c, nb_thread, nb_value, nb_part, nb_loop, true);
93 Int64 v2 = v / nb_loop;
94 ASSERT_EQ(v2, expected_value);
95 }
96 nb_part *= 2;
97 }
98
99 nb_part = 1;
100 for (Int32 k = 1; k < 5; ++k) {
101 {
102 Int64 v = _testReduceGridStride(queue, c, nb_thread, nb_value, nb_part, nb_loop, false);
103 Int64 v2 = v / nb_loop;
104 ASSERT_EQ(v2, expected_value);
105 }
106 {
107 Int64 v = _testReduceGridStride(queue, c, nb_thread, nb_value, nb_part, nb_loop, true);
108 Int64 v2 = v / nb_loop;
109 ASSERT_EQ(v2, expected_value);
110 }
111 nb_part *= 2;
112 }
113 // Teste la réduction avec un tableau vide (dans ce cas le kernel n'est pas lancé)
114 {
115 Int64 v = _testReduceEmpty(queue, {});
116 ASSERT_EQ(v, 0);
117 }
118}
119
120ARCCORE_TEST_DO_TEST_ACCELERATOR(ArccoreAccelerator, TestReduceDirect, _doTestReduceDirect);
121
122/*---------------------------------------------------------------------------*/
123/*---------------------------------------------------------------------------*/
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.
Classe interne pour initialiser le runtime accélérateur.
Definition Initializer.h:37
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.
RunQueue makeQueue(const Runner &runner)
Créé une file associée à runner.
-*- 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.
@ Host
Alloue sur l'hôte.
@ Device
Alloue sur le device.