/** * Add Exchange in GridBuffer memory space. * * An Exchange is added to this GridBuffer. The exchange buffers use * the same memory as this GridBuffer. * * @param dataPlace place where received data are stored [GUARD | BORDER] * if dataPlace=GUARD than copy other BORDER to my GUARD * if dataPlace=BORDER than copy other GUARD to my BORDER * @param receive a Mask which describes the directions for the exchange * @param guardingCells number of guarding cells in each dimension * @param sizeOnDevice if true, internal buffers have their size information on the device, too */ void addExchange(uint32_t dataPlace, const Mask &receive, DataSpace<DIM> guardingCells, uint32_t communicationTag, bool sizeOnDevice = false) { if (hasOneExchange && (communicationTag != lastUsedCommunicationTag)) throw std::runtime_error("It is not allowed to give the same GridBuffer different communicationTags"); lastUsedCommunicationTag = communicationTag; receiveMask = receiveMask + receive; sendMask = this->receiveMask.getMirroredMask(); Mask send = receive.getMirroredMask(); for (uint32_t ex = 1; ex< -12 * (int) DIM + 6 * (int) DIM * (int) DIM + 9; ++ex) { if (send.isSet(ex)) { uint32_t uniqCommunicationTag = (communicationTag << 5) | ex; if (!hasOneExchange && !privateGridBuffer::UniquTag::getInstance().isTagUniqu(uniqCommunicationTag)) { std::stringstream message; message << "unique exchange communication tag (" << uniqCommunicationTag << ") witch is created from communicationTag (" << communicationTag << ") allready used for other gridbuffer exchange"; throw std::runtime_error(message.str()); } hasOneExchange = true; if (sendExchanges[ex] != NULL) { throw std::runtime_error("Exchange already added!"); } //std::cout<<"Add Exchange: send="<<ex<<" receive="<<Mask::getMirroredExchangeType((ExchangeType)ex)<<std::endl; maxExchange = std::max(maxExchange, ex + 1u); sendExchanges[ex] = new ExchangeIntern<BORDERTYPE, DIM > (*deviceBuffer, gridLayout, guardingCells, (ExchangeType) ex, uniqCommunicationTag, dataPlace == GUARD ? BORDER : GUARD, sizeOnDevice); ExchangeType recvex = Mask::getMirroredExchangeType(ex); maxExchange = std::max(maxExchange, recvex + 1u); receiveExchanges[recvex] = new ExchangeIntern<BORDERTYPE, DIM > ( *deviceBuffer, gridLayout, guardingCells, recvex, uniqCommunicationTag, dataPlace == GUARD ? GUARD : BORDER, sizeOnDevice); } } }
/** * Add Exchange in dedicated memory space. * * An Exchange is added to this GridBuffer. The exchange buffers use * the their own memory instead of using the GridBuffer's memory space. * * @param receive a Mask which describes the directions for the exchange * @param dataSpace size of the newly created exchange buffer in each dimension * @param sizeOnDevice if true, internal buffers have their size information on the device, too */ void addExchangeBuffer(const Mask &receive, const DataSpace<DIM> &dataSpace, uint32_t communicationTag, bool sizeOnDevice = false) { if (hasOneExchange && (communicationTag != lastUsedCommunicationTag)) throw std::runtime_error("It is not allowed to give the same GridBuffer different communicationTags"); lastUsedCommunicationTag = communicationTag; /*don't create buffer with 0 (zero) elements*/ if (dataSpace.productOfComponents() != 0) { receiveMask = receiveMask + receive; sendMask = this->receiveMask.getMirroredMask(); Mask send = receive.getMirroredMask(); for (uint32_t ex = 1; ex < 27; ++ex) { if (send.isSet(ex)) { uint32_t uniqCommunicationTag = (communicationTag << 5) | ex; if (!hasOneExchange && !privateGridBuffer::UniquTag::getInstance().isTagUniqu(uniqCommunicationTag)) { std::stringstream message; message << "unique exchange communication tag (" << uniqCommunicationTag << ") witch is created from communicationTag (" << communicationTag << ") allready used for other gridbuffer exchange"; throw std::runtime_error(message.str()); } hasOneExchange = true; if (sendExchanges[ex] != NULL) { throw std::runtime_error("Exchange already added!"); } //GridLayout<DIM> memoryLayout(size); maxExchange = std::max(maxExchange, ex + 1u); sendExchanges[ex] = new ExchangeIntern<BORDERTYPE, DIM > (/*memoryLayout*/ dataSpace, ex, uniqCommunicationTag, sizeOnDevice); ExchangeType recvex = Mask::getMirroredExchangeType(ex); maxExchange = std::max(maxExchange, recvex + 1u); receiveExchanges[recvex] = new ExchangeIntern<BORDERTYPE, DIM > (/*memoryLayout*/ dataSpace, recvex, uniqCommunicationTag, sizeOnDevice); } } } }