Skip to content
Snippets Groups Projects
Commit bd5adb91 authored by Jean-Noël Grad's avatar Jean-Noël Grad
Browse files

Fix PackInfo codegen

parent e564829f
No related merge requests found
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include "domain_decomposition/IBlock.h" #include "domain_decomposition/IBlock.h"
#include "communication/UniformPackInfo.h" #include "communication/UniformPackInfo.h"
#include <memory>
#define FUNC_PREFIX #define FUNC_PREFIX
#ifdef __GNUC__ #ifdef __GNUC__
...@@ -52,7 +54,10 @@ public: ...@@ -52,7 +54,10 @@ public:
void unpackData(IBlock * receiver, stencil::Direction dir, mpi::RecvBuffer & buffer) { void unpackData(IBlock * receiver, stencil::Direction dir, mpi::RecvBuffer & buffer) {
const auto dataSize = size(dir, receiver); const auto dataSize = size(dir, receiver);
unpack(dir, buffer.skip(dataSize), receiver); auto bufferSize = dataSize + sizeof({{dtype}});
auto bufferPtr = reinterpret_cast<void*>(buffer.skip(bufferSize));
std::align(alignof({{dtype}}), dataSize, bufferPtr, bufferSize);
unpack(dir, reinterpret_cast<unsigned char*>(bufferPtr), receiver);
} }
void communicateLocal(const IBlock * sender, IBlock * receiver, stencil::Direction dir) { void communicateLocal(const IBlock * sender, IBlock * receiver, stencil::Direction dir) {
...@@ -65,7 +70,10 @@ public: ...@@ -65,7 +70,10 @@ public:
void packDataImpl(const IBlock * sender, stencil::Direction dir, mpi::SendBuffer & outBuffer) const { void packDataImpl(const IBlock * sender, stencil::Direction dir, mpi::SendBuffer & outBuffer) const {
const auto dataSize = size(dir, sender); const auto dataSize = size(dir, sender);
pack(dir, outBuffer.forward(dataSize), const_cast<IBlock*>(sender)); auto bufferSize = dataSize + sizeof({{dtype}});
auto bufferPtr = reinterpret_cast<void*>(outBuffer.forward(bufferSize));
std::align(alignof({{dtype}}), dataSize, bufferPtr, bufferSize);
pack(dir, reinterpret_cast<unsigned char*>(bufferPtr), const_cast<IBlock *>(sender));
} }
void pack (stencil::Direction dir, unsigned char * buffer, IBlock * block) const; void pack (stencil::Direction dir, unsigned char * buffer, IBlock * block) const;
......
...@@ -59,7 +59,7 @@ public: ...@@ -59,7 +59,7 @@ public:
void pack (stencil::Direction dir, unsigned char * buffer, IBlock * block, gpuStream_t stream) override; void pack (stencil::Direction dir, unsigned char * buffer, IBlock * block, gpuStream_t stream) override;
void communicateLocal ( stencil::Direction /*dir*/, const IBlock* /* sender */, IBlock* /* receiver */, gpuStream_t /* stream */ ) override void communicateLocal ( stencil::Direction /*dir*/, const IBlock* /* sender */, IBlock* /* receiver */, gpuStream_t /* stream */ ) override
{ {
WALBERLA_ABORT("Local Communication not implemented yet for standard PackInfos. To run your application turn of local communication in the Communication class") WALBERLA_ABORT("Local Communication not implemented yet for standard PackInfos. To run your application, turn off local communication in the communication class, e.g. with useLocalCommunication=false")
} }
void unpack(stencil::Direction dir, unsigned char * buffer, IBlock * block, gpuStream_t stream) override; void unpack(stencil::Direction dir, unsigned char * buffer, IBlock * block, gpuStream_t stream) override;
uint_t size (stencil::Direction dir, IBlock * block) override; uint_t size (stencil::Direction dir, IBlock * block) override;
......
...@@ -100,6 +100,10 @@ public: ...@@ -100,6 +100,10 @@ public:
* *
* If NOT thread-safe, \ref threadsafeReceiving must return false! * If NOT thread-safe, \ref threadsafeReceiving must return false!
* *
* Implementations must reserve extra space and advance the send buffer
* pointer according to the alignment of the ghost layer data type!
* The buffer is char-aligned.
*
* @param receiver the block where the unpacked data should be stored into * @param receiver the block where the unpacked data should be stored into
* @param dir receive data from neighbor in this direction * @param dir receive data from neighbor in this direction
* @param buffer buffer for reading the data from * @param buffer buffer for reading the data from
...@@ -145,6 +149,10 @@ protected: ...@@ -145,6 +149,10 @@ protected:
* *
* Must be thread-safe! * Must be thread-safe!
* *
* Implementations must reserve extra space and advance the send buffer
* pointer according to the alignment of the ghost layer data type!
* The buffer is char-aligned.
*
* @param sender the block whose data should be packed into a buffer * @param sender the block whose data should be packed into a buffer
* @param dir pack data for neighbor in this direction * @param dir pack data for neighbor in this direction
* @param buffer buffer for writing the data into * @param buffer buffer for writing the data into
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment