Arcane  v4.1.2.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/utils/Exception.h"
12#include "arcane/accelerator/core/Runner.h"
13#include "arcane/accelerator/core/RunQueue.h"
14#include "arcane/accelerator/RunCommandLoop.h"
15
16#include "TestVirtualMethod.h"
17
18/*---------------------------------------------------------------------------*/
19/*---------------------------------------------------------------------------*/
20
21extern "C++" void arcaneRegisterDefaultAcceleratorRuntime();
22extern "C++" Arcane::Accelerator::eExecutionPolicy arcaneGetDefaultExecutionPolicy();
23
24using namespace Arcane;
25using namespace Arcane::Accelerator;
26
27namespace
28{
29void _doInit()
30{
31 arcaneRegisterDefaultAcceleratorRuntime();
32}
33Arcane::Accelerator::eExecutionPolicy _defaultExecutionPolicy()
34{
35 return arcaneGetDefaultExecutionPolicy();
36}
37} // namespace
38
39extern "C++" void
40_doCallTestVirtualMethod1(RunQueue& queue, NumArray<Int32, MDDim1>& compute_array, BaseTestClass* base_instance);
41
43: public BaseTestClass
44{
45 public:
46
47 ARCCORE_HOST_DEVICE int apply(int a, int b) override
48 {
49 return a + b;
50 }
51};
52
53void _doTestVirtualMethod1(eExecutionPolicy exec_policy)
54{
55 std::cout << "Test Virtual Method 1. Execution policy=" << exec_policy << "\n";
56 Runner runner(exec_policy);
57
58 RunQueue queue(makeQueue(runner));
60 if (queue.isAcceleratorPolicy())
61 mem_resource = eMemoryResource::Device;
62
63 // Créé une instance de 'DerivedTestClass' dans la mémoire accélérateur.
64 // Il faut pour cela allouer de la mémoire sur l'accélérateur et appeler
65 // le constructeur de 'DerivedTestClass' sur l'accélérateur pour
66 // que la table des méthodes virtuelles soit correctement initialisée.
67 NumArray<Byte, MDDim1> instance_memory(mem_resource);
68 instance_memory.resize(sizeof(DerivedTestClass));
69
70 BaseTestClass* base_instance = reinterpret_cast<DerivedTestClass*>(instance_memory.bytes().data());
71 std::cout << "Test Virtual Method 1. Create derived class\n";
72 std::cout.flush();
73
74 {
75 RunCommand command(makeCommand(queue));
76 command << RUNCOMMAND_SINGLE()
77 {
78 new (base_instance) DerivedTestClass();
79 };
80 }
81
82 // Applique une commande prenant en argument le pointeur sur la classe de base.
83 const Int32 nb_item = 12;
84 NumArray<Int32, MDDim1> compute_array(mem_resource);
85 compute_array.resize(nb_item);
86 std::cout << "Test Virtual Method 1. Do computation\n";
87 std::cout.flush();
88 _doCallTestVirtualMethod1(queue,compute_array,base_instance);
89
90 NumArray<Int32, MDDim1> host_array;
91 host_array.copy(compute_array);
92
93 for (Int32 i = 0; i < nb_item; ++i)
94 std::cout << "I=" << i << " R=" << host_array[i] << "\n";
95 for (Int32 i = 0; i < nb_item; ++i)
96 ASSERT_EQ(i*2, host_array[i]);
97
98}
99
100TEST(ArcaneAccelerator, VirtualMethod)
101{
102 _doInit();
103
104 auto f = []
105 {
106 _doTestVirtualMethod1(_defaultExecutionPolicy());
107 _doTestVirtualMethod1(eExecutionPolicy::Sequential);
108 };
110}
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
#define RUNCOMMAND_SINGLE(...)
Boucle sur accélérateur pour exécution avec un seul thread.
Gestionnaire d'exécution pour accélérateur.
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.