Arcane  v3.16.9.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
TestVirtualMethod.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 "arcane/utils/NumArray.h"
11#include "arcane/accelerator/core/Runner.h"
12#include "arcane/accelerator/core/RunQueue.h"
14
15#include "TestVirtualMethod.h"
16
17/*---------------------------------------------------------------------------*/
18/*---------------------------------------------------------------------------*/
19
20extern "C++" void arcaneRegisterDefaultAcceleratorRuntime();
21extern "C++" Arcane::Accelerator::eExecutionPolicy arcaneGetDefaultExecutionPolicy();
22
23using namespace Arcane;
24using namespace Arcane::Accelerator;
25
26namespace
27{
28void _doInit()
29{
30 arcaneRegisterDefaultAcceleratorRuntime();
31}
32Arcane::Accelerator::eExecutionPolicy _defaultExecutionPolicy()
33{
34 return arcaneGetDefaultExecutionPolicy();
35}
36} // namespace
37
38extern "C++" void
39_doCallTestVirtualMethod1(RunQueue& queue, NumArray<Int32, MDDim1>& compute_array, BaseTestClass* base_instance);
40
42: public BaseTestClass
43{
44 public:
45
46 ARCCORE_HOST_DEVICE int apply(int a, int b) override
47 {
48 return a + b;
49 }
50};
51
52void _doTestVirtualMethod1(eExecutionPolicy exec_policy)
53{
54 std::cout << "Test Virtual Method 1. Execution policy=" << exec_policy << "\n";
55 Runner runner(exec_policy);
56
57 RunQueue queue(makeQueue(runner));
59 if (queue.isAcceleratorPolicy())
60 mem_resource = eMemoryResource::Device;
61
62 // Créé une instance de 'DerivedTestClass' dans la mémoire accélérateur.
63 // Il faut pour cela allouer de la mémoire sur l'accélérateur et appeler
64 // le constructeur de 'DerivedTestClass' sur l'accélérateur pour
65 // que la table des méthodes virtuelles soit correctement initialisée.
66 NumArray<Byte, MDDim1> instance_memory(mem_resource);
67 instance_memory.resize(sizeof(DerivedTestClass));
68
69 BaseTestClass* base_instance = reinterpret_cast<DerivedTestClass*>(instance_memory.bytes().data());
70 std::cout << "Test Virtual Method 1. Create derived class\n";
71 std::cout.flush();
72
73 {
74 RunCommand command(makeCommand(queue));
75 command << RUNCOMMAND_SINGLE()
76 {
77 new (base_instance) DerivedTestClass();
78 };
79 }
80
81 // Applique une commande prenant en argument le pointeur sur la classe de base.
82 const Int32 nb_item = 12;
83 NumArray<Int32, MDDim1> compute_array(mem_resource);
84 compute_array.resize(nb_item);
85 std::cout << "Test Virtual Method 1. Do computation\n";
86 std::cout.flush();
87 _doCallTestVirtualMethod1(queue,compute_array,base_instance);
88
89 NumArray<Int32, MDDim1> host_array;
90 host_array.copy(compute_array);
91
92 for (Int32 i = 0; i < nb_item; ++i)
93 std::cout << "I=" << i << " R=" << host_array[i] << "\n";
94 for (Int32 i = 0; i < nb_item; ++i)
95 ASSERT_EQ(i*2, host_array[i]);
96
97}
98
99TEST(ArcaneAccelerator, VirtualMethod)
100{
101 _doInit();
102
103 auto f = []
104 {
105 _doTestVirtualMethod1(_defaultExecutionPolicy());
106 _doTestVirtualMethod1(eExecutionPolicy::Sequential);
107 };
109}
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
Types et macros pour gérer les boucles sur les accélérateurs.
#define RUNCOMMAND_SINGLE(...)
Boucle sur accélérateur pour exécution avec un seul thread.
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
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
void copy(SmallSpan< const DataType > rhs)
Copie dans l'instance les valeurs de rhs.
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.
@ Sequential
Politique d'exécution séquentielle.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
void arcaneCallFunctionAndTerminateIfThrow(std::function< void()> function)
eMemoryResource
Liste des ressources mémoire disponibles.
@ Host
Alloue sur l'hôte.
@ Device
Alloue sur le device.