Skip to content

Commit 42a2d2f

Browse files
Merge pull request #350 from arcaneframework/dev/gg-remove-usage-of-rowsnbcolumn-for-csrformatmatrixview
[femutils] Remove usage of `CsrFormatMatrixView:rowsNbColumn()'`
2 parents 1929507 + 19c585d commit 42a2d2f

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

femutils/CsrFormatMatrixView.h

Lines changed: 7 additions & 3 deletions
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-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-
/* CsrFormatMatrixView.h (C) 2022-2025 */
8+
/* CsrFormatMatrixView.h (C) 2022-2026 */
99
/* */
1010
/* View of a Matrix with CSR format. */
1111
/*---------------------------------------------------------------------------*/
@@ -154,7 +154,6 @@ class CsrFormatMatrixView
154154
public:
155155

156156
[[nodiscard]] constexpr ARCCORE_HOST_DEVICE Span<const Int32> rows() const { return m_matrix_rows; }
157-
[[nodiscard]] constexpr ARCCORE_HOST_DEVICE Span<const Int32> rowsNbColumn() const { return m_matrix_rows_nb_column; }
158157
[[nodiscard]] constexpr ARCCORE_HOST_DEVICE Span<const Int32> columns() const { return m_matrix_columns; }
159158
[[nodiscard]] constexpr ARCCORE_HOST_DEVICE Span<Real> values() const { return m_values; }
160159

@@ -166,6 +165,11 @@ class CsrFormatMatrixView
166165
[[nodiscard]] constexpr ARCCORE_HOST_DEVICE Int32 nbValue() const { return m_values.size(); }
167166

168167
[[nodiscard]] constexpr ARCCORE_HOST_DEVICE Int32 row(Int32 index) const { return m_matrix_rows[index]; }
168+
//! Number of column for the row \a row
169+
[[nodiscard]] constexpr ARCCORE_HOST_DEVICE Int32 nbColumnForRow(Int32 row) const
170+
{
171+
return m_matrix_rows_nb_column[row];
172+
}
169173

170174
//! Local index of the column for the given RowColumnIndex \a rc_index
171175
[[nodiscard]] constexpr ARCCORE_HOST_DEVICE Int32 column(CsrRowColumnIndex rc_index) const { return m_matrix_columns[rc_index]; }

femutils/HypreDoFLinearSystem.cc

Lines changed: 19 additions & 13 deletions
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-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
/*---------------------------------------------------------------------------*/
@@ -32,7 +32,8 @@
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

Comments
 (0)