Mar*_*rkD 2 c++ optimization simd vectorization
当我分析我正在处理的代码时,一个特别的热点是以下循环:
for(int loc = start; loc<end; ++loc)
y[loc]+=a[offset+loc]*x[loc+d];
Run Code Online (Sandbox Code Playgroud)
数组y,a和x没有重叠.在我看来,像这样的循环应该很容易矢量化,但是当我使用g ++编译选项"-O3 -ftree-vectorize -ftree-vectorizer-verbose = 1"时,我没有得到这个特定循环被矢量化的迹象.但是,在上面的代码之前发生了一个循环:
for(int i=0; i<m; ++i)
y[i]=0;
Run Code Online (Sandbox Code Playgroud)
确实根据输出进行了矢量化.有关为什么第一个循环没有矢量化,或者我怎么能解决这个问题的想法?(我不是所有关于矢量化概念的人,所以我很可能错过了一些非常明显的东西)
根据Oli的建议,提高详细程度会产生以下注释(虽然我通常擅长阅读编译器警告/错误/输出,但我不知道这意味着什么):
./include/mv_ops.h:89: note: dependence distance = 0.
./include/mv_ops.h:89: note: accesses have the same alignment.
./include/mv_ops.h:89: note: dependence distance modulo vf == 0 between *D.50620_89 and *D.50620_89
./include/mv_ops.h:89: note: not vectorized: can't determine dependence between *D.50623_98 and *D.50620_89
Run Code Online (Sandbox Code Playgroud)
你需要告诉编译器x,y以及a不重叠.在C/C++术语中,这意味着告诉编译器这些指针不通过用restrict(或__restrict)声明它们来实现别名.gcc在假定没有别名时非常积极地进行优化,所以要小心.
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |