OpenLB 1.8.1
Loading...
Searching...
No Matches
olb::ConcreteCommunicatable< cpu::simd::CyclicColumn< T > > Class Template Referencefinal

#include <column.h>

+ Inheritance diagram for olb::ConcreteCommunicatable< cpu::simd::CyclicColumn< T > >:
+ Collaboration diagram for olb::ConcreteCommunicatable< cpu::simd::CyclicColumn< T > >:

Public Member Functions

 ConcreteCommunicatable (cpu::simd::CyclicColumn< T > &column)
 
std::size_t size (ConstSpan< CellID > indices) const
 Get serialized size for data at locations indices
 
std::size_t serialize (ConstSpan< CellID > indices, std::uint8_t *buffer) const
 Serialize data at locations indices to buffer
 
std::size_t deserialize (ConstSpan< CellID > indices, const std::uint8_t *buffer)
 Deserialize data at locations indices to buffer
 
- Public Member Functions inherited from olb::Communicatable
virtual ~Communicatable ()
 

Detailed Description

template<typename T>
class olb::ConcreteCommunicatable< cpu::simd::CyclicColumn< T > >

Definition at line 285 of file column.h.

Constructor & Destructor Documentation

◆ ConcreteCommunicatable()

template<typename T >
olb::ConcreteCommunicatable< cpu::simd::CyclicColumn< T > >::ConcreteCommunicatable ( cpu::simd::CyclicColumn< T > & column)
inline

Definition at line 290 of file column.h.

290 :
291 _column{column} { }

Member Function Documentation

◆ deserialize()

template<typename T >
std::size_t olb::ConcreteCommunicatable< cpu::simd::CyclicColumn< T > >::deserialize ( ConstSpan< CellID > indices,
const std::uint8_t * buffer )
inlinevirtual

Deserialize data at locations indices to buffer

Implements olb::Communicatable.

Definition at line 330 of file column.h.

332 {
333 if (meta::is_aligned<T>(buffer)) {
334 const T* source = reinterpret_cast<const T*>(buffer);
335 const typename cpu::simd::Pack<T>::index_t* offsets = indices.data();
336
337 for (std::size_t i=0;
338 i < (indices.size() / cpu::simd::Pack<T>::size) * cpu::simd::Pack<T>::size;
339 i += cpu::simd::Pack<T>::size,
340 source += cpu::simd::Pack<T>::size,
341 offsets += cpu::simd::Pack<T>::size) {
342 cpu::simd::store(&_column[0], cpu::simd::Pack<T>{source}, offsets);
343 }
344 for (std::size_t i=(indices.size() / cpu::simd::Pack<T>::size) * cpu::simd::Pack<T>::size;
345 i < indices.size();
346 ++i) {
347 _column[indices[i]] = *(source++);
348 }
349 } else {
350 const std::uint8_t* source = buffer;
351 for (CellID index : indices) {
352 std::memcpy(reinterpret_cast<void*>(&_column[index]), source, sizeof(T));
353 source += sizeof(T);
354 }
355 }
356 return indices.size() * sizeof(T);
357 }
void store(T *target, Pack< T > value)
bool is_aligned(const void *ptr)
Returns true iff address ptr is aligned w.r.t. TYPE.
Definition meta.h:69
std::uint32_t CellID
Type for sequential block-local cell indices.

References olb::ConstSpan< T >::data(), olb::meta::is_aligned(), olb::ConstSpan< T >::size(), and olb::cpu::simd::store().

+ Here is the call graph for this function:

◆ serialize()

template<typename T >
std::size_t olb::ConcreteCommunicatable< cpu::simd::CyclicColumn< T > >::serialize ( ConstSpan< CellID > indices,
std::uint8_t * buffer ) const
inlinevirtual

Serialize data at locations indices to buffer

Implements olb::Communicatable.

Definition at line 300 of file column.h.

302 {
303 if (meta::is_aligned<T>(buffer)) {
304 T* target = reinterpret_cast<T*>(buffer);
305 const typename cpu::simd::Pack<T>::index_t* offsets = indices.data();
306
307 for (std::size_t i=0;
308 i < (indices.size() / cpu::simd::Pack<T>::size) * cpu::simd::Pack<T>::size;
309 i += cpu::simd::Pack<T>::size,
310 target += cpu::simd::Pack<T>::size,
311 offsets += cpu::simd::Pack<T>::size) {
312 cpu::simd::store(target, {&_column[0], offsets});
313 }
314 for (std::size_t i=(indices.size() / cpu::simd::Pack<T>::size) * cpu::simd::Pack<T>::size;
315 i < indices.size();
316 ++i) {
317 *(target++) = _column[indices[i]];
318 }
319 } else {
320 std::uint8_t* target = buffer;
321 for (CellID index : indices) {
322 std::memcpy(target, reinterpret_cast<const void*>(&_column[index]), sizeof(T));
323 target += sizeof(T);
324 }
325 }
326 return indices.size() * sizeof(T);
327 }

References olb::ConstSpan< T >::data(), olb::meta::is_aligned(), olb::ConstSpan< T >::size(), and olb::cpu::simd::store().

+ Here is the call graph for this function:

◆ size()

template<typename T >
std::size_t olb::ConcreteCommunicatable< cpu::simd::CyclicColumn< T > >::size ( ConstSpan< CellID > indices) const
inlinevirtual

Get serialized size for data at locations indices

Implements olb::Communicatable.

Definition at line 294 of file column.h.

295 {
296 return indices.size() * sizeof(T);
297 }

References olb::ConstSpan< T >::size().

+ Here is the call graph for this function:

The documentation for this class was generated from the following file: