1 #ifndef CPPAD_CG_ATOMIC_DEPENDENCY_LOCATOR_INCLUDED 2 #define CPPAD_CG_ATOMIC_DEPENDENCY_LOCATOR_INCLUDED 34 std::set<std::pair<size_t, size_t>>
sizes;
53 std::map<size_t, AtomicUseInfo<Base>> atomicInfo_;
54 std::map<OperationNode<Base>*, std::set<size_t> > indeps_;
62 inline const std::map<size_t, AtomicUseInfo<Base>>& findAtomicsUsage() {
63 if (!atomicInfo_.empty()) {
67 size_t m = fun_.Range();
68 size_t n = fun_.Domain();
70 std::vector<CG<Base> > x(n);
74 assert(x.size() == 0 || (x[0].getOperationNode()->getHandlerPosition() == 0 && x[x.size() - 1].getOperationNode()->getHandlerPosition() == x.size() - 1));
76 std::vector<CG<Base> > dep = fun_.Forward(0, x);
78 for (
size_t i = 0; i < m; i++) {
79 findAtomicsUsage(dep[i].getOperationNode());
83 for (
auto& pair: atomicInfo_) {
84 size_t id = pair.first;
86 pair.second.atom = regAtomics.at(
id);
96 return std::set<size_t>();
99 if (op == CGOpCode::Inv) {
100 std::set<size_t> indeps;
106 if (handler_.isVisited(*node)) {
108 return indeps_.at(node);
111 handler_.markVisited(*node);
113 std::set<size_t> indeps;
114 const std::vector<Argument<Base> >& args = node->
getArguments();
115 for (
size_t a = 0; a < args.size(); a++) {
116 std::set<size_t> aindeps = findAtomicsUsage(args[a].getOperation());
117 indeps.insert(aindeps.begin(), aindeps.end());
119 indeps_[node] = indeps;
121 if (op == CGOpCode::AtomicForward) {
122 CPPADCG_ASSERT_UNKNOWN(node->
getInfo().size() > 1);
123 CPPADCG_ASSERT_UNKNOWN(node->
getArguments().size() > 1);
124 size_t id = node->
getInfo()[0];
128 CPPADCG_ASSERT_UNKNOWN(p == 0);
134 CPPADCG_ASSERT_UNKNOWN(tx !=
nullptr && tx->
getOperationType() == CGOpCode::ArrayCreation);
135 CPPADCG_ASSERT_UNKNOWN(ty !=
nullptr && ty->
getOperationType() == CGOpCode::ArrayCreation);
137 auto& info = atomicInfo_[id];
138 info.outerIndeps.insert(indeps.begin(), indeps.end());
139 info.sizes.insert(std::pair<size_t, size_t>(tx->
getArguments().size(),
CGAbstractAtomicFun< Base > * atom
const std::vector< Argument< Base > > & getArguments() const
size_t getHandlerPosition() const
CGOpCode getOperationType() const
void makeVariables(VectorCG &variables)
const std::map< size_t, CGAbstractAtomicFun< Base > *> & getAtomicFunctions() const
std::set< size_t > outerIndeps
std::set< std::pair< size_t, size_t > > sizes
const std::vector< size_t > & getInfo() const