#pragma once #include #include #include #include #include "Array.h" #include "DvmhDirectiveBase.h" #include "AstWrapper.h" #include "types.h" #include "utils.h" extern int sharedMemoryParallelization; struct LoopGraph; namespace Distribution { template class GraphCSR; template class Arrays; } namespace DIST = Distribution; struct AlignRule : public AlignRuleBase { public: Statement* GenRule(File *file, const int variant) const; }; struct DistrVariant : public DistrVariantBase { public: DistrVariant(const std::vector &distRule) : DistrVariantBase(distRule) { } void GenRule(File *file, Expression *arrayRef, const std::vector &newOrder) const; std::vector GenRuleSt(File *file, const std::vector &newOrder) const; }; struct DataDirective : Directive { public: std::vector alignRules; std::vector>> distrRules; public: std::vector>> GetDistrRules() const { return distrRules; } void createDirstributionVariants(const std::vector &arraysToDist); std::vector GenRule(const std::vector &rules) const; std::vector GenAlignsRules() const; std::vector GenAlignsRules(void*) { return alignRules; } std::vector GenRule(File *file, const std::vector &rules, const int variant) const; std::vector> GenRule(const std::vector &rules, int) const; std::vector GenAlignsRules(File *file, const int variant) const; void UpdateLinks(const std::map &oldNewArrays) { for (int i = 0; i < distrRules.size(); ++i) distrRules[i].first = oldNewArrays.find(distrRules[i].first)->second; } ~DataDirective() { for (auto &elem : distrRules) { if (elem.first && elem.first->IsTemplate()) { delete elem.first; elem.first = NULL; } } } }; struct CreatedDirective : Directive { std::string data; std::vector sageData; explicit CreatedDirective(const std::string& data, const std::vector& sageData) : data(data), sageData(sageData) { } explicit CreatedDirective(const std::string& data, const std::vector& sageData, int line) : data(data), sageData(sageData) { this->line = line; } }; struct ParallelDirective : Directive { public: std::vector parallel; // tuple of on A*x + B std::vector>> on; DIST::Array *arrayRef; // template DIST::Array *arrayRef2;// main array in loop std::vector>> on2; std::string cloneOfTemplate; // if loop has realigns before std::set privates; // origin_Name uniqName bounds std::vector, std::vector>>> shadowRenew; std::vector>> shadowRenewShifts; // origin_Name uniqName bounds std::vector, std::vector>>> across; std::vector>> acrossShifts; // origin_Name uniqName expression std::map, std::string>, Expression*> remoteAccess; std::map> reduction; std::map>> reductionLoc; public: ParallelDirective() : arrayRef(NULL), arrayRef2(NULL) { } ParallelDirective(const ParallelDirective ©From) : Directive(copyFrom) { parallel = copyFrom.parallel; on = copyFrom.on; on2 = copyFrom.on2; arrayRef = copyFrom.arrayRef; arrayRef2 = copyFrom.arrayRef2; privates = copyFrom.privates; shadowRenew = copyFrom.shadowRenew; shadowRenewShifts = copyFrom.shadowRenewShifts; across = copyFrom.across; acrossShifts = copyFrom.acrossShifts; remoteAccess = copyFrom.remoteAccess; reduction = copyFrom.reduction; reductionLoc = copyFrom.reductionLoc; cloneOfTemplate = copyFrom.cloneOfTemplate; } //for F_LANG; Directive* genDirective(File *file, const std::vector> &distribution, LoopGraph* currLoop, DIST::GraphCSR &reducedG, DIST::Arrays &allArrays, const uint64_t regionId, const std::map> &arrayLinksByFuncCalls); friend ParallelDirective* operator+(const ParallelDirective &first, const ParallelDirective &second); ~ParallelDirective() { parallel.clear(); on.clear(); privates.clear(); shadowRenew.clear(); across.clear(); acrossShifts.clear(); reduction.clear(); reductionLoc.clear(); remoteAccess.clear(); } private: std::string genBounds(std::pair, std::vector>> &shadowOp, std::vector> &shadowOpShift, DIST::GraphCSR &reducedG, DIST::Arrays &allArrays, DIST::Array* shadowArray, std::map>& remoteRegularReads, const std::map, std::vector>> &readOps, const bool isAcross, const uint64_t regionId, const std::vector> &distribution, std::set &arraysInAcross, std::vector, int>> &shiftsByAccess, const std::map> &arrayLinksByFuncCalls) const; std::string genBoundsNoDist(std::pair, std::vector>>& shadowOp, std::vector>& shadowOpShift, DIST::Array* currArray, const std::map, std::vector>>& readOps, std::set& arraysInAcross, std::vector, int>>& shiftsByAccess, const std::map>& arrayLinksByFuncCalls) const; }; std::string genStringExpr(const std::string &letter, const std::pair expr); std::pair convertDigitToPositive(const int digit);