PQL: A Purely-Declarative Java Extension for Parallel Programming - - PowerPoint PPT Presentation

pql a purely declarative java extension for parallel
SMART_READER_LITE
LIVE PREVIEW

PQL: A Purely-Declarative Java Extension for Parallel Programming - - PowerPoint PPT Presentation

PQL: A Purely-Declarative Java Extension for Parallel Programming Christoph Reichenbach 1 , 2 , Yannis Smaragdakis 1 , 3 , Neil Immerman 1 1: University of Massachusetts, Amherst 2: Goethe University Frankfurt 3: University of Athens 1 W RITING


slide-1
SLIDE 1

PQL: A Purely-Declarative Java Extension for Parallel Programming

Christoph Reichenbach1,2, Yannis Smaragdakis1,3, Neil Immerman1

1: University of Massachusetts, Amherst 2: Goethe University Frankfurt 3: University of Athens

1

slide-2
SLIDE 2

WRITING PARALLEL PROGRAMS IS HARD

  • locking
  • races
  • side effect order
  • consistency models
  • distributing computations

. . .

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

2

slide-3
SLIDE 3

EASIER PARALLELISM

Approach Problems User actions map-reduce

  • emb. parallel + aggregation

split computation fork-join divide-and-conquer (recursively) divide up problem PLINQ SQL-like, over containers tag parallel steps Pregel graph algorithms split into graph compu- tations, -mutations

Frameworks for manual parallelisation

Casual parallelism: fully automatic

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

3

slide-4
SLIDE 4

CASUAL PARALLELISM

  • Pitfalls:

– Side effects – Order dependency Declarative language

Specify the ‘what’, not the ‘how’

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

4

slide-5
SLIDE 5

PQL/JAVA

  • Declarative extension to Java:

Parallel Query Language

  • Fully automatic parallelisation
  • Processes and builds Java containers

Java PQL PQL

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

5

slide-6
SLIDE 6

PQL/JAVA

  • Declarative extension to Java:

Parallel Query Language

  • Fully automatic parallelisation
  • Processes and builds Java containers

Java for sequential code, PQL for parallel code

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

6

slide-7
SLIDE 7

PQL EXAMPLE DocRepository doc doc . . . doc doc search_terms contains all ? results query (Set.contains(doc)): DocRepository.getAll().contains(doc) && forall x: doc.contains(search_terms[x]);

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

7

slide-8
SLIDE 8

WHAT RICH LANGUAGE GIVES US CASUAL PARALLELISM?

  • Embarrassingly parallel:

Executable in O(1) with enough CPUs

  • Result from Descriptive Complexity:

This language is precisely First-Order Logica

Using O(n3) cores may be a bit much...

aif we assume a polynomial number of CPUs

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

8

slide-9
SLIDE 9

MAKING FIRST-ORDER LOGIC MORE USEFUL

  • Assert or compute results:

– Finite set comprehension – SQL-style queries (minus aggregation, ordering) x ∃y.a[x] = b[y]

true 1 false 2 false 3 true . . . . . .

⇒ {0, 3, . . .}

representation:

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

9

slide-10
SLIDE 10

ADDING REDUCTION reduce(add) x over i: x == a[i]

  • log-parallel performance
  • user-supplied reductors

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

10

slide-11
SLIDE 11

PQL OVERVIEW

  • +, −, . . . , ?:, ==, instanceof, &&, ||, −>
  • forall , exists
  • Java expressions as constants
  • m[k], m.get(k), c.length, c.size(), s.contains(e)
  • Container construction:

– query (Set.contains(int x)): ... – query (Array[x] == float f): ... – query (Map.get(String s) == int i [default v]): ...

  • reduce(sumInt) int x [ over y ]: ...

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

11

slide-12
SLIDE 12

MORE PQL EXAMPLES assert forall Node n: sorted_list.contains(n) −> n.prev.value <= n.value;

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

12

slide-13
SLIDE 13

MORE PQL EXAMPLES

  • Check sortedness of list

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

13

slide-14
SLIDE 14

MORE PQL EXAMPLES

  • Check sortedness of list

Set<Item> intersection = query (Set.get(Item element)): set0.contains(element) && set1.contains(element) && !element.is_dead;

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

14

slide-15
SLIDE 15

MORE PQL EXAMPLES

  • Check sortedness of list
  • Set intersection together with filtering

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

15

slide-16
SLIDE 16

MORE PQL EXAMPLES

  • Check sortedness of list
  • Set intersection together with filtering

