Index: itests/hive-jmh/src/main/java/org/apache/hive/benchmark/vectorization/VectorizationBench.java =================================================================== --- itests/hive-jmh/src/main/java/org/apache/hive/benchmark/vectorization/VectorizationBench.java (revision 1673092) +++ itests/hive-jmh/src/main/java/org/apache/hive/benchmark/vectorization/VectorizationBench.java (working copy) @@ -20,23 +20,17 @@ import org.apache.hadoop.hive.ql.exec.vector.expressions.LongColDivideLongColumn; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddDoubleColumn; -import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddLongColumn; import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColDivideDoubleColumn; -import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColDivideLongColumn; -import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.LongColAddDoubleColumn; import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.LongColAddLongColumn; -import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.LongColDivideDoubleColumn; +import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Level; -import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Warmup; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; @@ -70,10 +64,6 @@ * $ java -jar target/benchmarks.jar org.apache.hive.benchmark.vectorization VectorizationBench * -wi 10 -i 5 -f 2 -bm avgt -tu us */ - private static LongColumnVector longColumnVector = new LongColumnVector(); - private static LongColumnVector dupLongColumnVector = new LongColumnVector(); - private static DoubleColumnVector doubleColumnVector = new DoubleColumnVector(); - private static DoubleColumnVector dupDoubleColumnVector = new DoubleColumnVector(); @BenchmarkMode(Mode.AverageTime) @Fork(1) @@ -80,11 +70,12 @@ @State(Scope.Thread) @OutputTimeUnit(TimeUnit.NANOSECONDS) public static abstract class AbstractExpression { + private static final int DEFAULT_ITER_TIME = 1000000; protected VectorExpression expression; protected VectorizedRowBatch rowBatch; protected VectorizedRowBatch buildRowBatch(ColumnVector output, int colNum, ColumnVector... - cols) { + cols) { VectorizedRowBatch rowBatch = new VectorizedRowBatch(colNum + 1); for (int i = 0; i < cols.length; i++) { rowBatch.cols[i] = cols[i]; @@ -100,94 +91,127 @@ @Warmup(iterations = 2, time = 2, timeUnit = TimeUnit.MILLISECONDS) @Measurement(iterations = 2, time = 2, timeUnit = TimeUnit.MILLISECONDS) public void bench() { - expression.evaluate(rowBatch); + for (int i = 0; i < DEFAULT_ITER_TIME; i++) { + expression.evaluate(rowBatch); + } } + + protected LongColumnVector getLongColumnVector() { + LongColumnVector columnVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE); + Random random = new Random(); + for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) { + columnVector.vector[i] = random.nextLong(); + } + return columnVector; + } + + protected LongColumnVector getRepeatingLongColumnVector() { + LongColumnVector columnVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE); + columnVector.fill(2); + return columnVector; + } + + protected LongColumnVector getLongColumnVectorWithNull() { + LongColumnVector columnVector = new LongColumnVector(VectorizedRowBatch.DEFAULT_SIZE); + columnVector.noNulls = false; + Random random = new Random(); + for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) { + if (i % 100 == 0) { + columnVector.isNull[i] = true; + } + columnVector.vector[i] = random.nextLong(); + } + return columnVector; + } + + protected DoubleColumnVector getDoubleColumnVector() { + DoubleColumnVector columnVector = new DoubleColumnVector(VectorizedRowBatch.DEFAULT_SIZE); + Random random = new Random(); + for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) { + columnVector.vector[i] = random.nextDouble(); + } + return columnVector; + } + + protected DoubleColumnVector getRepeatingDoubleColumnVector() { + DoubleColumnVector columnVector = new DoubleColumnVector(VectorizedRowBatch.DEFAULT_SIZE); + columnVector.fill(2.0d); + return columnVector; + } + + protected DoubleColumnVector getDoubleColumnVectorWithNull() { + DoubleColumnVector columnVector = new DoubleColumnVector(VectorizedRowBatch.DEFAULT_SIZE); + columnVector.noNulls = false; + Random random = new Random(); + for (int i = 0; i != VectorizedRowBatch.DEFAULT_SIZE; i++) { + if (i % 100 == 0) { + columnVector.isNull[i] = true; + } + columnVector.vector[i] = random.nextDouble(); + } + return columnVector; + } + } - public static class DoubleAddDoubleExpr extends AbstractExpression { + public static class DoubleColAddRepeatingDoubleColumnBench extends AbstractExpression { @Override public void setup() { - rowBatch = buildRowBatch(new DoubleColumnVector(), 2, doubleColumnVector, - dupDoubleColumnVector); + rowBatch = buildRowBatch(new DoubleColumnVector(), 2, getDoubleColumnVector(), + getRepeatingDoubleColumnVector()); expression = new DoubleColAddDoubleColumn(0, 1, 2); } } - public static class LongAddLongExpr extends AbstractExpression { + public static class LongColAddRepeatingLongColumnBench extends AbstractExpression { @Override public void setup() { - rowBatch = buildRowBatch(new LongColumnVector(), 2, longColumnVector, dupLongColumnVector); + rowBatch = buildRowBatch(new LongColumnVector(), 2, getLongColumnVector(), + getRepeatingLongColumnVector()); expression = new LongColAddLongColumn(0, 1, 2); } } - public static class LongAddDoubleExpr extends AbstractExpression { - @Override - public void setup() { - rowBatch = buildRowBatch(new DoubleColumnVector(), 2, longColumnVector, doubleColumnVector); - expression = new LongColAddDoubleColumn(0, 1, 2); - } - } - public static class DoubleAddLongExpr extends AbstractExpression { + public static class DoubleColDivideDoubleColumnBench extends AbstractExpression { @Override public void setup() { - rowBatch = buildRowBatch(new DoubleColumnVector(), 2, doubleColumnVector, longColumnVector); - expression = new DoubleColAddLongColumn(0, 1, 2); + rowBatch = buildRowBatch(new DoubleColumnVector(), 2, getDoubleColumnVector(), + getDoubleColumnVector()); + expression = new DoubleColDivideDoubleColumn(0, 1, 2); } } - public static class DoubleDivideDoubleExpr extends AbstractExpression { + public static class DoubleColDivideRepeatingDoubleColumnBench extends AbstractExpression { @Override public void setup() { - rowBatch = buildRowBatch(new DoubleColumnVector(), 2, doubleColumnVector, - dupDoubleColumnVector); + rowBatch = buildRowBatch(new DoubleColumnVector(), 2, getDoubleColumnVector(), + getRepeatingDoubleColumnVector()); expression = new DoubleColDivideDoubleColumn(0, 1, 2); } } - public static class LongDivideLongExpr extends AbstractExpression { + public static class LongColDivideLongColumnBench extends AbstractExpression { @Override public void setup() { - rowBatch = buildRowBatch(new DoubleColumnVector(), 2, longColumnVector, - dupLongColumnVector); + rowBatch = buildRowBatch(new DoubleColumnVector(), 2, getLongColumnVector(), + getLongColumnVector()); expression = new LongColDivideLongColumn(0, 1, 2); } } - public static class DoubleDivideLongExpr extends AbstractExpression { + public static class LongColDivideRepeatingLongColumnBench extends AbstractExpression { @Override public void setup() { - rowBatch = buildRowBatch(new DoubleColumnVector(), 2, doubleColumnVector, - longColumnVector); - expression = new DoubleColDivideLongColumn(0, 1, 2); + rowBatch = buildRowBatch(new DoubleColumnVector(), 2, getLongColumnVector(), + getRepeatingLongColumnVector()); + expression = new LongColDivideLongColumn(0, 1, 2); } } - public static class LongDivideDoubleExpr extends AbstractExpression { - @Override - public void setup() { - rowBatch = buildRowBatch(new DoubleColumnVector(), 2, longColumnVector, - doubleColumnVector); - expression = new LongColDivideDoubleColumn(0, 1, 2); - } - } - - @Setup(Level.Trial) - public void initialColumnVectors() { - Random random = new Random(); - - dupLongColumnVector.fill(random.nextLong()); - dupDoubleColumnVector.fill(random.nextDouble()); - for (int i = 0; i < VectorizedRowBatch.DEFAULT_SIZE; i++) { - doubleColumnVector.vector[i] = random.nextDouble(); - longColumnVector.vector[i] = random.nextLong(); - } - } - public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder().include(".*" + VectorizationBench.class.getSimpleName() + - ".*").build(); + ".*").build(); new Runner(opt).run(); } } \ No newline at end of file Index: ql/src/gen/vectorization/ExpressionTemplates/ColumnDivideColumn.txt =================================================================== --- ql/src/gen/vectorization/ExpressionTemplates/ColumnDivideColumn.txt (revision 1673092) +++ ql/src/gen/vectorization/ExpressionTemplates/ColumnDivideColumn.txt (working copy) @@ -86,22 +86,26 @@ outputVector[0] = vector1[0] denom; hasDivBy0 = hasDivBy0 || (denom == 0); } else if (inputColVector1.isRepeating) { + final vector1Value = vector1[0]; if (batch.selectedInUse) { for(int j = 0; j != n; j++) { int i = sel[j]; denom = vector2[i]; - outputVector[i] = vector1[0] denom; + outputVector[i] = vector1Value denom; hasDivBy0 = hasDivBy0 || (denom == 0); } } else { for(int i = 0; i != n; i++) { - denom = vector2[i]; - outputVector[i] = vector1[0] denom; - hasDivBy0 = hasDivBy0 || (denom == 0); + outputVector[i] = vector1Value vector2[i]; } + + for(int i = 0; i != n; i++) { + hasDivBy0 = hasDivBy0 || (vector2[i] == 0); + } } } else if (inputColVector2.isRepeating) { - if (vector2[0] == 0) { + final vector2Value = vector2[0]; + if (vector2Value == 0) { // Denominator is zero, convert the batch to nulls outputColVector.noNulls = false; outputColVector.isRepeating = true; @@ -109,11 +113,11 @@ } else if (batch.selectedInUse) { for(int j = 0; j != n; j++) { int i = sel[j]; - outputVector[i] = vector1[i] vector2[0]; + outputVector[i] = vector1[i] vector2Value; } } else { for(int i = 0; i != n; i++) { - outputVector[i] = vector1[i] vector2[0]; + outputVector[i] = vector1[i] vector2Value; } } } else { @@ -126,10 +130,12 @@ } } else { for(int i = 0; i != n; i++) { - denom = vector2[i]; - outputVector[i] = vector1[i] denom; - hasDivBy0 = hasDivBy0 || (denom == 0); + outputVector[i] = vector1[i] vector2[i]; } + + for(int i = 0; i != n; i++) { + hasDivBy0 = hasDivBy0 || (vector2[i] == 0); + } } }