[LLVMdev] AVX code gen
Kay Tiong Khoo
kkhoo at perfwizard.com
Thu Dec 12 08:11:06 PST 2013
For the list of cpus and features for the current target, you can try:
$ llvm-as < /dev/null | llc -mcpu=help
On Thu, Dec 12, 2013 at 8:57 AM, Arnold Schwaighofer <
aschwaighofer at apple.com> wrote:
> It probably does not pick the right processor architecture.
>
> You could try “clang -mavx” or “clang -march=corei7-avx” for ivy-bridge
> and “clang -march=core-avx2” or “clang -mavx2" for haswell.
>
> $ clang -march=core-avx2 -O3 -S -o - test.c
>
> .section __TEXT,__text,regular,pure_instructions
> .globl _f
> .align 4, 0x90
> _f: ## @f
> .cfi_startproc
> ## BB#0: ## %entry
> pushq %rbp
> Ltmp2:
> .cfi_def_cfa_offset 16
> Ltmp3:
> .cfi_offset %rbp, -16
> movq %rsp, %rbp
> Ltmp4:
> .cfi_def_cfa_register %rbp
> xorl %eax, %eax
> .align 4, 0x90
> LBB0_1: ## %vector.body
> ## =>This Inner Loop Header:
> Depth=1
> vmovups (%rdx,%rax,4), %ymm0
> vmulps (%rsi,%rax,4), %ymm0, %ymm0
> vaddps (%rdi,%rax,4), %ymm0, %ymm0
> vmovups %ymm0, (%rdi,%rax,4)
> addq $8, %rax
> cmpq $256, %rax ## imm = 0x100
> jne LBB0_1
> ## BB#2: ## %for.end
> popq %rbp
> vzeroupper
> ret
> .cfi_endproc
> $ cat test.c
> void f(float * restrict A, float * restrict B, float * restrict C) {
> for (int i = 0; i < 256; ++i)
> A[i] += C[i] *B[i];
> }
>
> $ clang -v
> clang version 3.5 (trunk 195376) (llvm/trunk 195372)
>
>
> Best,
> Arnold
>
> On Dec 11, 2013, at 2:59 PM, Ken Gahagan <ken.gahagan at gmail.com> wrote:
>
> > Hello -
> >
> > I found this post on the llvm blog:
> http://blog.llvm.org/2012/12/new-loop-vectorizer.html which makes me
> think that clang / llvm are capable of generating AVX with packed
> instructions as well as utilizing the full width of the YMM registers… I
> have an environment where icc generates these instructions (vmulps %ymm1,
> %ymm3, %ymm2 for example) but I can not get clang/llvm to generate such
> instructions (using the 3.3 release or either 3.4 rc1 or 3.4 rc2). I am
> new to clang / llvm so I may not be invoking the tools correctly but given
> that –fvectorize and –fslp-vectorize are on by default at 3.4 I would have
> thought that if the code is AVX-able by icc that clang / llvm would be able
> to do the same… The code is basic matrix multiplication written a number of
> ways (with and without transposition and such) as a performance measurement
> exercise.
> >
> > The environments I’ve tried are:
> > Intel Ivy Bridge-EX (pre-release hardware) running Red Hat Linux 6.5
> > Generic desktop with Haswell processor running Fedora 18
> >
> > If you have a moment to point me to the appropriate docs I’m happy to go
> learn on my own – but I’ve now googled for the better part of 3 days trying
> to find what invocation parameters I should use to get the desired use of
> packed AVX instructions and the YMM registers and I just can’t seem to get
> it right. I’m also grateful if you just send the correct invocation.
> >
> > I’ve actually started digging through the code as well - but since I am
> starting from zero it could take me a while to find an answer this way -
> just didn’t want you to think I’m not willing to try to find the answer on
> my own :-)
> >
> > Thank you,
> > Ken
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131212/e153ccd6/attachment.html>
More information about the llvm-dev
mailing list