query (Map.get(employee) == double bonus): employees.contains(employee) && bonus == employee.dept.bonus_factor ∗ (reduce(sumDouble) v: exists Bonus b: employee.bonusSet.contains(b) && v == b.bonus_base);

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

16

slide-17
SLIDE 17

MORE PQL EXAMPLES

  • Check sortedness of list
  • Set intersection together with filtering
  • Employee bonus table

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

17

slide-18
SLIDE 18

MORE PQL EXAMPLES

  • Check sortedness of list
  • Set intersection together with filtering
  • Employee bonus table

dot_product = reduce(add) x over y: x == a[y] ∗ b[y];

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

18

slide-19
SLIDE 19

MORE PQL EXAMPLES

  • Check sortedness of list
  • Set intersection together with filtering
  • Employee bonus table
  • Vector dot product

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

19

slide-20
SLIDE 20

MORE PQL EXAMPLES

  • Check sortedness of list
  • Set intersection together with filtering
  • Employee bonus table
  • Vector dot product

query (Map.find(value) == keyset default new PSet()): keyset == query (Set.contains(key)): m.get(key) == value;

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

20

slide-21
SLIDE 21

MORE PQL EXAMPLES

  • Check sortedness of list
  • Set intersection together with filtering
  • Employee bonus table
  • Vector dot product
  • Invert map

. . .

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

21

slide-22
SLIDE 22

REALISTIC PQL EXAMPLE DocRepository doc doc doc . . .

far out in the uncharted backwaters of the . . . it was abright cold day in april . far

  • ut

in the 1 1 2 1 . . .

results

the ✄ ✂

count

DocRepository.getAll().contains(doc) &

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

22

slide-23
SLIDE 23

REALISTIC PQL EXAMPLE DocRepository doc doc doc . . .

far out in the uncharted backwaters of the . . . it was abright cold day in april . far

  • ut

in the 1 1 2 1 . . .

results

in ✄ ✂

count

DocRepository.getAll().contains(doc) &

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

23

slide-24
SLIDE 24

REALISTIC PQL EXAMPLE DocRepository doc doc doc . . .

far out in the uncharted backwaters of the . . . it was abright cold day in april . far

  • ut

in the 1 1 2 1 . . .

results

✄ ✂

count

query (Map.get(int word_id) == int wcount default 0): wcount == reduce(sum) 1 over doc: DocRepository.getAll().contains(doc) && exists i: doc.words[i] == word_id;

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

24

slide-25
SLIDE 25

IMPLEMENTATION

  • Extension to javac 1.6:

– PQL to relations – Access path selection / Query scheduling – Optimisation – Code generation

  • Run-time library support:

– parallel execution

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

25

slide-26
SLIDE 26

✄ ✂

  • Gen. relational IL

Query ordering Optimisation Code generation

EXAMPLE reduce(max) int x: a[x] > 0 Int(x) Translation into relational IL

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

26

slide-27
SLIDE 27

✄ ✂

  • Gen. relational IL

Query ordering Optimisation Code generation

EXAMPLE reduce(max) int x: a[x] > 0 Int(x) ArraySub(a, x, t0) Translation into relational IL

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

27

slide-28
SLIDE 28

✄ ✂

  • Gen. relational IL

Query ordering Optimisation Code generation

EXAMPLE reduce(max) int x: a[x] > 0 Int(x) ArraySub(a, x, t0) GT(t0, 0) Translation into relational IL

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

28

slide-29
SLIDE 29

✄ ✂

  • Gen. relational IL

Query ordering Optimisation Code generation

EXAMPLE reduce(max) int x: a[x] > 0 Int(x) ArraySub(a, x, t0) GT(t0, 0)

Unordered!

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

29

slide-30
SLIDE 30
  • Gen. relational IL

✞ ✝ ☎ ✆

Query ordering Optimisation Code generation

EXAMPLE reduce(max) int x: a[x] > 0 Int(xw) ArraySub(ar, xr, t0w) GT(t0r, 0)

Order #1: Must iterate over 232 values!

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

30

slide-31
SLIDE 31
  • Gen. relational IL

✞ ✝ ☎ ✆

Query ordering Optimisation Code generation

EXAMPLE reduce(max) int x: a[x] > 0 ArraySub(ar, xw, t0w) Int(xr) GT(t0r, 0)

Order #2: Iterate over a.length values

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

31

slide-32
SLIDE 32
  • Gen. relational IL

Query ordering

✞ ✝ ☎ ✆

Optimisation Code generation

EXAMPLE reduce(max) int x: a[x] > 0 ArraySub(ar, xw, t0w) Int(x) GT(t0r, 0)

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

32

slide-33
SLIDE 33
  • Gen. relational IL

