Re: [multi] Formal Review Begins

Rainer Deyke via Boost <[email protected]>
Newsgroups gmane.comp.lib.boost.devel
Message-ID <[email protected]>
On 3/5/26 14:26, Matt Borland via Boost wrote:
> Multi is a modern C++ library that provides manipulation and access of data in multidimensional arrays for both CPU and GPU memory.
I have my own multidimensional array type that I use extensively, so I 
thought it would be interesting to compare my own efforts to the 
proposed library.

The proposed library uses an array-of-arrays model.  By contrast, my own 
library uses an array-indexed-by-vector model.  This makes iteration a 
lot more convenient with my type.  I do a lot of iteration in my own 
code, so this is kind of a big deal.  Compare:

My multi_array type:

   multi_array<int, 2> a({5, 2});
   for (auto &element: a) {
     element = 5;
   }
   for (auto index: a.get_bounds()) {
     a[index] = get<0>(index) + get<1>(index) * 10;
   }

The proposed library:

   multi::array<int, 2> a({5, 2});
   for (auto &row: a) {
     for (auto &element: row) {
       element = 5;
     }
   }
   auto [rows, columns] = a.extensions();
   for (auto row_index: rows) {
     for (auto column_index: columns) {
       a[row_index][column_index] = row_index + column_index * 10;
     }
   }

Aside from more compact code, one advantage of this kind of flattened 
access is that it makes it possible to write non-recursive generic 
functions that work on arrays with different dimensionality.  It should 
be possible to add this kind of flat iteration to the proposed library 
without breaking any existing functionality.

The proposed library makes extensive use of array views.  This is useful 
both for performance and functionality, but it's also dangerous because 
it can lead to unintentional data aliasing and dangling pointers.  My 
own approach is to just have the single owning multi_array type and no 
array views at all.  This means a few extra unnecessary copies of data, 
but for my usage the performance penalty is completely acceptable.

The proposed library provides just one function for changing the extents 
of an existing array: reextent.  My type has member functions for 
inserting and removing 
rows/columns/planes/whatever-the-n-dimensional-equivalent-is, and I use 
them all the time.  This is no big deal, since this functionality can be 
provided by external free functions.


-- 
Rainer Deyke - [email protected]

_______________________________________________
Boost mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://lists.boost.org/mailman3/lists/boost.lists.boost.org/
Archived at: https://lists.boost.org/archives/list/[email protected]/message/3NXC6STDPEXCAIK6QM44M2GDQEN6JTYB/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.