uschindler commented on PR #12681:
URL: https://github.com/apache/lucene/pull/12681#issuecomment-1763361313

   > > This also makes this test reproducible from random seed regardless of 
the hardware, as `SPECIES_PREFERRED` is not used at all in tests. From a test 
perspective, it is like a forbidden-api.
   > 
   > I am mostly ok, but initially I stumbled on this. I was expecting that all 
tests get slow. But luckily we run tests without C2 so by default for all test 
except the one using the testMode, we use the scalar impl.
   > 
   > I'd like to add some extra safety. If the provider class detects that any 
of those properties are given at command line and at same time it is not in 
Test mode, it should scream loud in logger and use default impl. The problem is 
that Jenkins uses different GC and does not force Client mode, so it would take 
very long as all tests run using fixed bit size.
   > 
   > I have a small change to implement this, are you ok? Basically I would 
read the system props in the provider code.
   
   Here is my idea, I can commit it if you agree. It basically moves the system 
properties to the main `VectorizationProvider` (as optional). The 
`SecurityException` is also handled there.
   
   If the system properties are detected, it complains on logger and uses 
default provider, unless testMode is enabled. This leads to the following:
   - TestVectorUtilSupport uses the Panama provider
   - All other tests fallback to default provider (they do by default due to 
client VM, but on jenkins they won't be slow)
   
   ```patch
    .../vectorization/VectorizationProvider.java       | 48 
++++++++++++++++++++--
    .../vectorization/PanamaVectorUtilSupport.java     | 16 ++------
    2 files changed, 48 insertions(+), 16 deletions(-)
   
   diff --git 
a/lucene/core/src/java/org/apache/lucene/internal/vectorization/VectorizationProvider.java
 
b/lucene/core/src/java/org/apache/lucene/internal/vectorization/VectorizationProvider.java
   index 3192af72b2c..9c41b8dfa6d 100644
   --- 
a/lucene/core/src/java/org/apache/lucene/internal/vectorization/VectorizationProvider.java
   +++ 
b/lucene/core/src/java/org/apache/lucene/internal/vectorization/VectorizationProvider.java
   @@ -25,8 +25,12 @@ import java.security.AccessController;
    import java.security.PrivilegedAction;
    import java.util.Locale;
    import java.util.Objects;
   +import java.util.Optional;
   +import java.util.OptionalInt;
    import java.util.Set;
   +import java.util.function.Predicate;
    import java.util.logging.Logger;
   +import java.util.stream.Stream;
    import org.apache.lucene.util.SuppressForbidden;
    import org.apache.lucene.util.VectorUtil;
    
   @@ -39,6 +43,37 @@ import org.apache.lucene.util.VectorUtil;
     */
    public abstract class VectorizationProvider {
    
   +  static final OptionalInt TESTS_VECTOR_SIZE;
   +  static final Optional<Boolean> TESTS_FORCE_INTEGER_VECTORS;
   +
   +  static {
   +    var vs = OptionalInt.empty();
   +    try {
   +      vs =
   +          Stream.ofNullable(System.getProperty("tests.vectorsize"))
   +              .filter(Predicate.not(String::isEmpty))
   +              .mapToInt(Integer::parseInt)
   +              .findAny();
   +    } catch (
   +        @SuppressWarnings("unused")
   +        SecurityException se) {
   +      // ignored
   +    }
   +    TESTS_VECTOR_SIZE = vs;
   +    var enforce = Optional.<Boolean>empty();
   +    try {
   +      enforce =
   +          
Optional.ofNullable(System.getProperty("tests.forceintegervectors"))
   +              .filter(Predicate.not(String::isEmpty))
   +              .map(Boolean::valueOf);
   +    } catch (
   +        @SuppressWarnings("unused")
   +        SecurityException se) {
   +      // ignored
   +    }
   +    TESTS_FORCE_INTEGER_VECTORS = enforce;
   +  }
   +
      /**
       * Returns the default instance of the provider matching vectorization 
possibilities of actual
       * runtime.
   @@ -87,9 +122,16 @@ public abstract class VectorizationProvider {
                "Java vector incubator module is not readable. For optimal 
vector performance, pass '--add-modules jdk.incubator.vector' to enable Vector 
API.");
            return new DefaultVectorizationProvider();
          }
   -      if (!testMode && isClientVM()) {
   -        LOG.warning("C2 compiler is disabled; Java vector incubator API 
can't be enabled");
   -        return new DefaultVectorizationProvider();
   +      if (!testMode) {
   +        if (TESTS_VECTOR_SIZE.isPresent() || 
TESTS_FORCE_INTEGER_VECTORS.isPresent()) {
   +          LOG.warning(
   +              "Vector bitsize and/or integer vectors enforcement; using 
default vectorization provider outside of testMode");
   +          return new DefaultVectorizationProvider();
   +        }
   +        if (isClientVM()) {
   +          LOG.warning("C2 compiler is disabled; Java vector incubator API 
can't be enabled");
   +          return new DefaultVectorizationProvider();
   +        }
          }
          try {
            // we use method handles with lookup, so we do not need to deal 
with setAccessible as we
   diff --git 
a/lucene/core/src/java20/org/apache/lucene/internal/vectorization/PanamaVectorUtilSupport.java
 
b/lucene/core/src/java20/org/apache/lucene/internal/vectorization/PanamaVectorUtilSupport.java
   index dad428845b7..22ae585bd13 100644
   --- 
a/lucene/core/src/java20/org/apache/lucene/internal/vectorization/PanamaVectorUtilSupport.java
   +++ 
b/lucene/core/src/java20/org/apache/lucene/internal/vectorization/PanamaVectorUtilSupport.java
   @@ -57,10 +57,7 @@ final class PanamaVectorUtilSupport implements 
VectorUtilSupport {
        // default to platform supported bitsize
        int vectorBitSize = VectorShape.preferredShape().vectorBitSize();
        // but allow easy overriding for testing
   -    try {
   -      vectorBitSize = Integer.getInteger("tests.vectorsize", vectorBitSize);
   -    } catch (SecurityException ignored) {
   -    }
   +    vectorBitSize = 
VectorizationProvider.TESTS_VECTOR_SIZE.orElse(vectorBitSize);
        INT_SPECIES = VectorSpecies.of(int.class, 
VectorShape.forBitSize(vectorBitSize));
        VECTOR_BITSIZE = INT_SPECIES.vectorBitSize();
        FLOAT_SPECIES = INT_SPECIES.withLanes(float.class);
   @@ -76,15 +73,8 @@ final class PanamaVectorUtilSupport implements 
VectorUtilSupport {
        // hotspot misses some SSE intrinsics, workaround it
        // to be fair, they do document this thing only works well with 
AVX2/AVX3 and Neon
        boolean isAMD64withoutAVX2 = Constants.OS_ARCH.equals("amd64") && 
VECTOR_BITSIZE < 256;
   -    boolean hasFastIntegerVectors = isAMD64withoutAVX2 == false;
   -    try {
   -      hasFastIntegerVectors =
   -          Boolean.parseBoolean(
   -              System.getProperty(
   -                  "tests.forceintegervectors", 
Boolean.toString(hasFastIntegerVectors)));
   -    } catch (SecurityException ignored) {
   -    }
   -    HAS_FAST_INTEGER_VECTORS = hasFastIntegerVectors;
   +    HAS_FAST_INTEGER_VECTORS =
   +        
VectorizationProvider.TESTS_FORCE_INTEGER_VECTORS.orElse(isAMD64withoutAVX2 == 
false);
      }
    
      @Override
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org
For additional commands, e-mail: issues-h...@lucene.apache.org

Reply via email to