11// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22// -----------------------------------------------------------------------------
3- // Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+ // Copyright 2000-2026 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- /* HypreDoFLinearSystem.cc (C) 2022-2025 */
8+ /* HypreDoFLinearSystem.cc (C) 2022-2026 */
99/* */
1010/* Linear system: Matrix A + Vector x + Vector b for Ax=b. */
1111/* ---------------------------------------------------------------------------*/
3232#include < arcane/core/Timer.h>
3333
3434#include < arcane/accelerator/VariableViews.h>
35- #include < arcane/accelerator/core/Runner.h>
35+ #include < arcane/accelerator/NumArrayViews.h>
36+ // #include <arcane/accelerator/core/Runner.h>
3637#include < arcane/accelerator/core/Memory.h>
3738#include < arcane/accelerator/core/DeviceMemoryInfo.h>
3839
@@ -352,10 +353,10 @@ solve()
352353 const Int32 nb_local_row = rows_index_span.size ();
353354
354355 CSRFormatView csr_view = this ->getCSRValues ();
356+ const Int32 nb_row = csr_view.nbRow ();
355357 if (do_debug_print) {
356358 info () << " ROWS_INDEX=" << rows_index_span;
357359 info () << " ROWS=" << csr_view.rows ();
358- info () << " ROWS_NB_COLUMNS=" << csr_view.rowsNbColumn ();
359360 info () << " COLUMNS=" << csr_view.columns ();
360361 info () << " VALUE=" << csr_view.values ();
361362 }
@@ -374,7 +375,7 @@ solve()
374375 }
375376 }
376377
377- int * rows_nb_column_data = const_cast <int *>(csr_view.rowsNbColumn ().data ());
378+ // int* rows_nb_column_data = const_cast<int*>(csr_view.rowsNbColumn().data());
378379
379380 Real m1 = platform::getRealTime ();
380381 hypreCheck (" IJMatrixSetObjectType" ,HYPRE_IJMatrixSetObjectType (ij_A, HYPRE_PARCSR));
@@ -414,7 +415,7 @@ solve()
414415 if (do_debug_print) {
415416 ENUMERATE_ (DoF, idof, dof_family->allItems ()) {
416417 DoF dof = *idof;
417- Int32 nb_col = csr_view.rowsNbColumn ()[ idof.index ()] ;
418+ Int32 nb_col = csr_view.nbColumnForRow ( idof.index ()) ;
418419 Int32 row_csr_index = csr_view.rows ()[idof.index ()];
419420 info () << " DoF dof=" << ItemPrinter (dof) << " nb_col=" << nb_col << " row_csr_index=" << row_csr_index
420421 << " global_row=" << rows_index_span[idof.index ()];
@@ -450,7 +451,6 @@ solve()
450451 DoF dof = *idof;
451452 if (!dof.isOwn ())
452453 continue ;
453- Int32 nb_col = csr_view.rowsNbColumn ()[idof.index ()];
454454 m_parallel_rows_index[index] = rows_index_span[idof.index ()];
455455 ++index;
456456 }
@@ -459,6 +459,7 @@ solve()
459459 // Prefetch the memory to the Device to make sure we are using
460460 // Device memory and not host memory when using UVM
461461 NumArray<Int32, MDDim1> na_rows_nb_column_data (mem_ressource);
462+ na_rows_nb_column_data.resize (nb_row);
462463 NumArray<Int32, MDDim1> na_rows_index (mem_ressource);
463464 NumArray<Int32, MDDim1> na_columns_index (mem_ressource);
464465 NumArray<Real, MDDim1> na_matrix_values (mem_ressource);
@@ -474,35 +475,40 @@ solve()
474475
475476 if (is_use_device) {
476477 info () << " [Hypre-Info] Prefetching memory" ;
477- q.prefetchMemory (Accelerator::MemoryPrefetchArgs (ConstMemoryView (csr_view.rowsNbColumn ())).addAsync ());
478478 q.prefetchMemory (Accelerator::MemoryPrefetchArgs (ConstMemoryView (rows_index_span)).addAsync ());
479479 q.prefetchMemory (Accelerator::MemoryPrefetchArgs (ConstMemoryView (columns_index_span)).addAsync ());
480480 q.prefetchMemory (Accelerator::MemoryPrefetchArgs (ConstMemoryView (matrix_values)).addAsync ());
481481
482482 VariableUtils::prefetchVariableAsync (rhs_variable, &q);
483483 VariableUtils::prefetchVariableAsync (dof_variable, &q);
484484 }
485- Span<const Int32> rows_nb_column_span = csr_view.rowsNbColumn ();
485+ // Span<const Int32> rows_nb_column_span = csr_view.rowsNbColumn();
486486 if (is_use_device && is_use_device_memory) {
487- _doCopy (na_rows_nb_column_data, rows_nb_column_span, &q);
488487 _doCopy (na_rows_index, rows_index_span, &q);
489488 _doCopy (na_columns_index, columns_index_span, &q);
490489 _doCopy (na_matrix_values, matrix_values, &q);
491490
492- rows_nb_column_data = na_rows_nb_column_data.to1DSpan ().data ();
493491 rows_index_data = na_rows_index.to1DSpan ().data ();
494492 columns_index_data = na_columns_index.to1DSpan ().data ();
495493 matrix_values_data = na_matrix_values.to1DSpan ().data ();
496494
497495 q.barrier ();
498496 }
499-
497+ // Fill the array containing the number of columns per row
498+ {
499+ auto command = makeCommand (q);
500+ auto rows_nb_column_data = viewOut (command, na_rows_nb_column_data);
501+ command << RUNCOMMAND_LOOP1 (i, nb_row)
502+ {
503+ rows_nb_column_data[i] = csr_view.nbColumnForRow (i);
504+ };
505+ }
500506 {
501507 Timer::Action ta1 (tstat, " HypreLinearSystemBuildMatrix" );
502508 // GPU pointers; efficient in large chunks //
503509 HYPRE_IJMatrixSetValues (ij_A,
504510 nb_local_row,
505- rows_nb_column_data ,
511+ na_rows_nb_column_data. to1DSpan (). data () ,
506512 rows_index_data,
507513 columns_index_data,
508514 matrix_values_data);
0 commit comments