Query ordering Optimisation

✞ ✝ ☎ ✆

Code generation

EXAMPLE x for (x = 0; x < a.length; x++) { t_0 = a[x]; if (t_0 > 0) // signal success at x }

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

33

slide-34
SLIDE 34
  • Gen. relational IL

Query ordering Optimisation

✞ ✝ ☎ ✆

Code generation

EXAMPLE x for (x =

✞ ✝ ☎ ✆

start ; x <

✞ ✝ ☎ ✆

stop ; x++) { t_0 = a[x]; if (t_0 > 0) // signal success at x } } void runWorker(int start, int stop) {

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

34

slide-35
SLIDE 35

PARALLEL EXECUTION MODEL: TREE JOIN

Core 0 Core 1 Core 2 Core 3 Core 4 Core 5 Core 6 Core 7 runWorker max max max

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

35

slide-36
SLIDE 36

PERFORMANCE

  • Benchmarks:

– bonus: Salary computation – threegrep: String pattern search – wordcount: Word frequency aggregation in documents – webgraph: One-hop self-references in web graphs

  • Hardware:

– Intel Xeon 6×2 threads, 2.67 GHz, 24 GB RAM – Sun UltraSPARC 16×4 threads, 1.17 GHz, 32 GB RAM

  • Methodology:

– For each configuration: 3 warmup runs, 10 eval runs

  • Running stock Sun JVM 1.6 with 2 GB Heap

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

36

slide-37
SLIDE 37

PERFORMANCE RESULTS: WORDCOUNT ON INTEL XEON

✂ ✁
  • ✄✁
✄ ☎ ✆ ✂ ✄ ✝ ✞✟✠ ✡ ✞ ☛ ☞ ✌ ✍ ✎ ✏ ✍ ✑ ✟ ✑✒ ✓ ✑ ☞ ☛ ✑ ✏ ✓ ✑ ☞ ☛ ✑✏

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

37

slide-38
SLIDE 38

PERFORMANCE RESULTS: WORDCOUNT ON ULTRASPARC

✄ ✆ ✝ ✂ ✞ ☎✄ ✞ ✆ ✟ ✠✡☛ ☞ ✠ ✌ ✍ ✎ ✏ ✑ ✒ ✏ ✓ ✡ ✓✔ ✕ ✓ ✍ ✌ ✓✒ ✕ ✓ ✍ ✌ ✓✒

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

38

slide-39
SLIDE 39

PERFORMANCE RESULTS: WEBGRAPH ON INTEL XEON

  • ✂✁
  • ✄✁
☎ ✁
✂ ✄ ✆ ✝ ✂✄ ✞ ✟ ✠ ✡ ☛☞✌ ✍ ✌ ✎ ✏ ✌ ☞☛☞ ✑ ✒ ☞ ✓ ✔ ☞ ✏ ✒ ☞ ✓ ✔ ☞ ✏

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

39

slide-40
SLIDE 40

PERFORMANCE RESULTS: WEBGRAPH ON ULTRASPARC

  • ✂✁
  • ✄✁
  • ☎✁
✄ ✆ ✝ ✂ ✞ ☎✄ ✞ ✆ ✟ ✠ ✡ ☛ ☞✌✍ ✎ ✍ ✏ ✑ ✍ ✌☞✌ ✒ ✓ ✌ ✔ ✕ ✌ ✑ ✓ ✌ ✔ ✕ ✌ ✑

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

40

slide-41
SLIDE 41

PERFORMANCE RESULTS: BONUS ON INTEL

✞ ✟
✁ ✁ ✂ ☎ ✝ ✁ ✂ ✡ ☛ ☞ ✌ ✍ ✎ ✏ ✑ ✎ ✒✓✒✔ ✕ ✒ ☞ ✌ ✒ ✑ ✕ ✒ ☞ ✌ ✒✑

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

41

slide-42
SLIDE 42

EXISTING APPROACHES FOR JAVA

  • SQL via JDBC: Similar queries, separate heap
  • Hadoop: Java Map-Reduce framework

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

42

slide-43
SLIDE 43

COMPARISON TO SQL AND HADOOP

Communication overhead

(At

1 10 of the usual benchmark size)

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

43

slide-44
SLIDE 44

CONCISENESS Total lines of code (including Java boilerplate):

benchmark manual manual- parallel Hadoop SQL PQL bonus 9 50 130 48 8 threegrep 9 46 60 21 6 webgraph 13 50 105 39 4 wordcount 8 98 93 38 4 PQL implementations are concise

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

44

slide-45
SLIDE 45

WHAT THIS TALK DIDN’T COVER

  • Intermediate language design
  • Type inference
  • Domain inference:

forall x: a[x] == b[x]: which x to check?

  • More optimisations

Check the paper for details!

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

45

slide-46
SLIDE 46

SUMMARY PQL/Java adds casual parallelism to Java through:

  • Declarative query semantics
  • Automatic parallelisation
  • Strong parallel performance

Available at http://creichen.net/pql (soon!)

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

46

slide-47
SLIDE 47

Backup Slides

slide-48
SLIDE 48

PERFORMANCE RESULTS: INTEL

  • ✆✁
  • ✆✂
✁ ✂ ✄ ✆✁ ✝ ✞ ✟✠ ✠ ✡ ✟✠ ☛ ☛ ☞ ✌ ☛ ✍ ✟ ✍✎ ✏ ✍ ✑ ✒ ✍ ✌ ✏ ✍ ✑ ✒ ✍✌
✞ ✟
✁ ✁ ✂ ☎ ✝ ✁ ✂ ✡ ☛ ☞ ✌ ✍ ✎ ✏ ✑ ✎ ✒✓✒✔ ✕ ✒ ☞ ✌ ✒ ✑ ✕ ✒ ☞ ✌ ✒✑
  • ✂✁
  • ✄✁
☎ ✁
✂ ✄ ✆ ✝ ✂✄ ✞ ✟ ✠ ✡ ☛☞✌ ✍ ✌ ✎ ✏ ✌ ☞☛☞ ✑ ✒ ☞ ✓ ✔ ☞ ✏ ✒ ☞ ✓ ✔ ☞ ✏
✂ ✁
  • ✄✁
✄ ☎ ✆ ✂ ✄ ✝ ✞✟✠ ✡ ✞ ☛ ☞ ✌ ✍ ✎ ✏ ✍ ✑ ✟ ✑✒ ✓ ✑ ☞ ☛ ✑ ✏ ✓ ✑ ☞ ☛ ✑✏

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

48

slide-49
SLIDE 49

PERFORMANCE RESULTS: SPARC

  • ✆✁
✁ ✂ ☎ ✆ ✄ ✝✁ ✄ ✂ ✞ ✟ ✠✡ ✡ ☛ ✠✡ ☞ ☞ ✌ ✍ ☞ ✎ ✠ ✎✏ ✑ ✎ ✒ ✓ ✎ ✍ ✑ ✎ ✒ ✓ ✎✍
  • ✆✁
✁ ✂ ☎ ✆ ✄ ✝✁ ✄ ✂ ✞ ✟✠ ✡ ☛ ☞ ✌ ✍ ☞ ✎✏✎✑ ✒ ✎ ✠ ✡ ✎ ✍ ✒ ✎ ✠ ✡ ✎✍
  • ✂✁
  • ✄✁
  • ☎✁
✄ ✆ ✝ ✂ ✞ ☎✄ ✞ ✆ ✟ ✠ ✡ ☛ ☞✌✍ ✎ ✍ ✏ ✑ ✍ ✌☞✌ ✒ ✓ ✌ ✔ ✕ ✌ ✑ ✓ ✌ ✔ ✕ ✌ ✑
✄ ✆ ✝ ✂ ✞ ☎✄ ✞ ✆ ✟ ✠✡☛ ☞ ✠ ✌ ✍ ✎ ✏ ✑ ✒ ✏ ✓ ✡ ✓✔ ✕ ✓ ✍ ✌ ✓✒ ✕ ✓ ✍ ✌ ✓✒

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

49

slide-50
SLIDE 50

JAVA INTEGRATION: GRAPH REACHABILITY

n0 n1 n2 n3 new_edges = query(Map.find(from_node) == to_node): !all_edges[from_node].contains(to_node) // new edge && exists Node inter_node: all_edges[from_node].contains(inter_node) && new_edges[inter_node].contains(to_node);

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

50

slide-51
SLIDE 51

JAVA INTEGRATION: GRAPH REACHABILITY

public Map<Node, Set<Node>> transitiveClosure(Map edges) { Map<Node, Set<Node>> all_edges = edges.clone(); Map<Node, Set<Node>> new_edges = edges; while (!new_edges.empty()) { new_edges = query(Map.find(from_node) == to_node): !all_edges[from_node].contains(to_node) // new edge && exists Node inter_node: all_edges[from_node].contains(inter_node) && new_edges[inter_node].contains(to_node); all_edges.putAll(new_edges); } return all_edges; }

PQL: PARALLEL QUERIES FOR JAVA

  • C. REICHENBACH, Y. SMARAGDAKIS, N. IMMERMAN (UMASS)

51