Skip to content
Snippets Groups Projects
EdgeNodeFinder.cpp 3.45 KiB
Newer Older
#include "EdgeNodeFinder.h"
#include "Parameter.h"

namespace vf::gpu
{
void findEdgeNodesCommMultiGPU(SPtr<Parameter> parameter)
{
    for (int level = 0; level <= parameter->getFine(); level++) {
        findEdgeNodesXY(level, parameter);
        findEdgeNodesXZ(level, parameter);
        findEdgeNodesYZ(level, parameter);
    }
}
} // namespace vf::gpu

namespace
{
void findEdgeNodesXY(int level, SPtr<Parameter> parameter)
{
    int indexOfProcessNeighborSend;
    int indexInSendBuffer;
    for (uint i = 0; i < (unsigned int)(parameter->getNumberOfProcessNeighborsX(level, "recv")); i++) {
        for (int j = 0; j < parameter->getParH(level)->recvProcessNeighborX[i].numberOfNodes; j++) {
Anna Wellmann's avatar
Anna Wellmann committed
            int nodeIndex = parameter->getParH(level)->recvProcessNeighborX[i].index[j];
Anna Wellmann's avatar
Anna Wellmann committed
                findIndexInSendNodes(nodeIndex, parameter->getParH(level)->sendProcessNeighborY, indexOfProcessNeighborSend,  indexInSendBuffer);
            if (foundIndex) {
                parameter->getParH(level)->edgeNodesXtoY.emplace_back(i, j, indexOfProcessNeighborSend,
                                                                      indexInSendBuffer);
            }
        }
    }
}

void findEdgeNodesXZ(int level, SPtr<Parameter> parameter)
{
    int indexOfProcessNeighborSend;
    int indexInSendBuffer;
    for (uint i = 0; i < (unsigned int)(parameter->getNumberOfProcessNeighborsX(level, "recv")); i++) {
        for (int j = 0; j < parameter->getParH(level)->recvProcessNeighborX[i].numberOfNodes; j++) {
Anna Wellmann's avatar
Anna Wellmann committed
            int nodeIndex = parameter->getParH(level)->recvProcessNeighborX[i].index[j];
Anna Wellmann's avatar
Anna Wellmann committed
                findIndexInSendNodes(nodeIndex, parameter->getParH(level)->sendProcessNeighborZ, indexOfProcessNeighborSend,  indexInSendBuffer);
            if (foundIndex) {
                parameter->getParH(level)->edgeNodesXtoZ.emplace_back(i, j, indexOfProcessNeighborSend,
                                                                      indexInSendBuffer);
            }
        }
    }
}

void findEdgeNodesYZ(int level, SPtr<Parameter> parameter)
{
    int indexOfProcessNeighborSend;
    int indexInSendBuffer;
    for (uint i = 0; i < (unsigned int)(parameter->getNumberOfProcessNeighborsY(level, "recv")); i++) {
        for (int j = 0; j < parameter->getParH(level)->recvProcessNeighborY[i].numberOfNodes; j++) {
Anna Wellmann's avatar
Anna Wellmann committed
            int nodeIndex = parameter->getParH(level)->recvProcessNeighborY[i].index[j];
Anna Wellmann's avatar
Anna Wellmann committed
                findIndexInSendNodes(nodeIndex, parameter->getParH(level)->sendProcessNeighborZ,indexOfProcessNeighborSend,  indexInSendBuffer);
            if (foundIndex) {
                parameter->getParH(level)->edgeNodesYtoZ.emplace_back(i, j, indexOfProcessNeighborSend,
                                                                      indexInSendBuffer);
            }
        }
    }
}

Anna Wellmann's avatar
Anna Wellmann committed
bool findIndexInSendNodes(int nodeIndex, const std::vector<ProcessNeighbor27>& sendProcessNeighbor, int &indexOfProcessNeighborSend, int &indexInSendBuffer)
Anna Wellmann's avatar
Anna Wellmann committed
    for (uint neighbor = 0; neighbor < (unsigned int)sendProcessNeighbor.size(); neighbor++) {
        for (int node = 0; node < sendProcessNeighbor[neighbor].numberOfNodes; node++) {
            if (sendProcessNeighbor[neighbor].index[node] == nodeIndex) {
                indexOfProcessNeighborSend = neighbor;
                indexInSendBuffer = node;