Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RD-10562 Implement OSR for iterators #352

Closed
wants to merge 40 commits into from
Closed
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
0c55576
updated aggregations
alexzerntev Feb 4, 2024
5046dfd
Headers
alexzerntev Feb 4, 2024
d04e19d
Finished joins
alexzerntev Feb 4, 2024
e5f17f0
Fixed tests
alexzerntev Feb 4, 2024
b6b4a35
Finished List OSR
alexzerntev Feb 4, 2024
bddc1cf
Added compilation finals
alexzerntev Feb 4, 2024
1fa3144
Finished iterables
alexzerntev Feb 5, 2024
f0d0335
Finished json reader
alexzerntev Feb 5, 2024
7131a7c
Merge remote-tracking branch 'origin/main' into RD-10562-implement-os…
alexzerntev Feb 15, 2024
4e3d069
Updated some OSR nodes according to comments
alexzerntev Feb 15, 2024
0efd125
finished list OSR
alexzerntev Feb 16, 2024
e376168
Updated compute next
alexzerntev Feb 16, 2024
4325af9
format
alexzerntev Feb 16, 2024
e6ea58c
Updated compute next
alexzerntev Feb 16, 2024
4db112c
Fix
alexzerntev Feb 16, 2024
bae21c9
Fix
alexzerntev Feb 16, 2024
6827dc0
Fix
alexzerntev Feb 16, 2024
61863b9
Fix
alexzerntev Feb 16, 2024
66ff36b
fixes
alexzerntev Feb 16, 2024
a471176
test
alexzerntev Feb 17, 2024
e54533e
fix
alexzerntev Feb 17, 2024
a9f0673
fix
alexzerntev Feb 17, 2024
a82c9fc
wip
alexzerntev Feb 17, 2024
637cbb4
wip
alexzerntev Feb 17, 2024
41d966b
added std deviation to metrics
alexzerntev Feb 18, 2024
8a05a1d
Added multirun
alexzerntev Feb 20, 2024
cd384cf
fixed filter OSR to use frame
alexzerntev Feb 20, 2024
499dca6
added osr Auxiliary slots
alexzerntev Feb 21, 2024
c72a0a2
Applied frame changes
alexzerntev Feb 21, 2024
bf96ff7
wip
alexzerntev Feb 24, 2024
d7b1dbc
finished lists
alexzerntev Feb 25, 2024
bddc147
wip
alexzerntev Feb 25, 2024
39922d6
finished OSR
alexzerntev Feb 26, 2024
f7ba5b4
fixed test
alexzerntev Feb 27, 2024
f3b117e
updated slots
alexzerntev Feb 27, 2024
c74d453
metrics
alexzerntev Mar 3, 2024
98e5020
Merge remote-tracking branch 'origin/main' into RD-10562-implement-os…
alexzerntev Mar 4, 2024
ac9af7e
metrics
alexzerntev Mar 4, 2024
e9d6a13
improvement
alexzerntev Mar 5, 2024
a62e98b
metrics
alexzerntev Mar 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ trait CollectionRangeTest extends CompilerTestContext {
test("""Long.Range(0, 10)""")(_ should evaluateTo("[0L,1L,2L,3L,4L,5L,6L,7L,8L,9L]"))
test("""Long.Range(0, 1)""")(_ should evaluateTo("[0L]"))

test("""Collection.Filter(Long.Range(0, 1000000), x -> x == 999999)""")(
_ should evaluateTo("Collection.Build(999999L)")
)

// end = start
test("""Long.Range(0, 0)""")(_ should evaluateTo("[]"))
test("""Long.Range(12, 12)""")(_ should evaluateTo("[]"))
Expand Down
8 changes: 6 additions & 2 deletions snapi-truffle/src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -303,8 +303,6 @@

exports raw.runtime.truffle;
exports raw.runtime.truffle.boundary;
exports raw.runtime.truffle.runtime.aggregation;
exports raw.runtime.truffle.runtime.aggregation.aggregator;
exports raw.runtime.truffle.runtime.record;
exports raw.runtime.truffle.runtime.operators;
exports raw.runtime.truffle.runtime.function;
Expand All @@ -330,6 +328,7 @@
.abstract_generator
.compute_next
.operations;
exports raw.runtime.truffle.runtime.generator.collection.abstract_generator.compute_next.osr;
exports raw.runtime.truffle.runtime.generator.collection.off_heap_generator.record_shaper;
exports raw.runtime.truffle.runtime.generator.collection.off_heap_generator.input_buffer;
exports raw.runtime.truffle.runtime.generator.collection.off_heap_generator.off_heap;
Expand All @@ -340,6 +339,7 @@
exports raw.runtime.truffle.runtime.iterable.operations;
exports raw.runtime.truffle.runtime.iterable.list;
exports raw.runtime.truffle.runtime.iterable.sources;
exports raw.runtime.truffle.runtime.iterable.osr;
exports raw.runtime.truffle.runtime.kryo;
exports raw.runtime.truffle.utils;
exports raw.runtime.truffle.ast;
Expand All @@ -348,6 +348,7 @@
exports raw.runtime.truffle.ast.io.jdbc;
exports raw.runtime.truffle.ast.io.json.reader;
exports raw.runtime.truffle.ast.io.json.reader.parser;
exports raw.runtime.truffle.ast.io.json.reader.parser.osr;
exports raw.runtime.truffle.ast.io.json.writer;
exports raw.runtime.truffle.ast.io.json.writer.internal;
exports raw.runtime.truffle.ast.io.csv.reader;
Expand All @@ -358,7 +359,9 @@
exports raw.runtime.truffle.ast.local;
exports raw.runtime.truffle.ast.expressions.unary;
exports raw.runtime.truffle.ast.expressions.iterable.collection;
exports raw.runtime.truffle.ast.expressions.iterable.collection.osr;
exports raw.runtime.truffle.ast.expressions.iterable.list;
exports raw.runtime.truffle.ast.expressions.iterable.list.osr;
exports raw.runtime.truffle.ast.expressions.record;
exports raw.runtime.truffle.ast.expressions.option;
exports raw.runtime.truffle.ast.expressions.function;
Expand Down Expand Up @@ -387,6 +390,7 @@
exports raw.runtime.truffle.ast.expressions.builtin.string_package;
exports raw.runtime.truffle.ast.expressions.builtin.location_package;
exports raw.runtime.truffle.ast.expressions.builtin.binary_package;
exports raw.runtime.truffle.ast.expressions.aggregation;
exports raw.runtime.truffle.ast.controlflow;
exports raw.runtime.truffle.runtime.exceptions.validation;
exports raw.compiler.snapi.truffle.compiler;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionCountNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;

public class TruffleCountCollectionEntry extends CountCollectionEntry
implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return CollectionCountNodeGen.create(args.get(0).exprNode());
return new AggregateSingleNode(args.get(0).exprNode(), Aggregations.COUNT);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import java.util.List;
import raw.compiler.base.source.Type;
import raw.compiler.rql2.builtin.ExistsCollectionEntry;
import raw.compiler.rql2.source.FunType;
import raw.compiler.snapi.truffle.TruffleArg;
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
Expand All @@ -26,8 +25,6 @@ public class TruffleExistsCollectionEntry extends ExistsCollectionEntry
implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
FunType funType = (FunType) args.get(1).type();

return CollectionExistsNodeGen.create(args.get(0).exprNode(), args.get(1).exprNode());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionLastNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;

public class TruffleLastCollectionEntry extends LastCollectionEntry
implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return CollectionLastNodeGen.create(args.get(0).exprNode());
return new AggregateSingleNode(args.get(0).exprNode(), Aggregations.LAST);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionMaxNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;

public class TruffleMaxCollectionEntry extends MaxCollectionEntry implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return CollectionMaxNodeGen.create(args.get(0).exprNode());
return new AggregateSingleNode(args.get(0).exprNode(), Aggregations.MAX);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionMinNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;

public class TruffleMinCollectionEntry extends MinCollectionEntry implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return CollectionMinNodeGen.create(args.get(0).exprNode());
return new AggregateSingleNode(args.get(0).exprNode(), Aggregations.MIN);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionSumNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;

public class TruffleSumCollectionEntry extends SumCollectionEntry implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return CollectionSumNodeGen.create(args.get(0).exprNode());
return new AggregateSingleNode(args.get(0).exprNode(), Aggregations.SUM);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionTupleAvgNodeGen;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionTupleAvgNode;

public class TruffleTupleAvgCollectionEntry extends TupleAvgCollectionEntry
implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return CollectionTupleAvgNodeGen.create(args.get(0).exprNode());
return new CollectionTupleAvgNode(args.get(0).exprNode());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import java.util.List;
import raw.compiler.base.source.Type;
import raw.compiler.rql2.builtin.FilterListEntry;
import raw.compiler.rql2.source.Rql2ListType;
import raw.compiler.rql2.source.Rql2Type;
import raw.compiler.snapi.truffle.TruffleArg;
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
Expand All @@ -24,6 +26,8 @@
public class TruffleFilterListEntry extends FilterListEntry implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return ListFilterNodeGen.create(args.get(0).exprNode(), args.get(1).exprNode());
Rql2ListType listType = (Rql2ListType) type;
return ListFilterNodeGen.create(
args.get(0).exprNode(), args.get(1).exprNode(), (Rql2Type) listType.innerType());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,14 @@
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.list.ListMaxNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionFromNodeGen;

public class TruffleMaxListEntry extends MaxListEntry implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return ListMaxNodeGen.create(args.get(0).exprNode());
return new AggregateSingleNode(
CollectionFromNodeGen.create(args.get(0).exprNode()), Aggregations.MAX);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,14 @@
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.list.ListMinNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionFromNodeGen;

public class TruffleMinListEntry extends MinListEntry implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return ListMinNodeGen.create(args.get(0).exprNode());
return new AggregateSingleNode(
CollectionFromNodeGen.create(args.get(0).exprNode()), Aggregations.MIN);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,14 @@
import raw.compiler.snapi.truffle.TruffleEntryExtension;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.expressions.iterable.list.ListSumNodeGen;
import raw.runtime.truffle.ast.expressions.aggregation.AggregateSingleNode;
import raw.runtime.truffle.ast.expressions.aggregation.Aggregations;
import raw.runtime.truffle.ast.expressions.iterable.collection.CollectionFromNodeGen;

public class TruffleSumListEntry extends SumListEntry implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
return ListSumNodeGen.create(args.get(0).exprNode());
return new AggregateSingleNode(
CollectionFromNodeGen.create(args.get(0).exprNode()), Aggregations.SUM);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* Copyright 2023 RAW Labs S.A.
*
* Use of this software is governed by the Business Source License
* included in the file licenses/BSL.txt.
*
* As of the Change Date specified in that file, in accordance with
* the Business Source License, use of this software will be governed
* by the Apache License, Version 2.0, included in the file
* licenses/APL.txt.
*/

package raw.runtime.truffle.ast.expressions.aggregation;

import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.LoopNode;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException;
import raw.runtime.truffle.runtime.generator.collection.GeneratorNodes;
import raw.runtime.truffle.runtime.generator.collection.GeneratorNodesFactory;
import raw.runtime.truffle.runtime.iterable.IterableNodes;
import raw.runtime.truffle.runtime.iterable.IterableNodesFactory;
import raw.runtime.truffle.runtime.primitives.ErrorObject;

public class AggregateMultipleNode extends ExpressionNode {

@Child ExpressionNode iterableNode;

@Child private LoopNode loop;

@Child
GeneratorNodes.GeneratorInitNode initNode = GeneratorNodesFactory.GeneratorInitNodeGen.create();

@Child
GeneratorNodes.GeneratorCloseNode closeNode =
GeneratorNodesFactory.GeneratorCloseNodeGen.create();

@Child
private GeneratorNodes.GeneratorHasNextNode hasNextNode =
GeneratorNodesFactory.GeneratorHasNextNodeGen.create();

@Child
IterableNodes.GetGeneratorNode getGeneratorNode =
IterableNodesFactory.GetGeneratorNodeGen.create();

@Child AggregatorNodes.Zero zeroNode = AggregatorNodesFactory.ZeroNodeGen.create();

private final byte[] aggregationTypes;

public AggregateMultipleNode(ExpressionNode iterableNode, byte[] aggregationTypes) {
this.iterableNode = iterableNode;
loop = Truffle.getRuntime().createLoopNode(new OSRMultiAggregationNode(aggregationTypes));
this.aggregationTypes = aggregationTypes;
}

@Override
public Object executeGeneric(VirtualFrame virtualFrame) {
Object generator = getGeneratorNode.execute(this, iterableNode.executeGeneric(virtualFrame));
try {
initNode.execute(this, generator);
Object[] results = new Object[aggregationTypes.length];
for (int i = 0; i < aggregationTypes.length; i++) {
results[i] = zeroNode.execute(this, aggregationTypes[i]);
}
if (!hasNextNode.execute(this, generator)) {
return results;
}
OSRMultiAggregationNode OSRNode = (OSRMultiAggregationNode) loop.getRepeatingNode();
OSRNode.init(generator, results);
loop.execute(virtualFrame);
return OSRNode.getResults();
} catch (RawTruffleRuntimeException e) {
return new ErrorObject(e.getMessage());
} finally {
closeNode.execute(this, generator);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
* Copyright 2023 RAW Labs S.A.
*
* Use of this software is governed by the Business Source License
* included in the file licenses/BSL.txt.
*
* As of the Change Date specified in that file, in accordance with
* the Business Source License, use of this software will be governed
* by the Apache License, Version 2.0, included in the file
* licenses/APL.txt.
*/

package raw.runtime.truffle.ast.expressions.aggregation;

import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.LoopNode;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException;
import raw.runtime.truffle.runtime.generator.collection.GeneratorNodes;
import raw.runtime.truffle.runtime.generator.collection.GeneratorNodesFactory;
import raw.runtime.truffle.runtime.iterable.IterableNodes;
import raw.runtime.truffle.runtime.iterable.IterableNodesFactory;
import raw.runtime.truffle.runtime.primitives.ErrorObject;

public class AggregateSingleNode extends ExpressionNode {

@Child ExpressionNode iterableNode;

@Child private LoopNode loop;

@Child
GeneratorNodes.GeneratorInitNode initNode = GeneratorNodesFactory.GeneratorInitNodeGen.create();

@Child
GeneratorNodes.GeneratorCloseNode closeNode =
GeneratorNodesFactory.GeneratorCloseNodeGen.create();

@Child
private GeneratorNodes.GeneratorHasNextNode hasNextNode =
GeneratorNodesFactory.GeneratorHasNextNodeGen.create();

@Child
IterableNodes.GetGeneratorNode getGeneratorNode =
IterableNodesFactory.GetGeneratorNodeGen.create();

@Child AggregatorNodes.Zero zeroNode = AggregatorNodesFactory.ZeroNodeGen.create();

private final byte aggregationType;

public AggregateSingleNode(ExpressionNode iterableNode, byte aggregationType) {
this.iterableNode = iterableNode;
loop = Truffle.getRuntime().createLoopNode(new OSRSingleAggregationNode(aggregationType));
this.aggregationType = aggregationType;
}

@Override
public Object executeGeneric(VirtualFrame virtualFrame) {
Object generator = getGeneratorNode.execute(this, iterableNode.executeGeneric(virtualFrame));
try {
initNode.execute(this, generator);
if (!hasNextNode.execute(this, generator)) {
return zeroNode.execute(this, aggregationType);
}
Object result = zeroNode.execute(this, aggregationType);
OSRSingleAggregationNode OSRNode = (OSRSingleAggregationNode) loop.getRepeatingNode();
OSRNode.init(generator, result);
loop.execute(virtualFrame);
return OSRNode.getResult();
} catch (RawTruffleRuntimeException e) {
return new ErrorObject(e.getMessage());
} finally {
closeNode.execute(this, generator);
}
}
}
Loading
Loading