Iterating Over a Bitset in Java
Take a deep dive into optimization and iterating over bitsets, with some intense benchmarking along the way.
Join the DZone community and get the full member experience.
Join For FreeHow fast can you iterate over a bitset? Daniel Lemire published a benchmark recently in support of a strategy using the number of trailing zeroes to skip over empty bits. I have used the same technique in Java several times in my hobby project SplitMap and this is something I am keen to optimize. I think that the best strategy depends on what you want to do with the set bits, and how sparse and uniformly distributed they are. I argue that the cost of iteration is less important than the constraints your API imposes on the caller, and whether the caller is free to exploit patterns in the data.
C2 Generates Good Code
If you think C++ is much faster than Java, you either don’t know much about Java or do lots of floating point arithmetic. This isn’t about benchmarking C++ against Java, but comparing the compilation outputs for a C++ implementation and a Java implementation shows that there won’t be much difference if your Java method gets hot. Only the time to performance will differ, and this is amortised over the lifetime of an application. The trailing zeroes implementation is probably the fastest technique in Java as well as in C++, but that is to ignore the optimisations you can’t apply to the callback if you use it too literally.
Compiling this C++ function with GCC yields the snippet of assembly taken from the loop kernel:
template <typename CALLBACK>
static void for_each(const long* bitmap, const int size, const CALLBACK& callback) {
for (size_t k = 0; k < size; ++k) {
long bitset = bitmap[k];
while (bitset != 0) {
callback((k * 64) + __builtin_ctzl(bitset));
bitset ^= (bitset & -bitset);
}
}
}
The instruction tzcntl
calculates the next set bit and blsr
switches it off.
.L99:
movq %rdi, %rcx
blsr %ebx, %ebx
call _ZNSo3putEc
movq %rax, %rcx
call _ZNSo5flushEv
testl %ebx, %ebx
je .L96
.L100:
xorl %edx, %edx
movq %r12, %rcx
tzcntl %ebx, %edx
addl %ebp, %edx
call _ZNSolsEi
movq %rax, %rdi
movq (%rax), %rax
movq -24(%rax), %rax
movq 240(%rdi,%rax), %rsi
testq %rsi, %rsi
je .L108
cmpb $0, 56(%rsi)
jne .L109
movq %rsi, %rcx
call _ZNKSt5ctypeIcE13_M_widen_initEv
movq (%rsi), %rax
movl $10, %edx
movq 48(%rax), %rax
cmpq %r14, %rax
je .L99
movq %rsi, %rcx
call *%rax
movsbl %al, %edx
jmp .L99
.p2align 4,,10
In Java, almost identical code is generated.
public void forEach(long[] bitmap, IntConsumer consumer) {
for (int i = 0; i < bitmap.length; ++i) {
long word = bitmap[i];
while (word != 0) {
consumer.accept(Long.SIZE * i + Long.numberOfTrailingZeros(word));
word ^= Long.lowestOneBit(word);
}
}
}
The key difference is that xor
and blsi
haven’t been fused into blsr
, so the C++ code is probably slightly faster. A lambda function accumulating the contents of an array is inlined into this loop (the add
comes from an inlined lambda, but notice how little time is spent adding compared to computing the bit to switch off in this sample produced by perfasm).
.83% 0x000002d79d366a19: tzcnt r9,rcx
8.53% 0x000002d79d366a1e: add r9d,ebx
0.42% 0x000002d79d366a21: cmp r9d,r8d
0.00% 0x000002d79d366a24: jnb 2d79d366a4dh
0.62% 0x000002d79d366a26: add r10d,dword ptr [rdi+r9*4+10h]
16.22% 0x000002d79d366a2b: vmovq r11,xmm4
6.68% 0x000002d79d366a30: mov dword ptr [r11+10h],r10d
27.92% 0x000002d79d366a34: blsi r10,rcx
0.55% 0x000002d79d366a39: xor rcx,r10
0.10% 0x000002d79d366a3c: mov r11,qword ptr [r15+70h]
It’s this Java code, and its impact on which optimizations can be applied to the IntConsumer
that this post focuses on. There are different principles, particularly related to inlining and vectorization opportunities in C++, but this blog is about Java. Depending on what your callback does, you get different benchmark results and you should make different choices about how to do the iteration: you just can’t assess this in isolation.
Special Casing -1
Imagine you have an int[]
containing data, and you are iterating over a mask or materialised predicate over that data. For each set bit, you want to add the corresponding entry in the array to a sum. In Java, that looks like this (you’ve already seen the generated assembly above):
@Benchmark
public int reduce() {
int[] result = new int[1];
forEach(bitmap, i -> result[0] += data[i]);
return result[0];
}
How fast can this get? It obviously depends on how full the bitset is. The worst case would be that it’s completely full, and it couldn’t get much better than if only one bit per word were set. The difference is noticeable, but scales by a factor less than the number of bits:
Benchmark | Mode | Threads | Samples | Score | Score Error (99.9%) | Unit | Param: scenario |
---|---|---|---|---|---|---|---|
reduce | thrpt | 1 | 10 | 7.435909 | 0.017491 | ops/ms | FULL |
reduce | thrpt | 1 | 10 | 260.305307 | 6.081961 | ops/ms | ONE_BIT_PER_WORD |
But the important code here, the callback itself, is stuck at entry level compilation. There is no unrolling, no vectorisation, the add
s can’t be pipelined because there is a data dependency on blsi
and xor
. We can do much better in some cases, and not much worse in others, just by treating -1 as a special case, profiting from optimisations that can now be applied inside the callback. Passing a different callback which consumes whole words costs a branch, but it’s often worth it. Here’s the iterator now:
interface WordConsumer {
void acceptWord(int wordIndex, long word);
}
public void forEach(long[] bitmap, IntConsumer intConsumer, WordConsumer wordConsumer) {
for (int i = 0; i < bitmap.length; ++i) {
long word = bitmap[i];
if (word == -1 L) {
wordConsumer.acceptWord(i, word);
} else {
while (word != 0) {
intConsumer.accept(Long.SIZE * i + Long.numberOfTrailingZeros(word));
word ^= Long.lowestOneBit(word);
}
}
}
}
@Benchmark
public int reduceWithWordConsumer() {
int[] result = new int[1];
forEach(bitmap, i -> result[0] += data[i], (index, word) -> {
if (word != -1 L) {
throw new IllegalStateException();
}
int sum = 0;
for (int i = index * Long.SIZE; i < (index + 1) * Long.SIZE; ++i) {
sum += data[i];
}
result[0] += sum;
});
return result[0];
}
This really pays off when the bitset is full, but having that extra branch does seem to cost something even though it is never taken, whereas the full case improves 6x.
Benchmark | Mode | Threads | Samples | Score | Score Error (99.9%) | Unit | Param: scenario |
---|---|---|---|---|---|---|---|
reduce | thrpt | 1 | 10 | 7.401202 | 0.118648 | ops/ms | FULL |
reduce | thrpt | 1 | 10 | 261.682016 | 4.155856 | ops/ms | ONE_BIT_PER_WORD |
reduceWithWordConsumer | thrpt | 1 | 10 | 43.972759 | 0.993264 | ops/ms | FULL |
reduceWithWordConsumer | thrpt | 1 | 10 | 222.824868 | 4.877147 | ops/ms | ONE_BIT_PER_WORD |
We still don’t actually know the cost of the branch when it’s taken every now and then. To estimate it, we need a new scenario (or new scenarios) which mix full and sparse words. As you might expect, having the WordConsumer
is great when one word in every few is full: the fast path is so much faster, it practically skips the word.
Benchmark | Mode | Threads | Samples | Score | Score Error (99.9%) | Unit | Param: scenario |
---|---|---|---|---|---|---|---|
reduce | thrpt | 1 | 10 | 157.358633 | 4.538679 | ops/ms | SPARSE_16_FULL_WORDS |
reduceWithWordConsumer | thrpt | 1 | 10 | 257.041035 | 7.446404 | ops/ms | SPARSE_16_FULL_WORDS |
So in this scenario, the branch has paid for itself. How? The data dependency has been removed with a countable loop. Here’s the perfasm output. Notice two things: long runs of add
instructions, and the vastly reduced percentage against blsi
. The time is now spent adding numbers up, not switching off least significant bits. This feels like progress.
....[Hottest Region 1]..............................................................................
c2, com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub, version 170 (804 bytes)
; {optimized virtual_call}
0x000001dd5b35acd4: mov r9,qword ptr [rsp+0a0h]
0x000001dd5b35acdc: movzx r11d,byte ptr [r9+94h] ;*getfield isDone {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@30 (line 144)
; implicit exception: dispatches to 0x000001dd5b35b486
0x000001dd5b35ace4: test r11d,r11d
0x000001dd5b35ace7: jne 1dd5b35b19dh ;*ifeq {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@33 (line 144)
0x000001dd5b35aced: mov ebx,1h
0x000001dd5b35acf2: jmp 1dd5b35ad31h
0.00% 0x000001dd5b35acf4: vmovq rdi,xmm0 ;*invokevirtual reduceWithWordConsumer {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35acf9: mov r8d,dword ptr [rdi+10h] ;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@28 (line 85)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001dd5b35acfd: mov rdx,qword ptr [rsp+30h]
0.03% 0x000001dd5b35ad02: nop
0.00% 0x000001dd5b35ad03: call 1dd5b2c7000h ; ImmutableOopMap{[160]=Oop [168]=Oop [176]=Oop [40]=NarrowOop [48]=Oop }
;*invokevirtual consume {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@20 (line 142)
; {optimized virtual_call}
0.04% 0x000001dd5b35ad08: mov r9,qword ptr [rsp+0a0h]
0x000001dd5b35ad10: movzx r11d,byte ptr [r9+94h] ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@11 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.02% 0x000001dd5b35ad18: mov r10,qword ptr [r15+70h]
0.00% 0x000001dd5b35ad1c: mov rbx,qword ptr [rsp+40h]
0.03% 0x000001dd5b35ad21: add rbx,1h ; ImmutableOopMap{r9=Oop [160]=Oop [168]=Oop [176]=Oop [40]=NarrowOop [48]=Oop }
;*ifeq {reexecute=1 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@33 (line 144)
0.00% 0x000001dd5b35ad25: test dword ptr [r10],eax ; {poll}
0.00% 0x000001dd5b35ad28: test r11d,r11d
0x000001dd5b35ad2b: jne 1dd5b35b1a2h
0.00% 0x000001dd5b35ad31: mov rdi,qword ptr [r15+80h]
0.01% 0x000001dd5b35ad38: mov r10,rdi
0.00% 0x000001dd5b35ad3b: add r10,18h
0.01% 0x000001dd5b35ad3f: cmp r10,qword ptr [r15+90h]
0x000001dd5b35ad46: jnb 1dd5b35b119h ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@11 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35ad4c: mov qword ptr [r15+80h],r10
0x000001dd5b35ad53: prefetchw byte ptr [r10+0c0h]
0.00% 0x000001dd5b35ad5b: mov qword ptr [rdi],1h
0.01% 0x000001dd5b35ad62: prefetchw byte ptr [r10+100h]
0x000001dd5b35ad6a: mov dword ptr [rdi+8h],0f8000168h
; {metadata({type array int})}
0.00% 0x000001dd5b35ad71: prefetchw byte ptr [r10+140h]
0.01% 0x000001dd5b35ad79: mov dword ptr [rdi+0ch],1h
0.01% 0x000001dd5b35ad80: prefetchw byte ptr [r10+180h]
0.00% 0x000001dd5b35ad88: mov qword ptr [rdi+10h],r12 ;*newarray {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@1 (line 74)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35ad8c: mov rcx,qword ptr [rsp+0b0h]
0.00% 0x000001dd5b35ad94: mov ebp,dword ptr [rcx+0ch] ;*getfield bitmap {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@6 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35ad97: mov dword ptr [rsp+70h],ebp
0.00% 0x000001dd5b35ad9b: mov rsi,qword ptr [r15+80h]
0.00% 0x000001dd5b35ada2: mov r10,rsi
0x000001dd5b35ada5: add r10,18h
0.00% 0x000001dd5b35ada9: cmp r10,qword ptr [r15+90h]
0x000001dd5b35adb0: jnb 1dd5b35b14fh ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@11 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35adb6: mov qword ptr [r15+80h],r10
0x000001dd5b35adbd: prefetchw byte ptr [r10+0c0h]
0.00% 0x000001dd5b35adc5: mov r8,qword ptr [rsp+20h]
0.01% 0x000001dd5b35adca: mov r10,qword ptr [r8+0b0h]
0.01% 0x000001dd5b35add1: mov qword ptr [rsi],r10
0.00% 0x000001dd5b35add4: mov dword ptr [rsi+8h],0f8021906h
; {metadata('com/openkappa/simd/iterate/BitSetIterator$$Lambda$43')}
0x000001dd5b35addb: mov qword ptr [rsi+10h],r12 ;*new {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::get$Lambda@0
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@11 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35addf: mov r11d,dword ptr [rsp+28h]
0.00% 0x000001dd5b35ade4: mov dword ptr [rsi+0ch],r11d
;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@11 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35ade8: mov rax,qword ptr [r15+80h]
0.00% 0x000001dd5b35adef: mov rbp,rdi
0.01% 0x000001dd5b35adf2: shr rbp,3h
0.00% 0x000001dd5b35adf6: mov dword ptr [rsi+10h],ebp ;*putfield arg$2 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::<init>@11
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@11 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35adf9: mov r10,rax
0.00% 0x000001dd5b35adfc: add r10,18h
0.00% 0x000001dd5b35ae00: cmp r10,qword ptr [r15+90h]
0x000001dd5b35ae07: jnb 1dd5b35b08eh ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@11 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35ae0d: mov qword ptr [r15+80h],r10
0.00% 0x000001dd5b35ae14: prefetchw byte ptr [r10+0c0h]
0.00% 0x000001dd5b35ae1c: mov rdx,qword ptr [rsp+38h]
0.00% 0x000001dd5b35ae21: mov r10,qword ptr [rdx+0b0h]
0.02% 0x000001dd5b35ae28: mov qword ptr [rax],r10
0.01% 0x000001dd5b35ae2b: mov dword ptr [rax+8h],0f8021a86h
; {metadata('com/openkappa/simd/iterate/BitSetIterator$$Lambda$44')}
0.00% 0x000001dd5b35ae32: mov qword ptr [rax+10h],r12
0.00% 0x000001dd5b35ae36: mov dword ptr [rax+0ch],r11d
;*new {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::get$Lambda@0
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@18 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35ae3a: mov dword ptr [rax+10h],ebp ;*invokespecial <init> {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@18 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001dd5b35ae3d: mov ebp,dword ptr [rsp+70h]
0.00% 0x000001dd5b35ae41: mov r13d,dword ptr [r12+rbp*8+0ch]
;*arraylength {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@6 (line 104)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
; implicit exception: dispatches to 0x000001dd5b35b422
0.03% 0x000001dd5b35ae46: test r13d,r13d
0x000001dd5b35ae49: jbe 1dd5b35b024h ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@7 (line 104)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35ae4f: mov r10d,r13d
0.00% 0x000001dd5b35ae52: dec r10d
0x000001dd5b35ae55: cmp r10d,r13d
0x000001dd5b35ae58: jnb 1dd5b35b24ah
0.01% 0x000001dd5b35ae5e: lea r14,[r12+rbp*8] ;*getfield bitmap {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@6 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001dd5b35ae62: xor r10d,r10d
0.00% 0x000001dd5b35ae65: xor ebp,ebp
0x000001dd5b35ae67: mov qword ptr [rsp+0b0h],rcx
0.00% 0x000001dd5b35ae6f: mov qword ptr [rsp+0a0h],r9
0x000001dd5b35ae77: mov qword ptr [rsp+20h],r8
0.01% 0x000001dd5b35ae7c: mov dword ptr [rsp+28h],r11d
0.00% 0x000001dd5b35ae81: mov qword ptr [rsp+38h],rdx
0.00% 0x000001dd5b35ae86: mov qword ptr [rsp+40h],rbx
0.00% 0x000001dd5b35ae8b: vmovq xmm0,rdi
0.00% 0x000001dd5b35ae90: jmp 1dd5b35afafh
0.03% 0x000001dd5b35ae95: mov r8d,r10d
0.03% 0x000001dd5b35ae98: add r8d,40h ;*imul {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@32 (line 80)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.04% 0x000001dd5b35ae9c: cmp r10d,r8d
0x000001dd5b35ae9f: jnl 1dd5b35b01dh ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@33 (line 80)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.03% 0x000001dd5b35aea5: mov r11d,dword ptr [r12+rcx*8+0ch]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@44 (line 81)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
; implicit exception: dispatches to 0x000001dd5b35b1d3
0.04% 0x000001dd5b35aeaa: cmp r10d,r11d
0x000001dd5b35aead: jnb 1dd5b35b1d3h
0.04% 0x000001dd5b35aeb3: movsxd r11,r11d
0.04% 0x000001dd5b35aeb6: movsxd r9,r8d
0.02% 0x000001dd5b35aeb9: dec r9
0.05% 0x000001dd5b35aebc: cmp r9,r11
0.00% 0x000001dd5b35aebf: jnb 1dd5b35b1d3h
0.04% 0x000001dd5b35aec5: lea rdi,[r12+rcx*8]
0.04% 0x000001dd5b35aec9: mov ecx,r10d
0.03% 0x000001dd5b35aecc: inc ecx
0.04% 0x000001dd5b35aece: mov r9d,r10d
0.04% 0x000001dd5b35aed1: xor ebx,ebx ;*iload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@36 (line 81)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.03% 0x000001dd5b35aed3: add ebx,dword ptr [rdi+r9*4+10h]
;*iadd {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@45 (line 81)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.20% 0x000001dd5b35aed8: inc r9d ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@48 (line 80)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.04% 0x000001dd5b35aedb: cmp r9d,ecx
0x000001dd5b35aede: jl 1dd5b35aed3h ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@33 (line 80)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.04% 0x000001dd5b35aee0: add r10d,31h
0.03% 0x000001dd5b35aee4: cmp r8d,r10d
0.03% 0x000001dd5b35aee7: mov r11d,80000000h
0.04% 0x000001dd5b35aeed: cmovl r10d,r11d
0.04% 0x000001dd5b35aef1: cmp r9d,r10d
0x000001dd5b35aef4: jnl 1dd5b35af68h
0.04% 0x000001dd5b35aef6: nop word ptr [rax+rax+0h] ;*iload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@36 (line 81)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.07% 0x000001dd5b35af00: movsxd r11,r9d
0.05% 0x000001dd5b35af03: add ebx,dword ptr [rdi+r9*4+10h]
0.31% 0x000001dd5b35af08: add ebx,dword ptr [rdi+r11*4+14h]
0.32% 0x000001dd5b35af0d: add ebx,dword ptr [rdi+r11*4+18h]
0.33% 0x000001dd5b35af12: add ebx,dword ptr [rdi+r11*4+1ch]
0.37% 0x000001dd5b35af17: add ebx,dword ptr [rdi+r11*4+20h]
0.34% 0x000001dd5b35af1c: add ebx,dword ptr [rdi+r11*4+24h]
0.39% 0x000001dd5b35af21: add ebx,dword ptr [rdi+r11*4+28h]
0.36% 0x000001dd5b35af26: add ebx,dword ptr [rdi+r11*4+2ch]
0.34% 0x000001dd5b35af2b: add ebx,dword ptr [rdi+r11*4+30h]
0.35% 0x000001dd5b35af30: add ebx,dword ptr [rdi+r11*4+34h]
0.38% 0x000001dd5b35af35: add ebx,dword ptr [rdi+r11*4+38h]
0.36% 0x000001dd5b35af3a: add ebx,dword ptr [rdi+r11*4+3ch]
0.49% 0x000001dd5b35af3f: add ebx,dword ptr [rdi+r11*4+40h]
0.39% 0x000001dd5b35af44: add ebx,dword ptr [rdi+r11*4+44h]
0.42% 0x000001dd5b35af49: add ebx,dword ptr [rdi+r11*4+48h]
0.39% 0x000001dd5b35af4e: add ebx,dword ptr [rdi+r11*4+4ch]
;*iadd {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@45 (line 81)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.41% 0x000001dd5b35af53: add r9d,10h ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@48 (line 80)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001dd5b35af57: cmp r9d,r10d
0x000001dd5b35af5a: jl 1dd5b35af00h ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@11 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0x000001dd5b35af5c: mov r11,qword ptr [r15+70h] ; ImmutableOopMap{rdi=Oop rsi=Oop rax=Oop r14=Oop xmm0=Oop [160]=Oop [168]=Oop [176]=Oop [40]=NarrowOop [48]=Oop [112]=NarrowOop }
;*goto {reexecute=1 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@51 (line 80)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0x000001dd5b35af60: test dword ptr [r11],eax ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@51 (line 80)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
; {poll}
0.15% 0x000001dd5b35af63: cmp r9d,r10d
0x000001dd5b35af66: jl 1dd5b35af00h
0x000001dd5b35af68: cmp r9d,r8d
0x000001dd5b35af6b: jnl 1dd5b35af7dh
0x000001dd5b35af6d: nop ;*iload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@36 (line 81)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.67% 0x000001dd5b35af70: add ebx,dword ptr [rdi+r9*4+10h]
;*iadd {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@45 (line 81)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.59% 0x000001dd5b35af75: inc r9d ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@48 (line 80)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.13% 0x000001dd5b35af78: cmp r9d,r8d
0x000001dd5b35af7b: jl 1dd5b35af70h ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@33 (line 80)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
0x000001dd5b35af7d: vmovq r10,xmm0
0.02% 0x000001dd5b35af82: add dword ptr [r10+10h],ebx
2.64% 0x000001dd5b35af86: mov r8,rax
2.45% 0x000001dd5b35af89: mov r9,rsi ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@11 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.70% 0x000001dd5b35af8c: mov r10,qword ptr [r15+70h]
2.16% 0x000001dd5b35af90: mov r11d,ebp
2.37% 0x000001dd5b35af93: inc r11d ; ImmutableOopMap{r8=Oop r9=Oop rsi=Oop rax=Oop r14=Oop xmm0=Oop [160]=Oop [168]=Oop [176]=Oop [40]=NarrowOop [48]=Oop [112]=NarrowOop }
;*goto {reexecute=1 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@78 (line 104)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.44% 0x000001dd5b35af96: test dword ptr [r10],eax ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@78 (line 104)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
; {poll}
2.74% 0x000001dd5b35af99: cmp r11d,r13d
0.00% 0x000001dd5b35af9c: jnl 1dd5b35acf4h ;*aload_1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@10 (line 105)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.14% 0x000001dd5b35afa2: shl ebp,6h
2.37% 0x000001dd5b35afa5: mov r10d,ebp
2.41% 0x000001dd5b35afa8: add r10d,40h ;*imul {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$2@22 (line 80)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/778368703::acceptWord@10
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 107)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.72% 0x000001dd5b35afac: mov ebp,r11d ;*aload_1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@10 (line 105)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.14% 0x000001dd5b35afaf: mov rbx,qword ptr [r14+rbp*8+10h]
;*laload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@13 (line 105)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.59% 0x000001dd5b35afb4: mov r11,qword ptr [rsp+0b0h]
2.30% 0x000001dd5b35afbc: mov ecx,dword ptr [r11+10h] ;*getfield data {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$1@5 (line 75)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::accept@9
; - com.openkappa.simd.iterate.BitSetIterator::forEach@57 (line 110)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.76% 0x000001dd5b35afc0: cmp rbx,0ffffffffffffffffh
0x000001dd5b35afc4: je 1dd5b35ae95h ;*ifne {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@22 (line 106)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.09% 0x000001dd5b35afca: test rbx,rbx
0.00% 0x000001dd5b35afcd: je 1dd5b35af86h ;*ifeq {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@42 (line 109)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.34% 0x000001dd5b35afcf: mov r9d,dword ptr [r12+rcx*8+0ch]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$1@9 (line 75)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::accept@9
; - com.openkappa.simd.iterate.BitSetIterator::forEach@57 (line 110)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
; implicit exception: dispatches to 0x000001dd5b35b3f6
2.50% 0x000001dd5b35afd4: lea rdi,[r12+rcx*8]
2.62% 0x000001dd5b35afd8: nop dword ptr [rax+rax+0h] ;*aload_2 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@45 (line 110)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.11% 0x000001dd5b35afe0: vmovq r11,xmm0
2.35% 0x000001dd5b35afe5: mov r8d,dword ptr [r11+10h] ;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduceWithWordConsumer$1@3 (line 75)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::accept@9
; - com.openkappa.simd.iterate.BitSetIterator::forEach@57 (line 110)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.39% 0x000001dd5b35afe9: tzcnt r11,rbx
2.65% 0x000001dd5b35afee: add r11d,r10d ;*iadd {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@56 (line 110)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.15% 0x000001dd5b35aff1: cmp r11d,r9d
0.00% 0x000001dd5b35aff4: jnb 1dd5b35b04dh
2.29% 0x000001dd5b35aff6: add r8d,dword ptr [rdi+r11*4+10h]
11.03% 0x000001dd5b35affb: vmovq r11,xmm0
2.45% 0x000001dd5b35b000: mov dword ptr [r11+10h],r8d ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/513487367::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/592450429::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@11 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
3.14% 0x000001dd5b35b004: mov r11,qword ptr [r15+70h]
2.18% 0x000001dd5b35b008: blsi r8,rbx
2.23% 0x000001dd5b35b00d: xor rbx,r8 ; ImmutableOopMap{rcx=NarrowOop rdi=Oop rsi=Oop rax=Oop r14=Oop xmm0=Oop [160]=Oop [168]=Oop [176]=Oop [40]=NarrowOop [48]=Oop [112]=NarrowOop }
;*goto {reexecute=1 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@72 (line 111)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.44% 0x000001dd5b35b010: test dword ptr [r11],eax ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@72 (line 111)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
; {poll}
2.71% 0x000001dd5b35b013: test rbx,rbx
0x000001dd5b35b016: jne 1dd5b35afe0h ;*ifeq {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@42 (line 109)
; - com.openkappa.simd.iterate.BitSetIterator::reduceWithWordConsumer@23 (line 75)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduceWithWordConsumer_jmhTest::reduceWithWordConsumer_thrpt_jmhStub@17 (line 142)
2.23% 0x000001dd5b35b018: jmp 1dd5b35af86h
0x000001dd5b35b01d: xor ebx,ebx
0x000001dd5b35b01f: jmp 1dd5b35af7dh
0x000001dd5b35b024: mov qword ptr [rsp+0b0h],rcx
0x000001dd5b35b02c: mov qword ptr [rsp+0a0h],r9
0x000001dd5b35b034: mov qword ptr [rsp+20h],r8
0x000001dd5b35b039: mov dword ptr [rsp+28h],r11d
0x000001dd5b35b03e: mov qword ptr [rsp+38h],rdx
....................................................................................................
98.92% <total for region 1>
Heroically ploughing through the full words tells a different story: blsi
is up at 11%. This indicates more time is spent iterating rather than evaluating the callback.
....[Hottest Region 1]..............................................................................
c2, com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub, version 164 (218 bytes)
; - java.lang.invoke.LambdaForm$MH/1035918105::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduce@11 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
0x0000019f106c66e7: mov qword ptr [r15+3d8h],rdi
;*invokespecial <init> {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1830914914::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/1035918105::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduce@11 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
0.00% 0x0000019f106c66ee: mov r10d,dword ptr [rsp+60h]
0.00% 0x0000019f106c66f3: mov edx,dword ptr [r12+r10*8+0ch]
;*arraylength {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@4 (line 89)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
; implicit exception: dispatches to 0x0000019f106c6aba
0.02% 0x0000019f106c66f8: test edx,edx
0x0000019f106c66fa: jbe 19f106c6826h ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@5 (line 89)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
0x0000019f106c6700: mov r10d,edx
0.00% 0x0000019f106c6703: dec r10d
0x0000019f106c6706: cmp r10d,edx
0x0000019f106c6709: jnb 19f106c6942h
0.00% 0x0000019f106c670f: mov r10d,dword ptr [rsp+60h]
0x0000019f106c6714: lea rax,[r12+r10*8] ;*getfield bitmap {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::reduce@6 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
0.00% 0x0000019f106c6718: xor ecx,ecx
0x0000019f106c671a: jmp 19f106c674dh
1.54% 0x0000019f106c671c: mov r11,r13
1.57% 0x0000019f106c671f: mov r13,rbp
1.69% 0x0000019f106c6722: mov r8,r14
1.46% 0x0000019f106c6725: vmovd r9d,xmm1
1.48% 0x0000019f106c672a: vmovq rbx,xmm0
1.61% 0x0000019f106c672f: vmovq r14,xmm2
1.63% 0x0000019f106c6734: vmovq rbp,xmm3
1.46% 0x0000019f106c6739: mov rdi,rbp ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1830914914::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1830914914::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/1035918105::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduce@11 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.49% 0x0000019f106c673c: mov r10,qword ptr [r15+70h]
1.54% 0x0000019f106c6740: inc ecx ; ImmutableOopMap{r11=Oop r9=NarrowOop rdi=Oop rax=Oop rbp=Oop r13=Oop r14=Oop [152]=Oop [48]=Oop [96]=NarrowOop }
;*goto {reexecute=1 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@52 (line 89)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.73% 0x0000019f106c6742: test dword ptr [r10],eax ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@52 (line 89)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
; {poll}
1.43% 0x0000019f106c6745: cmp ecx,edx
0.00% 0x0000019f106c6747: jnl 19f106c6480h ;*aload_1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@8 (line 90)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.57% 0x0000019f106c674d: mov rdi,qword ptr [rax+rcx*8+10h]
;*laload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@10 (line 90)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.61% 0x0000019f106c6752: test rdi,rdi
0x0000019f106c6755: je 19f106c6739h ;*ifeq {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@17 (line 91)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.68% 0x0000019f106c6757: vmovq xmm3,rbp
1.47% 0x0000019f106c675c: mov esi,dword ptr [r11+10h] ;*getfield data {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduce$0@5 (line 67)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1830914914::accept@9
; - com.openkappa.simd.iterate.BitSetIterator::forEach@31 (line 92)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.48% 0x0000019f106c6760: mov r10d,dword ptr [r12+rsi*8+0ch]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduce$0@9 (line 67)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1830914914::accept@9
; - com.openkappa.simd.iterate.BitSetIterator::forEach@31 (line 92)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
; implicit exception: dispatches to 0x0000019f106c6a3e
1.58% 0x0000019f106c6765: vmovq xmm2,r14
1.68% 0x0000019f106c676a: vmovq xmm0,rbx
1.46% 0x0000019f106c676f: vmovd xmm1,r9d
1.46% 0x0000019f106c6774: mov r14,r8
1.51% 0x0000019f106c6777: mov rbp,r13
1.68% 0x0000019f106c677a: mov r13,r11
1.41% 0x0000019f106c677d: lea r8,[r12+rsi*8]
1.40% 0x0000019f106c6781: mov ebx,ecx
1.55% 0x0000019f106c6783: shl ebx,6h
1.63% 0x0000019f106c6786: nop word ptr [rax+rax+0h] ;*aload_2 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@20 (line 92)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.68% 0x0000019f106c6790: vmovq r11,xmm2
1.70% 0x0000019f106c6795: mov r11d,dword ptr [r11+10h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$reduce$0@3 (line 67)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1830914914::accept@9
; - com.openkappa.simd.iterate.BitSetIterator::forEach@31 (line 92)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
6.98% 0x0000019f106c6799: tzcnt r9,rdi
3.47% 0x0000019f106c679e: add r9d,ebx ;*iadd {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 92)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.65% 0x0000019f106c67a1: cmp r9d,r10d
0x0000019f106c67a4: jnb 19f106c67cdh
1.67% 0x0000019f106c67a6: add r11d,dword ptr [r8+r9*4+10h]
11.45% 0x0000019f106c67ab: vmovq r9,xmm2
3.20% 0x0000019f106c67b0: mov dword ptr [r9+10h],r11d ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@46 (line 93)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
11.31% 0x0000019f106c67b4: blsi r11,rdi
1.71% 0x0000019f106c67b9: xor rdi,r11 ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1830914914::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1830914914::get$Lambda@6
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$MH/1035918105::linkToTargetMethod@6
; - com.openkappa.simd.iterate.BitSetIterator::reduce@11 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.72% 0x0000019f106c67bc: mov r11,qword ptr [r15+70h] ; ImmutableOopMap{r8=Oop r9=Oop rsi=NarrowOop rax=Oop rbp=Oop r13=Oop xmm1=NarrowOop xmm2=Oop xmm3=Oop [152]=Oop [48]=Oop [96]=NarrowOop }
;*goto {reexecute=1 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@46 (line 93)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.80% 0x0000019f106c67c0: test dword ptr [r11],eax ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@46 (line 93)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
; {poll}
6.99% 0x0000019f106c67c3: test rdi,rdi
0x0000019f106c67c6: jne 19f106c6790h ;*ifeq {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@17 (line 91)
; - com.openkappa.simd.iterate.BitSetIterator::reduce@16 (line 67)
; - com.openkappa.simd.iterate.generated.BitSetIterator_reduce_jmhTest::reduce_thrpt_jmhStub@17 (line 142)
1.39% 0x0000019f106c67c8: jmp 19f106c671ch
0x0000019f106c67cd: mov edx,0ffffffe4h
0x0000019f106c67d2: mov r10,qword ptr [rsp+98h]
0x0000019f106c67da: mov qword ptr [rsp+90h],r10
0x0000019f106c67e2: mov r10,qword ptr [rsp+30h]
0x0000019f106c67e7: mov qword ptr [rsp+0a0h],r13
0x0000019f106c67ef: vmovsd qword ptr [rsp+20h],xmm0
0x0000019f106c67f5: mov qword ptr [rsp+28h],r10
....................................................................................................
98.59% <total for region 1>
This shows the cost of a data dependency in a loop. The operation we want to perform is associative, so we could even vectorise this. In C++ that might happen automatically, or could be ensured with intrinsics, but C2 has various heuristics: it won’t try to vectorise a simple reduction, and 64 would probably be on the short side for most cases it would try to vectorise.
Acknowledging Runs
You might be tempted to transfer even more control to the callback, by accumulating runs and then calling the callback once per run. It simplifies the code to exclude incomplete start and end words from the run.
private interface RunConsumer {
void acceptRun(int start, int end);
}
public void forEach(long[] bitmap, IntConsumer intConsumer, RunConsumer runConsumer) {
int runStart = -1;
for (int i = 0; i < bitmap.length; ++i) {
long word = bitmap[i];
if (word == -1L) {
if (runStart == -1) {
runStart = i;
}
} else {
if (runStart != -1) {
runConsumer.acceptRun(runStart * Long.SIZE, i * Long.SIZE);
runStart = -1;
}
while (word != 0) {
intConsumer.accept(Long.SIZE * i + Long.numberOfTrailingZeros(word));
word ^= Long.lowestOneBit(word);
}
}
}
if (runStart != -1) {
runConsumer.acceptRun(runStart * Long.SIZE, bitmap.length * Long.SIZE);
}
}
For a simple reduction, the extra complexity isn’t justified: You’re better off with the WordIterator
.
Benchmark | Mode | Threads | Samples | Score | Score Error (99.9%) | Unit | Param: scenario |
---|---|---|---|---|---|---|---|
reduce | thrpt | 1 | 10 | 160.502749 | 2.960568 | ops/ms | SPARSE_16_FULL_WORDS |
reduce | thrpt | 1 | 10 | 7.294747 | 0.186678 | ops/ms | FULL |
reduce | thrpt | 1 | 10 | 258.064511 | 8.902233 | ops/ms | ONE_BIT_PER_WORD |
reduce | thrpt | 1 | 10 | 159.613877 | 3.424432 | ops/ms | SPARSE_1_16_WORD_RUN |
reduceWithRunConsumer | thrpt | 1 | 10 | 251.683131 | 6.799639 | ops/ms | SPARSE_16_FULL_WORDS |
reduceWithRunConsumer | thrpt | 1 | 10 | 37.809154 | 0.723198 | ops/ms | FULL |
reduceWithRunConsumer | thrpt | 1 | 10 | 218.133560 | 13.756779 | ops/ms | ONE_BIT_PER_WORD |
reduceWithRunConsumer | thrpt | 1 | 10 | 140.896826 | 8.495777 | ops/ms | SPARSE_1_16_WORD_RUN |
reduceWithWordConsumer | thrpt | 1 | 10 | 257.961783 | 5.892072 | ops/ms | SPARSE_16_FULL_WORDS |
reduceWithWordConsumer | thrpt | 1 | 10 | 43.909471 | 0.601319 | ops/ms | FULL |
reduceWithWordConsumer | thrpt | 1 | 10 | 213.731758 | 20.398077 | ops/ms | ONE_BIT_PER_WORD |
reduceWithWordConsumer | thrpt | 1 | 10 | 258.280428 | 11.316647 | ops/ms | SPARSE_1_16_WORD_RUN |
It’s simplistic to measure this and conclude that this is a bad approach though. There are several other dimensions to this problem:
- Vectorized callbacks
- Inlining failures preventing optimisations
- The number of runs and their lengths (i.e. your data and how you structure it)
Vectorizable Callbacks
There are real benefits to batching up callbacks if the workload in the callback can be vectorised. The code doesn’t need to get much more complicated to start benefitting from larger iteration batches. Mapping each bit to a scaled and squared value from the data array and storing it into an output array illustrates this.
@Benchmark
public void map(Blackhole bh) {
forEach(bitmap, i -> output[i] = data[i] * data[i] * factor);
bh.consume(output);
}
@Benchmark
public void mapWithWordConsumer(Blackhole bh) {
forEach(bitmap, i -> output[0] = data[i] * factor, (WordConsumer)(index, word) -> {
if (word != -1 L) {
throw new IllegalStateException();
}
for (int i = index * Long.SIZE; i < (index + 1) * Long.SIZE; ++i) {
output[i] = data[i] * data[i] * factor;
}
});
bh.consume(output);
}
@Benchmark
public void mapWithRunConsumer(Blackhole bh) {
forEach(bitmap, i -> output[0] = data[i] * factor, (RunConsumer)(start, end) -> {
for (int i = start; i < end; ++i) {
output[i] = data[i] * data[i] * factor;
}
});
bh.consume(output);
}
The RunConsumer
does much better in the full case, never much worse than the WordConsumer
and always better than the basic strategy – even when there is only one run in the entire bitset, or when there are a few full words in an otherwise sparse bitset.
Benchmark | Mode | Threads | Samples | Score | Score Error (99.9%) | Unit | Param: scenario |
---|---|---|---|---|---|---|---|
map | thrpt | 1 | 10 | 127.876662 | 3.411741 | ops/ms | SPARSE_16_FULL_WORDS |
map | thrpt | 1 | 10 | 10.598974 | 0.022404 | ops/ms | FULL |
map | thrpt | 1 | 10 | 126.434666 | 18.608547 | ops/ms | ONE_BIT_PER_WORD |
map | thrpt | 1 | 10 | 115.977840 | 20.449258 | ops/ms | SPARSE_1_16_WORD_RUN |
mapWithRunConsumer | thrpt | 1 | 10 | 199.186167 | 8.138446 | ops/ms | SPARSE_16_FULL_WORDS |
mapWithRunConsumer | thrpt | 1 | 10 | 64.230868 | 2.871434 | ops/ms | FULL |
mapWithRunConsumer | thrpt | 1 | 10 | 219.963063 | 4.257561 | ops/ms | ONE_BIT_PER_WORD |
mapWithRunConsumer | thrpt | 1 | 10 | 203.403804 | 6.907366 | ops/ms | SPARSE_1_16_WORD_RUN |
mapWithWordConsumer | thrpt | 1 | 10 | 229.822235 | 5.276084 | ops/ms | SPARSE_16_FULL_WORDS |
mapWithWordConsumer | thrpt | 1 | 10 | 48.381990 | 3.845642 | ops/ms | FULL |
mapWithWordConsumer | thrpt | 1 | 10 | 218.907803 | 5.331011 | ops/ms | ONE_BIT_PER_WORD |
mapWithWordConsumer | thrpt | 1 | 10 | 240.795280 | 10.204818 | ops/ms | SPARSE_1_16_WORD_RUN |
This is simply because the callback was vectorized, and the style of the RunConsumer
API allows this to be exploited. This can be seen with perfasm. Both the WordConsumer
and RunConsumer
are actually vectorized, but the thing to notice is that there are two hot regions in the WordConsumer benchmark: the iteration and the callback, this boundary is often crossed. On the other hand, the RunConsumer implementation spends most of its time in the callback.
WordConsumer
....[Hottest Region 1]..............................................................................
c2, com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub, version 172 (227 bytes)
0x000001c2aa13c788: ud2 ;*athrow {reexecute=0 rethrow=0 return_oop=0}
; - jdk.internal.util.Preconditions::checkFromToIndex@21
; - java.util.Objects::checkFromToIndex@4
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@47 (line 226)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0x000001c2aa13c78a: mov r8d,ecx
0.23% 0x000001c2aa13c78d: mov ecx,r8d ;*aload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@62 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.55% 0x000001c2aa13c790: vmovdqu ymm1,ymmword ptr [r9+r10*4+10h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@69 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.15% 0x000001c2aa13c797: vpmulld ymm1,ymm1,ymm1
3.72% 0x000001c2aa13c79c: vpmulld ymm1,ymm1,ymm2
16.02% 0x000001c2aa13c7a1: vmovdqu ymmword ptr [rdx+r10*4+10h],ymm1
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@78 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.69% 0x000001c2aa13c7a8: movsxd r8,r10d
1.55% 0x000001c2aa13c7ab: vmovdqu ymm1,ymmword ptr [r9+r8*4+30h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@69 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.46% 0x000001c2aa13c7b2: vpmulld ymm1,ymm1,ymm1
1.71% 0x000001c2aa13c7b7: vpmulld ymm1,ymm1,ymm2
3.20% 0x000001c2aa13c7bc: vmovdqu ymmword ptr [rdx+r8*4+30h],ymm1
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@78 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.07% 0x000001c2aa13c7c3: add r10d,10h ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@79 (line 227)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.70% 0x000001c2aa13c7c7: cmp r10d,r11d
0x000001c2aa13c7ca: jl 1c2aa13c790h ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1453625478::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1453625478::get$Lambda@5
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@10
; - java.lang.invoke.LambdaForm$MH/1166726978::linkToTargetMethod@5
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@6 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.02% 0x000001c2aa13c7cc: mov r8,qword ptr [r15+70h] ; ImmutableOopMap{r9=Oop rdx=Oop rax=Oop r13=NarrowOop xmm0=Oop [144]=Oop [152]=Oop [48]=Oop }
;*goto {reexecute=1 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@82 (line 227)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.50% 0x000001c2aa13c7d0: test dword ptr [r8],eax ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@82 (line 227)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
; {poll}
0.04% 0x000001c2aa13c7d3: cmp r10d,r11d
0x000001c2aa13c7d6: jl 1c2aa13c78ah
0.05% 0x000001c2aa13c7d8: mov r11d,dword ptr [rsp+5ch]
0.02% 0x000001c2aa13c7dd: add r11d,39h
1.57% 0x000001c2aa13c7e1: mov r8d,ecx
0.02% 0x000001c2aa13c7e4: cmp r8d,r11d
0.06% 0x000001c2aa13c7e7: mov ecx,80000000h
0.02% 0x000001c2aa13c7ec: cmovl r11d,ecx
1.50% 0x000001c2aa13c7f0: cmp r10d,r11d
0x000001c2aa13c7f3: jnl 1c2aa13c819h
0.02% 0x000001c2aa13c7f5: nop ;*aload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@62 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.06% 0x000001c2aa13c7f8: vmovdqu ymm1,ymmword ptr [r9+r10*4+10h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@69 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.21% 0x000001c2aa13c7ff: vpmulld ymm1,ymm1,ymm1
2.16% 0x000001c2aa13c804: vpmulld ymm1,ymm1,ymm2
1.80% 0x000001c2aa13c809: vmovdqu ymmword ptr [rdx+r10*4+10h],ymm1
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@78 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.56% 0x000001c2aa13c810: add r10d,8h ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@79 (line 227)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c814: cmp r10d,r11d
0x000001c2aa13c817: jl 1c2aa13c7f8h ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@59 (line 227)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c819: cmp r10d,r8d
0x000001c2aa13c81c: jnl 1c2aa13c83ah
0.01% 0x000001c2aa13c81e: nop ;*aload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@62 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.58% 0x000001c2aa13c820: mov ecx,dword ptr [r9+r10*4+10h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@69 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.03% 0x000001c2aa13c825: imul ecx,ecx
1.58% 0x000001c2aa13c828: imul ecx,dword ptr [rsp+58h]
0.03% 0x000001c2aa13c82d: mov dword ptr [rdx+r10*4+10h],ecx
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@78 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.56% 0x000001c2aa13c832: inc r10d ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@79 (line 227)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c835: cmp r10d,r8d
0x000001c2aa13c838: jl 1c2aa13c820h ;*putfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1453625478::<init>@6
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$43/1453625478::get$Lambda@5
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@10
; - java.lang.invoke.LambdaForm$MH/1166726978::linkToTargetMethod@5
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@6 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.55% 0x000001c2aa13c83a: mov r10,qword ptr [r15+70h]
0.01% 0x000001c2aa13c83e: inc esi ; ImmutableOopMap{rax=Oop r13=NarrowOop xmm0=Oop [144]=Oop [152]=Oop [48]=Oop }
;*goto {reexecute=1 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@78 (line 168)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.02% 0x000001c2aa13c840: test dword ptr [r10],eax ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@78 (line 168)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
; {poll}
0.02% 0x000001c2aa13c843: cmp esi,dword ptr [rsp+0a0h]
0x000001c2aa13c84a: jnl 1c2aa13cb2ah ;*aload_1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@10 (line 169)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.54% 0x000001c2aa13c850: mov r8,rax
0.01% 0x000001c2aa13c853: mov r14,qword ptr [rsp+90h]
0.01% 0x000001c2aa13c85b: mov rbx,qword ptr [rsp+50h]
0.01% 0x000001c2aa13c860: mov r10d,r13d
1.54% 0x000001c2aa13c863: vmovq rax,xmm0
0.01% 0x000001c2aa13c868: mov r9d,dword ptr [rsp+0a0h]
0.02% 0x000001c2aa13c870: jmp 1c2aa13c904h
0x000001c2aa13c875: mov r13,qword ptr [rsp+98h]
0x000001c2aa13c87d: mov r8,qword ptr [rsp+68h] ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@7 (line 168)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0x000001c2aa13c882: mov ebp,dword ptr [r8+18h] ;*getfield output {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@22 (line 141)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0x000001c2aa13c886: mov r10,qword ptr [rsp+30h]
0x000001c2aa13c88b: test r10,r10
....................................................................................................
53.26% <total for region 1>
....[Hottest Region 2]..............................................................................
c2, com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub, version 172 (391 bytes)
; implicit exception: dispatches to 0x000001c2aa13cdd6
0x000001c2aa13c8c8: test r11d,r11d
0x000001c2aa13c8cb: jne 1c2aa13cc5eh ;*ifeq {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@30 (line 144)
0x000001c2aa13c8d1: mov ebx,1h ;*invokespecial <init> {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::get$Lambda@5
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@10
; - java.lang.invoke.LambdaForm$MH/1166726978::linkToTargetMethod@5
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@12 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c8d6: mov r8,qword ptr [rsp+0a0h]
0.01% 0x000001c2aa13c8de: mov r10d,dword ptr [r8+10h] ;*getfield bitmap {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@2 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001c2aa13c8e2: mov r9d,dword ptr [r12+r10*8+0ch]
;*arraylength {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@6 (line 168)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
; implicit exception: dispatches to 0x000001c2aa13cdc6
0.04% 0x000001c2aa13c8e7: test r9d,r9d
0x000001c2aa13c8ea: jbe 1c2aa13cb2fh ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@7 (line 168)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001c2aa13c8f0: mov ecx,r9d
0x000001c2aa13c8f3: dec ecx
0x000001c2aa13c8f5: cmp ecx,r9d
0x000001c2aa13c8f8: jnb 1c2aa13cd1ah
0x000001c2aa13c8fe: lea rax,[r12+r10*8] ;*getfield bitmap {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@2 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0x000001c2aa13c902: xor esi,esi ;*aload_1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@10 (line 169)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c904: mov r11,qword ptr [rax+rsi*8+10h]
;*laload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@13 (line 169)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.57% 0x000001c2aa13c909: cmp r11,0ffffffffffffffffh
0x000001c2aa13c90d: jne 1c2aa13cccah ;*ifne {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::forEach@22 (line 170)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c913: mov edx,dword ptr [r8+14h] ;*getfield data {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@3 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c917: mov edi,dword ptr [r12+rdx*8+0ch]
;*arraylength {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@35 (line 225)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
; implicit exception: dispatches to 0x000001c2aa13cda6
0.01% 0x000001c2aa13c91c: mov dword ptr [rsp+0a0h],r9d
1.56% 0x000001c2aa13c924: mov r13d,dword ptr [r8+0ch] ;*getfield factor {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@11 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c928: mov r11d,esi
0.02% 0x000001c2aa13c92b: shl r11d,6h ;*imul {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@19 (line 223)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c92f: lea r9,[r12+rdx*8] ;*getfield data {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@3 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
1.55% 0x000001c2aa13c933: mov ecx,r11d
0.01% 0x000001c2aa13c936: add ecx,40h ;*imul {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@27 (line 224)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c939: mov ebp,dword ptr [r8+18h] ;*getfield output {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@7 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c93d: test r11d,r11d
1.55% 0x000001c2aa13c940: jl 1c2aa13ca62h ;*iflt {reexecute=0 rethrow=0 return_oop=0}
; - jdk.internal.util.Preconditions::checkFromToIndex@1
; - java.util.Objects::checkFromToIndex@4
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@36 (line 225)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c946: cmp r11d,ecx
0x000001c2aa13c949: jnle 1c2aa13ca62h ;*if_icmpgt {reexecute=0 rethrow=0 return_oop=0}
; - jdk.internal.util.Preconditions::checkFromToIndex@6
; - java.util.Objects::checkFromToIndex@4
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@36 (line 225)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c94f: cmp ecx,edi
0x000001c2aa13c951: jnle 1c2aa13ca62h ;*if_icmple {reexecute=0 rethrow=0 return_oop=0}
; - jdk.internal.util.Preconditions::checkFromToIndex@11
; - java.util.Objects::checkFromToIndex@4
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@36 (line 225)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.00% 0x000001c2aa13c957: mov dword ptr [rsp+60h],ecx
1.51% 0x000001c2aa13c95b: mov dword ptr [rsp+5ch],r11d
0.02% 0x000001c2aa13c960: mov dword ptr [rsp+58h],r13d
0.01% 0x000001c2aa13c965: mov ecx,edi
0.01% 0x000001c2aa13c967: vmovd xmm1,edx
1.48% 0x000001c2aa13c96b: vmovq xmm0,rax
0.02% 0x000001c2aa13c970: mov r13d,r10d
0.02% 0x000001c2aa13c973: mov qword ptr [rsp+50h],rbx
0.01% 0x000001c2aa13c978: mov qword ptr [rsp+90h],r14
1.52% 0x000001c2aa13c980: mov rax,r8
0.01% 0x000001c2aa13c983: mov edi,dword ptr [r12+rbp*8+0ch]
;*arraylength {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@46 (line 226)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
; implicit exception: dispatches to 0x000001c2aa13cdb6
0.01% 0x000001c2aa13c988: lea rdx,[r12+rbp*8] ;*getfield output {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@7 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.02% 0x000001c2aa13c98c: mov r10d,dword ptr [rsp+60h]
1.50% 0x000001c2aa13c991: cmp r10d,edi
0x000001c2aa13c994: jnle 1c2aa13cac2h ;*if_icmple {reexecute=0 rethrow=0 return_oop=0}
; - jdk.internal.util.Preconditions::checkFromToIndex@11
; - java.util.Objects::checkFromToIndex@4
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@47 (line 226)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13c99a: cmp r11d,r10d
0x000001c2aa13c99d: jnl 1c2aa13c83ah ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@59 (line 227)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.02% 0x000001c2aa13c9a3: cmp r11d,ecx
0x000001c2aa13c9a6: jnb 1c2aa13cc9ah
0.01% 0x000001c2aa13c9ac: movsxd r10,dword ptr [rsp+60h]
1.58% 0x000001c2aa13c9b1: movsxd r11,ecx
0.01% 0x000001c2aa13c9b4: dec r10
0.02% 0x000001c2aa13c9b7: cmp r10,r11
0x000001c2aa13c9ba: jnb 1c2aa13cc9ah
0.01% 0x000001c2aa13c9c0: mov r11d,dword ptr [rsp+5ch]
1.50% 0x000001c2aa13c9c5: cmp r11d,edi
0x000001c2aa13c9c8: jnb 1c2aa13cc9ah
0.02% 0x000001c2aa13c9ce: movsxd r11,edi
0.02% 0x000001c2aa13c9d1: cmp r10,r11
0x000001c2aa13c9d4: jnb 1c2aa13cc9ah
0.02% 0x000001c2aa13c9da: mov r11d,edx
1.62% 0x000001c2aa13c9dd: shr r11d,2h
0.02% 0x000001c2aa13c9e1: and r11d,7h
0.01% 0x000001c2aa13c9e5: add r11d,dword ptr [rsp+5ch]
0.02% 0x000001c2aa13c9ea: mov r8d,3h
1.55% 0x000001c2aa13c9f0: sub r8d,r11d
0.01% 0x000001c2aa13c9f3: and r8d,7h
0.01% 0x000001c2aa13c9f7: add r8d,dword ptr [rsp+5ch]
0.01% 0x000001c2aa13c9fc: inc r8d
1.58% 0x000001c2aa13c9ff: cmp r8d,dword ptr [rsp+60h]
0.02% 0x000001c2aa13ca04: mov ecx,dword ptr [rsp+60h]
0.02% 0x000001c2aa13ca08: cmovnle r8d,ecx
0.01% 0x000001c2aa13ca0c: mov r10d,dword ptr [rsp+5ch]
1.54% 0x000001c2aa13ca11: mov ebx,ecx ;*aload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@62 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.11% 0x000001c2aa13ca13: mov r11d,dword ptr [r9+r10*4+10h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@69 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
4.67% 0x000001c2aa13ca18: imul r11d,r11d
0.14% 0x000001c2aa13ca1c: imul r11d,dword ptr [rsp+58h]
4.67% 0x000001c2aa13ca22: mov dword ptr [rdx+r10*4+10h],r11d
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@78 (line 228)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.16% 0x000001c2aa13ca27: inc r10d ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@79 (line 227)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
4.63% 0x000001c2aa13ca2a: cmp r10d,r8d
0x000001c2aa13ca2d: jl 1c2aa13ca13h ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@59 (line 227)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0.01% 0x000001c2aa13ca2f: mov r11d,dword ptr [rsp+5ch]
0.01% 0x000001c2aa13ca34: add r11d,31h
0.02% 0x000001c2aa13ca38: mov r8d,ebx
1.48% 0x000001c2aa13ca3b: cmp r8d,r11d
0.01% 0x000001c2aa13ca3e: mov ebx,80000000h
0.02% 0x000001c2aa13ca43: cmovl r11d,ebx
0.04% 0x000001c2aa13ca47: cmp r10d,r11d
0x000001c2aa13ca4a: jnl 1c2aa13c819h
2.48% 0x000001c2aa13ca50: vpshufd xmm2,xmmword ptr [rsp+58h],0h
2.82% 0x000001c2aa13ca57: vinserti128 ymm2,ymm2,xmm2,1h
2.88% 0x000001c2aa13ca5d: jmp 1c2aa13c78dh ;*aload_3 {reexecute=0 rethrow=0 return_oop=0}
; - jdk.internal.util.Preconditions::checkFromToIndex@14
; - java.util.Objects::checkFromToIndex@4
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareForWord@36 (line 225)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithWordConsumer$7@14 (line 140)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1872198645::acceptWord@6
; - com.openkappa.simd.iterate.BitSetIterator::forEach@30 (line 171)
; - com.openkappa.simd.iterate.BitSetIterator::mapWithWordConsumer@17 (line 138)
; - com.openkappa.simd.iterate.generated.BitSetIterator_mapWithWordConsumer_jmhTest::mapWithWordConsumer_thrpt_jmhStub@17 (line 142)
0x000001c2aa13ca62: mov qword ptr [rsp+90h],r14
0x000001c2aa13ca6a: mov qword ptr [rsp+28h],r8
....................................................................................................
46.39% <total for region 2>
RunConsumer
....[Hottest Region 1]..............................................................................
c2, com.openkappa.simd.iterate.BitSetIterator$$Lambda$44.1209658195::acceptRun, version 166 (816 bytes)
# parm1: r9 = int
# [sp+0x50] (sp of caller)
0x0000016658954740: mov r10d,dword ptr [rdx+8h]
0x0000016658954744: shl r10,3h
0x0000016658954748: cmp rax,r10
0x000001665895474b: jne 166588c6d80h ; {runtime_call ic_miss_stub}
0x0000016658954751: nop
0x0000016658954754: nop dword ptr [rax+rax+0h]
0x000001665895475c: nop
[Verified Entry Point]
0.00% 0x0000016658954760: mov dword ptr [rsp+0ffffffffffff9000h],eax
0.00% 0x0000016658954767: push rbp
0x0000016658954768: sub rsp,40h ;*synchronization entry
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@-1
0x000001665895476c: mov ecx,dword ptr [rdx+0ch] ;*getfield arg$1 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@1
0.00% 0x000001665895476f: mov ebx,dword ptr [r12+rcx*8+14h]
;*getfield data {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@3 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
; implicit exception: dispatches to 0x0000016658954b76
0x0000016658954774: mov eax,dword ptr [r12+rbx*8+0ch]
;*arraylength {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@3 (line 211)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
; implicit exception: dispatches to 0x0000016658954b8e
0.06% 0x0000016658954779: mov r11d,dword ptr [r12+rcx*8+0ch]
;*getfield factor {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@11 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x000001665895477e: mov edi,dword ptr [r12+rcx*8+18h]
;*getfield output {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@7 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x0000016658954783: test r8d,r8d
0x0000016658954786: jl 16658954ab6h ;*iflt {reexecute=0 rethrow=0 return_oop=0}
; - jdk.internal.util.Preconditions::checkFromToIndex@1
; - java.util.Objects::checkFromToIndex@4
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@4 (line 211)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x000001665895478c: cmp r8d,r9d
0x000001665895478f: jnle 16658954ae6h ;*if_icmpgt {reexecute=0 rethrow=0 return_oop=0}
; - jdk.internal.util.Preconditions::checkFromToIndex@6
; - java.util.Objects::checkFromToIndex@4
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@4 (line 211)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x0000016658954795: cmp r9d,eax
0x0000016658954798: jnle 16658954b1ah ;*if_icmple {reexecute=0 rethrow=0 return_oop=0}
; - jdk.internal.util.Preconditions::checkFromToIndex@11
; - java.util.Objects::checkFromToIndex@4
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@4 (line 211)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x000001665895479e: mov ebp,dword ptr [r12+rdi*8+0ch]
;*arraylength {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@11 (line 212)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
; implicit exception: dispatches to 0x0000016658954b9e
0.05% 0x00000166589547a3: cmp r9d,ebp
0x00000166589547a6: jnle 16658954b4ah ;*if_icmple {reexecute=0 rethrow=0 return_oop=0}
; - jdk.internal.util.Preconditions::checkFromToIndex@11
; - java.util.Objects::checkFromToIndex@4
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@12 (line 212)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x00000166589547ac: cmp r8d,r9d
0x00000166589547af: jnl 16658954a81h ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@22 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x00000166589547b5: cmp r8d,eax
0x00000166589547b8: jnb 16658954a91h
0.00% 0x00000166589547be: movsxd r10,r9d
0x00000166589547c1: movsxd rcx,eax
0x00000166589547c4: dec r10
0x00000166589547c7: cmp r10,rcx
0x00000166589547ca: jnb 16658954a91h
0x00000166589547d0: cmp r8d,ebp
0x00000166589547d3: jnb 16658954a91h
0x00000166589547d9: movsxd rcx,ebp
0.01% 0x00000166589547dc: cmp r10,rcx
0x00000166589547df: jnb 16658954a91h
0.00% 0x00000166589547e5: shl rdi,3h ;*getfield output {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@7 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x00000166589547e9: lea rdx,[r12+rbx*8] ;*getfield data {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@3 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x00000166589547ed: mov r10d,edi
0.00% 0x00000166589547f0: shr r10d,2h
0.00% 0x00000166589547f4: and r10d,7h
0x00000166589547f8: add r10d,r8d
0x00000166589547fb: mov ecx,3h
0.00% 0x0000016658954800: sub ecx,r10d
0.00% 0x0000016658954803: and ecx,7h
0x0000016658954806: add ecx,r8d
0x0000016658954809: inc ecx
0.00% 0x000001665895480b: cmp ecx,r9d
0.00% 0x000001665895480e: cmovnle ecx,r9d ;*aload_3 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@25 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x0000016658954812: mov r10d,dword ptr [rdx+r8*4+10h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x0000016658954817: imul r10d,r10d
0.01% 0x000001665895481b: imul r10d,r11d
0.00% 0x000001665895481f: mov dword ptr [rdi+r8*4+10h],r10d
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x0000016658954824: inc r8d ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@41 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x0000016658954827: cmp r8d,ecx
0x000001665895482a: jl 16658954812h ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@22 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x000001665895482c: mov r10d,r9d
0x000001665895482f: add r10d,0ffffff81h
0.00% 0x0000016658954833: mov ebx,80000000h
0.00% 0x0000016658954838: cmp r9d,r10d
0x000001665895483b: cmovl r10d,ebx
0x000001665895483f: cmp r8d,r10d
0x0000016658954842: jnl 16658954a61h
0.00% 0x0000016658954848: vmovd xmm1,r11d
0x000001665895484d: vpshufd xmm1,xmm1,0h
0x0000016658954852: vinserti128 ymm1,ymm1,xmm1,1h ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@44 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x0000016658954858: nop dword ptr [rax+rax+0h] ;*aload_3 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@25 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.92% 0x0000016658954860: vmovdqu ymm0,ymmword ptr [rdx+r8*4+10h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
1.31% 0x0000016658954867: vpmulld ymm0,ymm0,ymm0
1.74% 0x000001665895486c: vpmulld ymm0,ymm0,ymm1
4.55% 0x0000016658954871: vmovdqu ymmword ptr [rdi+r8*4+10h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.69% 0x0000016658954878: movsxd rcx,r8d
0.01% 0x000001665895487b: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+30h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.41% 0x0000016658954881: vpmulld ymm0,ymm0,ymm0
0.78% 0x0000016658954886: vpmulld ymm0,ymm0,ymm1
0.83% 0x000001665895488b: vmovdqu ymmword ptr [rdi+rcx*4+30h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.25% 0x0000016658954891: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+50h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
1.29% 0x0000016658954897: vpmulld ymm0,ymm0,ymm0
1.51% 0x000001665895489c: vpmulld ymm0,ymm0,ymm1
3.65% 0x00000166589548a1: vmovdqu ymmword ptr [rdi+rcx*4+50h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.54% 0x00000166589548a7: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+70h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.31% 0x00000166589548ad: vpmulld ymm0,ymm0,ymm0
0.47% 0x00000166589548b2: vpmulld ymm0,ymm0,ymm1
1.11% 0x00000166589548b7: vmovdqu ymmword ptr [rdi+rcx*4+70h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.28% 0x00000166589548bd: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+90h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
1.17% 0x00000166589548c6: vpmulld ymm0,ymm0,ymm0
1.89% 0x00000166589548cb: vpmulld ymm0,ymm0,ymm1
3.56% 0x00000166589548d0: vmovdqu ymmword ptr [rdi+rcx*4+90h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.73% 0x00000166589548d9: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+0b0h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.21% 0x00000166589548e2: vpmulld ymm0,ymm0,ymm0
0.34% 0x00000166589548e7: vpmulld ymm0,ymm0,ymm1
1.29% 0x00000166589548ec: vmovdqu ymmword ptr [rdi+rcx*4+0b0h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.33% 0x00000166589548f5: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+0d0h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.97% 0x00000166589548fe: vpmulld ymm0,ymm0,ymm0
1.90% 0x0000016658954903: vpmulld ymm0,ymm0,ymm1
3.59% 0x0000016658954908: vmovdqu ymmword ptr [rdi+rcx*4+0d0h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.82% 0x0000016658954911: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+0f0h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.18% 0x000001665895491a: vpmulld ymm0,ymm0,ymm0
0.29% 0x000001665895491f: vpmulld ymm0,ymm0,ymm1
1.25% 0x0000016658954924: vmovdqu ymmword ptr [rdi+rcx*4+0f0h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.33% 0x000001665895492d: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+110h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
1.10% 0x0000016658954936: vpmulld ymm0,ymm0,ymm0
2.11% 0x000001665895493b: vpmulld ymm0,ymm0,ymm1
3.67% 0x0000016658954940: vmovdqu ymmword ptr [rdi+rcx*4+110h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.93% 0x0000016658954949: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+130h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.13% 0x0000016658954952: vpmulld ymm0,ymm0,ymm0
0.25% 0x0000016658954957: vpmulld ymm0,ymm0,ymm1
1.35% 0x000001665895495c: vmovdqu ymmword ptr [rdi+rcx*4+130h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.32% 0x0000016658954965: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+150h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.93% 0x000001665895496e: vpmulld ymm0,ymm0,ymm0
2.16% 0x0000016658954973: vpmulld ymm0,ymm0,ymm1
3.73% 0x0000016658954978: vmovdqu ymmword ptr [rdi+rcx*4+150h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.95% 0x0000016658954981: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+170h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.14% 0x000001665895498a: vpmulld ymm0,ymm0,ymm0
0.21% 0x000001665895498f: vpmulld ymm0,ymm0,ymm1
1.39% 0x0000016658954994: vmovdqu ymmword ptr [rdi+rcx*4+170h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.29% 0x000001665895499d: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+190h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
1.42% 0x00000166589549a6: vpmulld ymm0,ymm0,ymm0
2.61% 0x00000166589549ab: vpmulld ymm0,ymm0,ymm1
4.42% 0x00000166589549b0: vmovdqu ymmword ptr [rdi+rcx*4+190h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
1.01% 0x00000166589549b9: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+1b0h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.10% 0x00000166589549c2: vpmulld ymm0,ymm0,ymm0
0.17% 0x00000166589549c7: vpmulld ymm0,ymm0,ymm1
1.46% 0x00000166589549cc: vmovdqu ymmword ptr [rdi+rcx*4+1b0h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.27% 0x00000166589549d5: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+1d0h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
13.60% 0x00000166589549de: vpmulld ymm0,ymm0,ymm0
3.51% 0x00000166589549e3: vpmulld ymm0,ymm0,ymm1
4.69% 0x00000166589549e8: vmovdqu ymmword ptr [rdi+rcx*4+1d0h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
1.00% 0x00000166589549f1: vmovdqu ymm0,ymmword ptr [rdx+rcx*4+1f0h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.11% 0x00000166589549fa: vpmulld ymm0,ymm0,ymm0
0.15% 0x00000166589549ff: vpmulld ymm0,ymm0,ymm1
1.46% 0x0000016658954a04: vmovdqu ymmword ptr [rdi+rcx*4+1f0h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.26% 0x0000016658954a0d: add r8d,80h ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@41 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.01% 0x0000016658954a14: cmp r8d,r10d
0x0000016658954a17: jl 16658954860h ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@44 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x0000016658954a1d: mov r14,qword ptr [r15+70h] ; ImmutableOopMap{rdi=Oop rdx=Oop }
;*goto {reexecute=1 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@44 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.06% 0x0000016658954a21: test dword ptr [r14],eax ;*goto {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@44 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
; {poll}
0.17% 0x0000016658954a24: cmp r8d,r10d
0x0000016658954a27: jl 16658954860h
0x0000016658954a2d: mov r10d,r9d
0x0000016658954a30: add r10d,0fffffff9h
0x0000016658954a34: cmp r9d,r10d
0.00% 0x0000016658954a37: cmovl r10d,ebx
0x0000016658954a3b: cmp r8d,r10d
0x0000016658954a3e: jnl 16658954a61h ;*aload_3 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@25 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x0000016658954a40: vmovdqu ymm0,ymmword ptr [rdx+r8*4+10h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.14% 0x0000016658954a47: vpmulld ymm0,ymm0,ymm0
0.05% 0x0000016658954a4c: vpmulld ymm0,ymm0,ymm1
0.03% 0x0000016658954a51: vmovdqu ymmword ptr [rdi+r8*4+10h],ymm0
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.04% 0x0000016658954a58: add r8d,8h ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@41 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x0000016658954a5c: cmp r8d,r10d
0x0000016658954a5f: jl 16658954a40h ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@22 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x0000016658954a61: cmp r8d,r9d
0x0000016658954a64: jnl 16658954a81h
0x0000016658954a66: nop ;*aload_3 {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@25 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x0000016658954a68: mov ecx,dword ptr [rdx+r8*4+10h]
;*iaload {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@31 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x0000016658954a6d: imul ecx,ecx
0x0000016658954a70: imul ecx,r11d
0x0000016658954a74: mov dword ptr [rdi+r8*4+10h],ecx
;*iastore {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@40 (line 214)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x0000016658954a79: inc r8d ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@41 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0x0000016658954a7c: cmp r8d,r9d
0.00% 0x0000016658954a7f: jl 16658954a68h ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
; - com.openkappa.simd.iterate.BitSetIterator::scaleSquareInRun@22 (line 213)
; - com.openkappa.simd.iterate.BitSetIterator::lambda$mapWithRunConsumer$9@14 (line 148)
; - com.openkappa.simd.iterate.BitSetIterator$$Lambda$44/1209658195::acceptRun@6
0.00% 0x0000016658954a81: vzeroupper
0.00% 0x0000016658954a84: add rsp,40h
0x0000016658954a88: pop rbp
0.00% 0x0000016658954a89: mov r10,qword ptr [r15+70h]
0x0000016658954a8d: test dword ptr [r10],eax ; {poll_return}
0.00% 0x0000016658954a90: ret
0x0000016658954a91: mov edx,0ffffff86h
0x0000016658954a96: mov ebp,r9d
0x0000016658954a99: mov dword ptr [rsp],r11d
0x0000016658954a9d: mov dword ptr [rsp+4h],r8d
0x0000016658954aa2: mov dword ptr [rsp+8h],ebx
0x0000016658954aa6: mov dword ptr [rsp+0ch],edi
0x0000016658954aaa: nop
0x0000016658954aac: vzeroupper
0x0000016658954aaf: call 166588c8a00h ; ImmutableOopMap{[8]=NarrowOop [12]=NarrowOop }
;*aload_3 {reexecute=0 rethrow=0 return_oop=0}
....................................................................................................
96.10% <total for region 1>
Inlining
So far, everything has been inlined. Java optimistically assumes you only have one implementation and aggressively inlines at first, deoptimizing to add a branch when it sees a second implementation, deoptimizing again and replacing with a virtual call if it sees a third implementation. This doesn’t matter much usually, but the cost of this not only dwarfs any savings in an iteration strategy; it also prevents various optimizations which can be applied if the code is inlined. Once again, passing a batch of work into the callback completely ameliorates this, because even if the call is virtual, the callback itself might be hot and aggressively optimized. I haven’t benchmarked this because I think the point is self-evident to anyone who would read this far.
Number of Runs
It’s clear to see from the benchmark results that the best choice of iteration strategy is sensitive to what you want to do with the data, but also how it is arranged. It is well documented in database literature that real data sets tend to contain runs. If you are building a bitmap index on some attribute of your data, and you sort your data by that attribute, you will have as many bitmaps as you have attribute values, and each attribute value bitmap will contain a single run. This is almost true for any index on attributes correlated with the attribute chosen for the sort order, and is completely untrue for uncorellated attributes. There are a range of iteration strategies to choose from, and the best iteration strategy for one index may not be the best for another.
My benchmarks are available at GitHub.
Published at DZone with permission of Richard Startin, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments