<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jan 15, 2014 at 7:13 PM, Diego Novillo <span dir="ltr"><<a href="mailto:dnovillo@google.com" target="_blank">dnovillo@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I am starting to use the sample profiler to analyze new performance<br>
opportunities. The loop unroller has popped up in several of the<br>
benchmarks I'm running. In particular, libquantum. There is a ~12%<br>
opportunity when the runtime unroller is triggered.<br></blockquote><div><br></div><div>Pardon my ignorance, but what exactly does "runtime unroller" mean? In particular the "runtime" part of it. Just from the name I'm imagining JIT'ing an unrolled version on the fly, or choosing an unrolled version at runtime, but neither of those interpretations seems likely.</div>
<div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
This helps functions like quantum_sigma_x<br>
(<a href="http://sourcecodebrowser.com/libquantum/0.2.4/gates_8c_source.html#l00149" target="_blank">http://sourcecodebrowser.com/libquantum/0.2.4/gates_8c_source.html#l00149</a>).<br>
The function accounts for ~20% of total runtime. By allowing the<br>
runtime unroller, we can speedup the program by about 12%.<br>
<br>
I have been poking at the unroller a little bit. Currently, the<br>
runtime unroller is only triggered by a special flag or if the target<br>
states it in the unrolling preferences. We could also consult the<br>
block frequency information here. If the loop header has a higher<br>
relative frequency than the rest of the function, then we'd enable<br>
runtime unrolling.<br>
<br>
Chandler also pointed me at the vectorizer, which has its own<br>
unroller. However, the vectorizer only unrolls enough to serve the<br>
target, it's not as general as the runtime-triggered unroller. From<br>
what I've seen, it will get a maximum unroll factor of 2 on x86 (4 on<br>
avx targets). Additionally, the vectorizer only unrolls to aid<br>
reduction variables. When I forced the vectorizer to unroll these<br>
loops, the performance effects were nil.<br>
<br>
I'm currently looking at changing LoopUnroll::runOnLoop() to consult<br>
block frequency information for the loop header to decide whether to<br>
try runtime triggers for loops that don't have a constant trip count<br>
but could be partially peeled.<br>
<br>
Does that sound reasonable?<br>
<br>
<br>
Thanks.  Diego.<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div><br></div></div>