Skip to content

Commit e643e22

Browse files
Merge pull request #1205 from arcaneframework/dev/gg-add-accelerator-support-for-copy-and-init-material-variable
Add accelerator support for copy and initialization of materials variables
2 parents e452693 + 9f834f5 commit e643e22

18 files changed

+205
-112
lines changed

arcane/src/arcane/core/materials/internal/IMeshMaterialVariableInternal.h

+33-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* IMeshMaterialVariableInternal.h (C) 2000-2023 */
8+
/* IMeshMaterialVariableInternal.h (C) 2000-2024 */
99
/* */
1010
/* API interne Arcane de 'IMeshMaterialVariable'. */
1111
/*---------------------------------------------------------------------------*/
@@ -26,6 +26,30 @@ class ComponentItemListBuilder;
2626

2727
/*---------------------------------------------------------------------------*/
2828
/*---------------------------------------------------------------------------*/
29+
/*!
30+
* \brief Arguments des méthodes de copie entre valeurs partielles et globales
31+
*/
32+
class ARCANE_CORE_EXPORT MeshVariableCopyBetweenPartialAndGlobalArgs
33+
{
34+
public:
35+
36+
MeshVariableCopyBetweenPartialAndGlobalArgs(Int32 var_index,
37+
SmallSpan<const Int32> local_ids,
38+
SmallSpan<const Int32> indexes_in_multiple,
39+
RunQueue* queue)
40+
: m_var_index(var_index)
41+
, m_local_ids(local_ids)
42+
, m_indexes_in_multiple(indexes_in_multiple)
43+
, m_queue(queue)
44+
{}
45+
46+
public:
47+
48+
Int32 m_var_index = -1;
49+
SmallSpan<const Int32> m_local_ids;
50+
SmallSpan<const Int32> m_indexes_in_multiple;
51+
RunQueue* m_queue = nullptr;
52+
};
2953

3054
/*---------------------------------------------------------------------------*/
3155
/*---------------------------------------------------------------------------*/
@@ -65,24 +89,24 @@ class ARCANE_CORE_EXPORT IMeshMaterialVariableInternal
6589
virtual void copyFromBuffer(SmallSpan<const MatVarIndex> matvar_indexes,
6690
Span<const std::byte> bytes, RunQueue* queue) = 0;
6791

68-
6992
//! \internal
70-
virtual Ref<IData> internalCreateSaveDataRef(Integer nb_value) =0;
93+
virtual Ref<IData> internalCreateSaveDataRef(Integer nb_value) = 0;
7194

7295
//! \internal
73-
virtual void saveData(IMeshComponent* component,IData* data) =0;
96+
virtual void saveData(IMeshComponent* component, IData* data) = 0;
7497

7598
//! \internal
76-
virtual void restoreData(IMeshComponent* component,IData* data,Integer data_index,Int32ConstArrayView ids,bool allow_null_id) =0;
99+
virtual void restoreData(IMeshComponent* component, IData* data,
100+
Integer data_index, Int32ConstArrayView ids, bool allow_null_id) = 0;
77101

78102
//! \internal
79-
virtual void copyGlobalToPartial(Int32 var_index,Int32ConstArrayView local_ids,Int32ConstArrayView indexes_in_multiple) =0;
103+
virtual void copyGlobalToPartial(const MeshVariableCopyBetweenPartialAndGlobalArgs& args) = 0;
80104

81105
//! \internal
82-
virtual void copyPartialToGlobal(Int32 var_index,Int32ConstArrayView local_ids,Int32ConstArrayView indexes_in_multiple) =0;
106+
virtual void copyPartialToGlobal(const MeshVariableCopyBetweenPartialAndGlobalArgs& args) = 0;
83107

84108
//! \internal
85-
virtual void initializeNewItems(const ComponentItemListBuilder& list_builder) =0;
109+
virtual void initializeNewItems(const ComponentItemListBuilder& list_builder, RunQueue& queue) = 0;
86110
};
87111

88112
/*---------------------------------------------------------------------------*/

arcane/src/arcane/materials/AllEnvData.cc

