首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个C向量环不自动矢量化?

为什么这个C向量环不自动矢量化?
EN

Stack Overflow用户
提问于 2016-07-28 11:21:25
回答 1查看 562关注 0票数 3

我试图通过使用AVX本质优化一些代码。一个非常简单的测试用例编译,但告诉我,我的循环没有向量化,因为许多原因,我不明白。

这是完整的程序,simple.c

代码语言:javascript
复制
#include <math.h>
#include <stdlib.h>
#include <assert.h>
#include <immintrin.h>

int main(void)
{

  __m256 * x = (__m256 *) calloc(1024,sizeof(__m256));    

  for (int j=0;j<32;j++)
    x[j] = _mm256_set1_ps(1.); 

  return(0);
}

这是命令行: gcc simple.c -O1 -fopenmp -ffast- -lm -mavx2 -ftree-vectorize fopt-info-vec-错过

这是输出:

  • simple.c:11:3:注意:未向量化:不支持数据类型
  • simple.c:11:3:注意:无法确定向量化因子。
  • simple.c:6:5:注意:没有矢量化:在基本块中没有足够的数据参考。
  • simple.c:11:3:注意:没有矢量化:在基本块中没有足够的数据参考。
  • simple.c:6:5:注意:没有矢量化:在基本块中没有足够的数据参考。
  • simple.c:6:5:注意:没有矢量化:在基本块中没有足够的数据参考。

我有gcc 5.4版。

有人能帮我解释这些信息并理解发生了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-28 14:40:27

你已经在用内嵌来手动矢量化了,所以gcc没有什么可以自动矢量化的了。这会导致无趣的警告,我认为这是试图自动向量化内部或循环计数器增量的结果。

我从gcc 5.3获得了很好的asm (如果我不做一些愚蠢的事情,比如编写一个优化函数,或者只用关于戈德波特编译器浏览器编译它)。

代码语言:javascript
复制
#include <immintrin.h>

void set_to_1(__m256 * x) {
  for (int j=0;j<32;j++)
    x[j] = _mm256_set1_ps(1.); 
}

    push    rbp
    lea     rax, [rdi+1024]
    vmovaps ymm0, YMMWORD PTR .LC0[rip]
    mov     rbp, rsp
    push    r10                      # gcc is weird with r10 in functions with ymm vectors
.L2:                                 # this is the vector loop
    vmovaps YMMWORD PTR [rdi], ymm0
    add     rdi, 32
    cmp     rdi, rax
    jne     .L2
    vzeroupper
    pop     r10
    pop     rbp
    ret

.LC0:
    .long   1065353216
    ... repeated several times because gcc failed to use a vbroadcastss load or generate the constant on the fly

实际上,我从-O1那里得到了几乎相同的asm,但是使用-O1来优化事情并不是一个很好的方法来了解gcc到底会做什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38634899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档