<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">On 8 Jan 2018, at 19:41, Linchuan Chen <<a href="mailto:chenlinc@cse.ohio-state.edu" class="">chenlinc@cse.ohio-state.edu</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Thanks Amara so much for the info!<div class=""><br class=""></div><div class="">One more question: what do people usually do if they want to generate vectorized code for some existing c/c++ code? </div><div class="">Do they usually do C/C++ source level transformation, or do at LLVM's IR level? </div><div class=""><br class=""></div><div class="">I know clang supports auto vectorizations, such as loop vectorization and SLP, but they are not flexible enough if we </div><div class="">want to do more custom vectorizations or handle more complex cases, for example, SLP might not be able to handle </div><div class="">branches in the code (or may be latest version already can handle branches using mask).</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Mon, Jan 8, 2018 at 11:30 AM, Amara Emerson via llvm-dev <span dir="ltr" class=""><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" class="">llvm-dev@lists.llvm.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space" class=""><span class=""><div class=""><blockquote type="cite" class=""><div class="">On 6 Jan 2018, at 00:26, Linchuan Chen via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" class="">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="m_-362332131631565623Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="">Hi everyone,</div><div class=""><br class=""></div>I'm quite new to LLVM, but am working on a project that might need to generate some SIMD code using LLVM. The SIMD code will be using INTEL MIC intrinsics and I'm not sure about the<div class="">steps and tool set that I need to use to generate those.</div><div class=""><br class=""></div><div class="">I also have a confusion on the following problems:</div><div class=""><ol class=""><li class="">Do people usually generate SIMD code at source code level, using __m512?</li><li class="">If not, does LLVM have corresponding IR instructions for the SIMD registers and instructions?</li></ol><div class=""><br class=""></div><div class="">Since I'm new, I would appreciate any help that could give me some directions at any level. Some references would also help. Thanks in advance!</div></div></div></div></blockquote></div><br class=""><div class=""><br class=""></div></span><div class="">Hi Linchuan,</div><div class=""><br class=""></div><div class="">I believe clang supports Intel AVX512 intrinsics so it should be possible to generate vector code using that.</div><div class=""><br class=""></div><div class="">For 2), LLVM has first class vector types such as <4 x i32> and can do the usual things on those types, including masking. The vectoriser is where most of the vector code that LLVM generates will originate from. These types aren’t target specific however, and there are no notions of vector “registers” at the IR level.</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Amara</div></div><br class="">______________________________<wbr class="">_________________<br class="">
LLVM Developers mailing list<br class="">
<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/llvm-dev</a><br class="">
</blockquote></div></div></div></blockquote></div><br class=""><div class=""><br class=""></div><div class="">The vast majority of the time people will rely on source level pragmas [1], LLVM IR is designed to be machine friendly, not something intended for users to manually edit themselves. You can do it, but it’s tedious and error prone. If you need more control over the vectorisation than the pragmas allow, then the C intrinsics are the best choice.</div><div class=""><br class=""></div><div class="">Amara</div><div class=""><br class=""></div><div class="">[1] <a href="http://clang.llvm.org/docs/LanguageExtensions.html#extensions-for-loop-hint-optimizations" class="">http://clang.llvm.org/docs/LanguageExtensions.html#extensions-for-loop-hint-optimizations</a></div><div class=""><br class=""></div></body></html>