+9-7
Original file line numberDiff line numberDiff line change
@@ -473,24 +473,26 @@ _printAllEnvCells(CellVectorView ids)
473473
* de suppression d'un matériau)
474474
*/
475475
void AllEnvData::
476-
_copyBetweenPartialsAndGlobals(Int32ConstArrayView pure_local_ids,
477-
Int32ConstArrayView partial_indexes,
478-
Int32 indexer_index, bool is_add_operation)
476+
_copyBetweenPartialsAndGlobals(const MeshVariableCopyBetweenPartialAndGlobalArgs& args,
477+
bool is_add_operation)
479478
{
480-
if (pure_local_ids.empty())
479+
if (args.m_local_ids.empty())
481480
return;
482481

482+
RunQueue::ScopedAsync sc(args.m_queue);
483483
// Comme on a modifié des mailles, il faut mettre à jour les valeurs
484484
// correspondantes pour chaque variable.
485485
//info(4) << "NB_TRANSFORM=" << nb_transform << " name=" << e->name();
486486
//Integer indexer_index = indexer->index();
487-
auto func = [=](IMeshMaterialVariable* mv) {
487+
auto func = [&](IMeshMaterialVariable* mv) {
488+
auto* mvi = mv->_internalApi();
488489
if (is_add_operation)
489-
mv->_internalApi()->copyGlobalToPartial(indexer_index, pure_local_ids, partial_indexes);
490+
mvi->copyGlobalToPartial(args);
490491
else
491-
mv->_internalApi()->copyPartialToGlobal(indexer_index, pure_local_ids, partial_indexes);
492+
mvi->copyPartialToGlobal(args);
492493
};
493494
functor::apply(m_material_mng, &MeshMaterialMng::visitVariables, func);
495+
args.m_queue->barrier();
494496
}
495497

496498
/*---------------------------------------------------------------------------*/

arcane/src/arcane/materials/CMakeLists.txt

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ arcane_add_library(arcane_materials
88
FILES ${ARCANE_SOURCES}
99
)
1010

11-
arcane_accelerator_add_source_files(AllEnvData.cc)
11+
arcane_accelerator_add_source_files(
12+
AllEnvData.cc
13+
MeshMaterialVariableScalar
14+
MeshMaterialVariableArray
15+
)
1216

1317
target_compile_definitions(arcane_materials PRIVATE ARCANE_COMPONENT_arcane_materials)
1418
target_include_directories(arcane_materials PUBLIC $<BUILD_INTERFACE:${Arcane_SOURCE_DIR}/src> $<INSTALL_INTERFACE:include>)

arcane/src/arcane/materials/ComponentItemListBuilder.cc

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* ComponentItemListBuilder.cc (C) 2000-2023 */
8+
/* ComponentItemListBuilder.cc (C) 2000-2024 */
99
/* */
1010
/* Classe d'aide à la construction d'une liste de ComponentItem. */
1111
/*---------------------------------------------------------------------------*/
@@ -14,6 +14,8 @@
1414
#include "arcane/materials/internal/ComponentItemListBuilder.h"
1515
#include "arcane/materials/internal/MeshMaterialVariableIndexer.h"
1616

17+
#include "arcane/utils/PlatformUtils.h"
18+
1719
/*---------------------------------------------------------------------------*/
1820
/*---------------------------------------------------------------------------*/
1921

@@ -26,8 +28,11 @@ namespace Arcane::Materials
2628
ComponentItemListBuilder::
2729
ComponentItemListBuilder(MeshMaterialVariableIndexer* var_indexer,
2830
Integer begin_index_in_partial)
29-
: m_component_index(var_indexer->index()+1)
31+
: m_component_index(var_indexer->index() + 1)
3032
, m_index_in_partial(begin_index_in_partial)
33+
, m_pure_matvar_indexes(platform::getDefaultDataAllocator())
34+
, m_partial_matvar_indexes(platform::getDefaultDataAllocator())
35+
, m_partial_local_ids(platform::getDefaultDataAllocator())
3136
, m_indexer(var_indexer)
3237
{
3338
Integer reserve_size = 4000;

arcane/src/arcane/materials/ConstituentModifierWorkInfo.cc

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* ConstituentModifierWorkInfo.h (C) 2000-2023 */
8+
/* ConstituentModifierWorkInfo.h (C) 2000-2024 */
99
/* */
1010
/* Structure de travail utilisée lors de la modification des constituants. */
1111
/*---------------------------------------------------------------------------*/
1212
/*---------------------------------------------------------------------------*/
1313

14+
#include "arcane/utils/PlatformUtils.h"
15+
1416
#include "arcane/materials/internal/ConstituentModifierWorkInfo.h"
1517

1618
#include "arcane/materials/internal/MaterialModifierOperation.h"
@@ -24,6 +26,16 @@ namespace Arcane::Materials
2426
/*---------------------------------------------------------------------------*/
2527
/*---------------------------------------------------------------------------*/
2628

29+
ConstituentModifierWorkInfo::
30+
ConstituentModifierWorkInfo()
31+
: pure_local_ids(platform::getDefaultDataAllocator())
32+
, partial_indexes(platform::getDefaultDataAllocator())
33+
{
34+
}
35+
36+
/*---------------------------------------------------------------------------*/
37+
/*---------------------------------------------------------------------------*/
38+
2739
void ConstituentModifierWorkInfo::
2840
initialize(Int32 max_local_id)
2941
{

arcane/src/arcane/materials/IncrementalComponentModifier.cc

+13-9
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ IncrementalComponentModifier(AllEnvData* all_env_data)
4040
: TraceAccessor(all_env_data->traceMng())
4141
, m_all_env_data(all_env_data)
4242
, m_material_mng(all_env_data->m_material_mng)
43+
, m_copy_queue(makeQueue(m_material_mng->runner()))
4344
{
4445
}
4546

@@ -219,9 +220,9 @@ _switchCellsForMaterials(const MeshMaterial* modified_mat,
219220

220221
info(4) << "NB_MAT_TRANSFORM=" << m_work_info.pure_local_ids.size() << " name=" << mat->name();
221222

222-
m_all_env_data->_copyBetweenPartialsAndGlobals(m_work_info.pure_local_ids,
223-
m_work_info.partial_indexes,
224-
indexer->index(), is_add);
223+
MeshVariableCopyBetweenPartialAndGlobalArgs args(indexer->index(), m_work_info.pure_local_ids.view(),
224+
m_work_info.partial_indexes.view(), &m_copy_queue);
225+
m_all_env_data->_copyBetweenPartialsAndGlobals(args, is_add);
225226
}
226227
}
227228
}
@@ -271,10 +272,11 @@ _switchCellsForEnvironments(const IMeshEnvironment* modified_env,
271272
info(4) << "NB_ENV_TRANSFORM=" << m_work_info.pure_local_ids.size()
272273
<< " name=" << env->name();
273274

274-
if (is_copy)
275-
m_all_env_data->_copyBetweenPartialsAndGlobals(m_work_info.pure_local_ids,
276-
m_work_info.partial_indexes,
277-
indexer->index(), is_add);
275+
if (is_copy) {
276+
MeshVariableCopyBetweenPartialAndGlobalArgs copy_args(indexer->index(), m_work_info.pure_local_ids.view(),
277+
m_work_info.partial_indexes.view(), &m_copy_queue);
278+
m_all_env_data->_copyBetweenPartialsAndGlobals(copy_args, is_add);
279+
}
278280
}
279281
}
280282

