Arcane  v4.1.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
TestMemoryBandwidth.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/accelerator/Memory.h"
15#include "arccore/common/NumArray.h"
16
20#include "arccore/accelerator/internal/Initializer.h"
21
22#include "./TestCommon.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27using namespace Arcane;
28using namespace Arcane::Accelerator;
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33void _doTestMemoryBandwidth(bool use_accelerator)
34{
35 Accelerator::Initializer init(use_accelerator, 0);
36 Runner runner(init.executionPolicy());
37 RunQueue queue(makeQueue(runner));
38 if (queue.isAcceleratorPolicy())
39 queue.setMemoryRessource(eMemoryResource::Device);
40 Int32 nb_value = 500 * 1000 * 128;
41 if (!queue.isAcceleratorPolicy()) {
42 nb_value /= 2;
43 }
44 Int32 nb_loop = 5;
45 std::cout << "Using accelerator policy name=" << queue.executionPolicy() << "\n";
46 std::cout << " nb_loop=" << nb_loop << " nb_value=" << nb_value << "\n";
47
48 eMemoryResource mem = queue.memoryResource();
50 host_a.resize(nb_value);
51 {
52 for (Int32 i = 0; i < nb_value; ++i) {
53 host_a(i) = (i + 2);
54 };
55 }
56
57 NumArray<Int64, MDDim1> device_a(mem);
58 device_a.copy(host_a);
59
60 NumArray<Int64, MDDim1> device_b(mem);
61 device_b.resize(nb_value);
62
64 MemoryCopyArgs copy_args(device_b.bytes(), device_a.bytes());
65 double x = Platform::getRealTime();
66 for (Int32 i = 0; i < nb_loop; ++i)
67 queue.copyMemory(copy_args);
68 queue.barrier();
69 double y = Platform::getRealTime();
70 // Il y a 1 tableau en lecture et 1 en écriture, soit 2 tableaux
71 Int64 nb_byte = device_a.bytes().size() * nb_loop * 2;
72 Real diff = y - x;
73 Real nb_giga_byte_second = (static_cast<Real>(nb_byte) / 1.0e9) / diff;
74 std::cout << "** TotalMemoryCopy Device/Device" << " GB/s=" << nb_giga_byte_second << " time=" << diff << "\n";
75}
76
77ARCCORE_TEST_DO_TEST_ACCELERATOR(ArccoreAccelerator, TestMemoryBandwidth, _doTestMemoryBandwidth);
78
79/*---------------------------------------------------------------------------*/
80/*---------------------------------------------------------------------------*/
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 pour initialiser le runtime accélérateur.
Definition Initializer.h:31
Gestionnaire d'exécution pour accélérateur.
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
Espace de nom pour l'utilisation des accélérateurs.
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 -*-
eMemoryResource
Liste des ressources mémoire disponibles.
@ Host
Alloue sur l'hôte.
@ Device
Alloue sur le device.