Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemFunctor.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* ItemFunctor.cc (C) 2000-2024 */
9/* */
10/* Fonctor sur les entités. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/ItemFunctor.h"
15
16/*---------------------------------------------------------------------------*/
17/*---------------------------------------------------------------------------*/
18
19namespace Arcane
20{
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25AbstractItemRangeFunctor::
26AbstractItemRangeFunctor(ItemVectorView items_view,Integer grain_size)
27: m_items(items_view)
28, m_block_size(SIMD_PADDING_SIZE)
29, m_nb_block(items_view.size())
30, m_block_grain_size(grain_size)
31{
32 // NOTE: si le range functor est utilisé pour la vectorisation, il faut
33 // que items_view.localIds() soit aligné. Le problème est qu'on ne sait
34 // pas exactement quel est l'alignement requis. On pourrait se base sur
35 // \a m_block_size et dire que l'alignement est m_block_size * sizeof(Int32).
36 // De toute facon, le problème éventuel d'alignement sera détecté par
37 // SimdItemEnumerator.
38 Integer nb_item = m_items.size();
39 m_nb_block = nb_item / m_block_size;
40 if ( (nb_item % m_block_size)!=0 )
41 ++m_nb_block;
42
43 m_block_grain_size = grain_size / m_block_size;
44}
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
49ItemVectorView AbstractItemRangeFunctor::
50_view(Integer begin_block, Integer nb_block, Int32* true_begin) const
51{
52 // Converti (begin_block,nb_block) en (begin,size) correspondant à m_items.
53 Integer begin = begin_block * m_block_size;
54 Integer nb_item = m_items.size();
55 Integer size = math::min(nb_block * m_block_size,nb_item-begin);
56 if (true_begin)
57 *true_begin = begin;
58 return m_items.subView(begin,size);
59}
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
63
64}
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.