@@ -455,8 +457,10 @@ _addItemsToIndexer(MeshEnvironment* env, MeshMaterialVariableIndexer* var_indexe
455457
// initialiser avec les bonnes valeurs.
456458
{
457459
IMeshMaterialMng* mm = m_material_mng;
458-
functor::apply(mm, &IMeshMaterialMng::visitVariables,
459-
[&](IMeshMaterialVariable* mv) { mv->_internalApi()->initializeNewItems(list_builder); });
460+
auto func = [&](IMeshMaterialVariable* mv) {
461+
mv->_internalApi()->initializeNewItems(list_builder, m_copy_queue);
462+
};
463+
functor::apply(mm, &IMeshMaterialMng::visitVariables, func);
460464
}
461465
}
462466

arcane/src/arcane/materials/ItemMaterialVariableBaseT.H

+35-14
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* ItemMaterialVariableBaseT.h (C) 2000-2023 */
8+
/* ItemMaterialVariableBaseT.h (C) 2000-2024 */
99
/* */
1010
/* Implémentation de la classe de base des variables matériaux. */
1111
/*---------------------------------------------------------------------------*/
@@ -32,6 +32,9 @@
3232
#include "arcane/materials/internal/MeshMaterialVariablePrivate.h"
3333
#include "arcane/materials/internal/MeshMaterialVariableIndexer.h"
3434

35+
#include "arcane/accelerator/core/RunQueue.h"
36+
#include "arcane/accelerator/RunCommandLoop.h"
37+
3538
/*---------------------------------------------------------------------------*/
3639
/*---------------------------------------------------------------------------*/
3740

@@ -335,9 +338,9 @@ _isValidAndUsedAndGlobalUsed(PrivatePartType* partial_var)
335338

