Skip to content

Commit 44cee34

Browse files
committed
[GR-2798] Small RFFI perfm optimizations and fix in StringVectorDataPtr.
PullRequest: fastr/2481
2 parents b5b379f + cd75886 commit 44cee34

File tree

11 files changed

+67
-103
lines changed

11 files changed

+67
-103
lines changed

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/AbstractContainerLibrary.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ public RAbstractVector createEmptySameType(Object container, @SuppressWarnings("
7171
*/
7272
public abstract RAbstractContainer materialize(Object container);
7373

74+
public abstract RAbstractContainer cachedMaterialize(Object container);
75+
7476
/**
7577
* Transfers this vector to be backed by native off heap memory. The data object should then be
7678
* able to respond to {@link VectorDataLibrary#asPointer(Object)}.

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,23 @@
3131
import com.oracle.truffle.api.library.ExportLibrary;
3232
import com.oracle.truffle.api.library.ExportMessage;
3333
import com.oracle.truffle.api.library.ExportMessage.Ignore;
34-
3534
import com.oracle.truffle.api.profiles.ConditionProfile;
3635
import com.oracle.truffle.r.runtime.RRuntime;
3736
import com.oracle.truffle.r.runtime.RType;
3837
import com.oracle.truffle.r.runtime.Utils;
38+
import com.oracle.truffle.r.runtime.data.RSharingAttributeStorage.Shareable;
39+
import com.oracle.truffle.r.runtime.data.closures.RClosure;
3940
import com.oracle.truffle.r.runtime.data.closures.RClosures;
41+
import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
4042
import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
4143
import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
44+
import com.oracle.truffle.r.runtime.data.model.RAbstractVector.RMaterializedVector;
4245
import com.oracle.truffle.r.runtime.data.nodes.FastPathVectorAccess.FastPathFromComplexAccess;
4346
import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromComplexAccess;
4447
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
4548
import com.oracle.truffle.r.runtime.ops.na.NACheck;
46-
import com.oracle.truffle.r.runtime.data.RSharingAttributeStorage.Shareable;
47-
import com.oracle.truffle.r.runtime.data.closures.RClosure;
48-
import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
49-
import com.oracle.truffle.r.runtime.data.model.RAbstractVector.RMaterializedVector;
49+
5050
import java.util.Arrays;
51-
import java.util.concurrent.atomic.AtomicReference;
5251

5352
@ExportLibrary(InteropLibrary.class)
5453
@ExportLibrary(AbstractContainerLibrary.class)
@@ -406,15 +405,6 @@ public long allocateNativeContents() {
406405
}
407406
}
408407

409-
private AtomicReference<RComplexVector> materialized = new AtomicReference<>();
410-
411-
public Object cachedMaterialize() {
412-
if (materialized.get() == null) {
413-
materialized.compareAndSet(null, materialize());
414-
}
415-
return materialized.get();
416-
}
417-
418408
private static final class FastPathAccess extends FastPathFromComplexAccess {
419409

420410
FastPathAccess(RAbstractContainer value) {

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import com.oracle.truffle.r.runtime.data.model.RAbstractVector.RMaterializedVector;
4646
import com.oracle.truffle.r.runtime.data.nodes.FastPathVectorAccess.FastPathFromDoubleAccess;
4747
import java.util.Arrays;
48-
import java.util.concurrent.atomic.AtomicReference;
4948

5049
@ExportLibrary(InteropLibrary.class)
5150
@ExportLibrary(AbstractContainerLibrary.class)
@@ -371,15 +370,6 @@ public long allocateNativeContents() {
371370
}
372371
}
373372

374-
private AtomicReference<RDoubleVector> materialized = new AtomicReference<>();
375-
376-
public Object cachedMaterialize() {
377-
if (materialized.get() == null) {
378-
materialized.compareAndSet(null, materialize());
379-
}
380-
return materialized.get();
381-
}
382-
383373
private static final class FastPathAccess extends FastPathFromDoubleAccess {
384374
FastPathAccess(RAbstractContainer value) {
385375
super(value);

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
4444
import com.oracle.truffle.r.runtime.ops.na.NACheck;
4545
import java.util.Arrays;
46-
import java.util.concurrent.atomic.AtomicReference;
4746

4847
@ExportLibrary(InteropLibrary.class)
4948
@ExportLibrary(AbstractContainerLibrary.class)
@@ -388,15 +387,6 @@ public long allocateNativeContents() {
388387
}
389388
}
390389

391-
private final AtomicReference<RIntVector> materialized = new AtomicReference<>();
392-
393-
public Object cachedMaterialize() {
394-
if (materialized.get() == null) {
395-
materialized.compareAndSet(null, materialize());
396-
}
397-
return materialized.get();
398-
}
399-
400390
private static final class FastPathAccess extends FastPathFromIntAccess {
401391
FastPathAccess(RAbstractContainer value) {
402392
super(value);

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
4848
import com.oracle.truffle.r.runtime.data.model.RAbstractVector.RMaterializedVector;
4949
import java.util.Arrays;
50-
import java.util.concurrent.atomic.AtomicReference;
5150

5251
@ExportLibrary(InteropLibrary.class)
5352
@ExportLibrary(AbstractContainerLibrary.class)
@@ -385,15 +384,6 @@ public long allocateNativeContents() {
385384
}
386385
}
387386

388-
private final AtomicReference<RLogicalVector> materialized = new AtomicReference<>();
389-
390-
public Object cachedMaterialize() {
391-
if (materialized.get() == null) {
392-
materialized.compareAndSet(null, materialize());
393-
}
394-
return materialized.get();
395-
}
396-
397387
private static final class FastPathAccess extends FastPathFromLogicalAccess {
398388

399389
FastPathAccess(RAbstractContainer value) {

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import com.oracle.truffle.r.runtime.data.model.RAbstractNumericVector;
4444
import com.oracle.truffle.r.runtime.data.model.RAbstractVector.RMaterializedVector;
4545
import java.util.Arrays;
46-
import java.util.concurrent.atomic.AtomicReference;
4746

4847
@ExportLibrary(InteropLibrary.class)
4948
@ExportLibrary(AbstractContainerLibrary.class)
@@ -307,15 +306,6 @@ public long allocateNativeContents() {
307306
}
308307
}
309308

310-
private AtomicReference<RRawVector> materialized = new AtomicReference<>();
311-
312-
public Object cachedMaterialize() {
313-
if (materialized.get() == null) {
314-
materialized.compareAndSet(null, materialize());
315-
}
316-
return materialized.get();
317-
}
318-
319309
private static final class FastPathAccess extends FastPathFromRawAccess {
320310

321311
FastPathAccess(RAbstractContainer value) {

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@
4949
import com.oracle.truffle.r.runtime.ops.na.NACheck;
5050
import java.util.Arrays;
5151

52-
import java.util.concurrent.atomic.AtomicReference;
53-
5452
@ExportLibrary(InteropLibrary.class)
5553
@ExportLibrary(AbstractContainerLibrary.class)
5654
public final class RStringVector extends RAbstractAtomicVector implements RMaterializedVector, Shareable {
@@ -360,15 +358,6 @@ RStringVector containerLibCopy(@CachedLibrary(limit = DATA_LIB_LIMIT) VectorData
360358
return result;
361359
}
362360

363-
private AtomicReference<RStringVector> materialized = new AtomicReference<>();
364-
365-
public Object cachedMaterialize() {
366-
if (materialized.get() == null) {
367-
materialized.compareAndSet(null, materialize());
368-
}
369-
return materialized.get();
370-
}
371-
372361
@Override
373362
@Ignore // VectorDataLibrary
374363
public Object getDataAtAsObject(int index) {

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractContainer.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import com.oracle.truffle.r.runtime.data.VectorDataLibrary;
4444
import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
4545

46+
import java.util.concurrent.atomic.AtomicReference;
47+
4648
@ExportLibrary(AbstractContainerLibrary.class)
4749
public abstract class RAbstractContainer extends RSharingAttributeStorage {
4850

@@ -194,6 +196,16 @@ public boolean containerLibIsComplete(@CachedLibrary(limit = DATA_LIB_LIMIT) Vec
194196
return dataLib.isComplete(data);
195197
}
196198

199+
private final AtomicReference<RAbstractContainer> materialized = new AtomicReference<>();
200+
201+
@ExportMessage(name = "cachedMaterialize", library = AbstractContainerLibrary.class)
202+
public RAbstractContainer containerLibCachedMaterialize(@CachedLibrary("this") AbstractContainerLibrary containerLibrary) {
203+
if (materialized.get() == null) {
204+
materialized.compareAndSet(null, containerLibrary.materialize(this));
205+
}
206+
return materialized.get();
207+
}
208+
197209
@ExportMessage(name = "materialize", library = AbstractContainerLibrary.class)
198210
public RAbstractContainer containerLibMaterialize() {
199211
return materialize();

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/FFIMaterializeNode.java

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,24 @@
2525
import com.oracle.truffle.api.CompilerDirectives;
2626
import com.oracle.truffle.api.dsl.Fallback;
2727
import com.oracle.truffle.api.dsl.GenerateUncached;
28+
import com.oracle.truffle.api.dsl.ImportStatic;
2829
import com.oracle.truffle.api.dsl.Specialization;
2930
import com.oracle.truffle.api.interop.TruffleObject;
31+
import com.oracle.truffle.api.library.CachedLibrary;
3032
import com.oracle.truffle.api.nodes.Node;
33+
import com.oracle.truffle.r.runtime.DSLConfig;
3134
import com.oracle.truffle.r.runtime.RInternalError;
3235
import com.oracle.truffle.r.runtime.RRuntime;
3336
import com.oracle.truffle.r.runtime.context.RContext;
37+
import com.oracle.truffle.r.runtime.data.AbstractContainerLibrary;
3438
import com.oracle.truffle.r.runtime.data.NativeDataAccess;
3539
import com.oracle.truffle.r.runtime.data.RBaseObject;
3640
import com.oracle.truffle.r.runtime.data.RComplex;
37-
import com.oracle.truffle.r.runtime.data.RComplexVector;
3841
import com.oracle.truffle.r.runtime.data.RDataFactory;
39-
import com.oracle.truffle.r.runtime.data.RDoubleVector;
40-
import com.oracle.truffle.r.runtime.data.RIntVector;
41-
import com.oracle.truffle.r.runtime.data.RLogicalVector;
4242
import com.oracle.truffle.r.runtime.data.RRaw;
43-
import com.oracle.truffle.r.runtime.data.RRawVector;
4443
import com.oracle.truffle.r.runtime.data.RScalarVector;
4544
import com.oracle.truffle.r.runtime.data.RSequence;
46-
import com.oracle.truffle.r.runtime.data.RStringVector;
45+
import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
4746
import com.oracle.truffle.r.runtime.ffi.interop.NativeDoubleArray;
4847

4948
/**
@@ -54,6 +53,7 @@
5453
*
5554
* See documentation/dev/ffi.md for more details.
5655
*/
56+
@ImportStatic(DSLConfig.class)
5757
@GenerateUncached
5858
public abstract class FFIMaterializeNode extends Node {
5959

@@ -130,36 +130,11 @@ protected static Object wrap(RBaseObject value, @SuppressWarnings("unused") bool
130130
return value;
131131
}
132132

133-
@Specialization
134-
protected static Object wrap(RIntVector value, @SuppressWarnings("unused") boolean protect) {
135-
// TODO specialize only for sequences (and maybe some other)
136-
return value.cachedMaterialize();
137-
}
138-
139-
@Specialization
140-
protected static Object wrap(RDoubleVector value, @SuppressWarnings("unused") boolean protect) {
133+
@Specialization(limit = "getGenericDataLibraryCacheSize()")
134+
protected static Object wrap(RAbstractContainer value, @SuppressWarnings("unused") boolean protect,
135+
@CachedLibrary("value") AbstractContainerLibrary containerLibrary) {
141136
// TODO specialize only for sequences (and maybe some other)
142-
return value.cachedMaterialize();
143-
}
144-
145-
@Specialization
146-
protected static Object wrap(RRawVector value, @SuppressWarnings("unused") boolean protect) {
147-
return value.cachedMaterialize();
148-
}
149-
150-
@Specialization
151-
protected static Object wrap(RLogicalVector value, @SuppressWarnings("unused") boolean protect) {
152-
return value.cachedMaterialize();
153-
}
154-
155-
@Specialization
156-
protected static Object wrap(RComplexVector value, @SuppressWarnings("unused") boolean protect) {
157-
return value.cachedMaterialize();
158-
}
159-
160-
@Specialization
161-
protected static Object wrap(RStringVector value, @SuppressWarnings("unused") boolean protect) {
162-
return value.cachedMaterialize();
137+
return containerLibrary.cachedMaterialize(value);
163138
}
164139

165140
// Symbol holds the address as a field

com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/FFIWrap.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
package com.oracle.truffle.r.runtime.ffi;
2424

2525
import com.oracle.truffle.api.CompilerAsserts;
26-
import com.oracle.truffle.api.CompilerDirectives;
2726
import com.oracle.truffle.api.nodes.ExplodeLoop;
27+
import com.oracle.truffle.r.runtime.RInternalError;
2828

2929
/**
3030
*
@@ -105,7 +105,9 @@ public Object[] wrap(Object[] args, FFIMaterializeNode[] ffiMateralizeNodes, FFI
105105

106106
@Override
107107
public void close() {
108-
CompilerDirectives.materialize(materialized);
108+
if (materialized == null) {
109+
throw RInternalError.shouldNotReachHere();
110+
}
109111
}
110112
}
111113

0 commit comments

Comments
 (0)