336339
template<typename Traits> void
337340
ItemMaterialVariableBase<Traits>::
338-
_copyGlobalToPartial(Int32 var_index,Int32ConstArrayView local_ids,
339-
Int32ConstArrayView indexes_in_multiple)
341+
_copyGlobalToPartial(const MeshVariableCopyBetweenPartialAndGlobalArgs& args)
340342
{
343+
Int32 var_index = args.m_var_index;
341344
PrivatePartType* partial_var = m_vars[var_index+1];
342345
if (!_isValidAndUsedAndGlobalUsed(partial_var))
343346
return;
@@ -353,33 +356,35 @@ _copyGlobalToPartial(Int32 var_index,Int32ConstArrayView local_ids,
353356
ContainerConstViewType global_view = m_vars[0]->constValueView();
354357
ContainerViewType partial_view = partial_var->valueView();
355358

356-
Traits::copyTo(global_view,local_ids,partial_view,indexes_in_multiple);
359+
Traits::copyTo(global_view, args.m_local_ids, partial_view,
360+
args.m_indexes_in_multiple, *args.m_queue);
357361
}
358362

359363
/*---------------------------------------------------------------------------*/
360364
/*---------------------------------------------------------------------------*/
361365

362366
template<typename Traits> void
363367
ItemMaterialVariableBase<Traits>::
364-
_copyPartialToGlobal(Int32 var_index,Int32ConstArrayView local_ids,
365-
Int32ConstArrayView indexes_in_multiple)
368+
_copyPartialToGlobal(const MeshVariableCopyBetweenPartialAndGlobalArgs& args)
366369
{
370+
Int32 var_index = args.m_var_index;
367371
PrivatePartType* partial_var = m_vars[var_index+1];
368372
if (!_isValidAndUsedAndGlobalUsed(partial_var))
369373
return;
370374

371375
ContainerViewType global_view = m_vars[0]->valueView();
372376
ContainerConstViewType partial_view = partial_var->constValueView();
373377

374-
Traits::copyTo(partial_view,indexes_in_multiple,global_view,local_ids);
378+
Traits::copyTo(partial_view, args.m_indexes_in_multiple,
379+
global_view, args.m_local_ids, *args.m_queue);
375380
}
376381

377382
/*---------------------------------------------------------------------------*/
378383
/*---------------------------------------------------------------------------*/
379384

380385
template<typename Traits> void
381386
ItemMaterialVariableBase<Traits>::
382-
_initializeNewItems(const ComponentItemListBuilder& list_builder)
387+
_initializeNewItems(const ComponentItemListBuilder& list_builder, RunQueue& queue)
383388
{
384389
MeshMaterialVariableIndexer* indexer = list_builder.indexer();
385390
Integer var_index = indexer->index();
@@ -404,15 +409,31 @@ _initializeNewItems(const ComponentItemListBuilder& list_builder)
404409
// (sauf lors de l'init).
405410
DataType zero = DataType();
406411

412+
auto command = makeCommand(queue);
413+
SmallSpan<ContainerViewType> views = m_views.view();
414+
415+
ARCANE_CHECK_ACCESSIBLE_POINTER(queue, views.data());
416+
ARCANE_CHECK_ACCESSIBLE_POINTER(queue, global_view.data());
417+
ARCANE_CHECK_ACCESSIBLE_POINTER(queue, partial_matvar.data());
418+
407419
if (init_with_zero){
408-
for( Integer i=0; i<nb_partial; ++i )
409-
this->setFillValue(partial_matvar[i],zero);
420+
command << RUNCOMMAND_LOOP1(iter, nb_partial)
421+
{
422+
auto [i] = iter();
423+
MatVarIndex mvi = partial_matvar[i];
424+
Traits::setValue(views[mvi.arrayIndex()][mvi.valueIndex()],zero);
425+
};
410426
}
411427
else{
412428
Int32ConstArrayView partial_local_ids = list_builder.partialLocalIds();
413-
for( Integer i=0; i<nb_partial; ++i ){
414-
setValue(partial_matvar[i], global_view[partial_local_ids[i]]);
415-
}
429+
ARCANE_CHECK_ACCESSIBLE_POINTER(queue, partial_local_ids.data());
430+
command << RUNCOMMAND_LOOP1(iter, nb_partial)
431+
{
432+
auto [i] = iter();
433+
const auto& v = global_view[partial_local_ids[i]];
434+
MatVarIndex mvi = partial_matvar[i];
435+
Traits::setValue(views[mvi.arrayIndex()][mvi.valueIndex()],v);
436+
};
416437
}
417438
}
418439

arcane/src/arcane/materials/MeshMaterialMng.cc

+4-1
Original file line numberDiff line numberDiff line change
@@ -184,12 +184,15 @@ build()
184184
IAcceleratorMng* acc_mng = m_variable_mng->_internalApi()->acceleratorMng();
185185
if (acc_mng){
186186
Runner* default_runner = acc_mng->defaultRunner();
187-
if (default_runner)
187+
// Indique si on active la file accélérateur
188+
const bool use_accelerator_runner = false;
189+
if (use_accelerator_runner && default_runner)
188190
m_runner = *default_runner;
189191
}
190192
// Si pas de runner enregistré, utiliser un runner séquentiel.
191193
if (!m_runner.isInitialized())
192194
m_runner.initialize(Accelerator::eExecutionPolicy::Sequential);
195+
m_runner_ptr = &m_runner;
193196
info() << "Use runner '" << m_runner.executionPolicy() << "' for MeshMaterialMng name=" << name();
194197
}
195198

0 commit comments

Comments
 (0)