如何使GCC向量化此循环
how to enable gcc to vectorize this loop
我有这个循环,其中b2
是float
, x1
是float
的(特征c++)向量,a1
和a0
是int
。
for(int i=1;i<9;i++)
b2+=a0*(float)0.5*(std::log(fabs(x1(a1+a0*(i-1))))+std::log(fabs(x1(a1+a0*i))));
GCC的回报:
analyze_innermost: failed: evolution of base is not affine.
我想知道是否有一个简单的方法来重写循环,以允许GCC向量化它(我正在编译与所有不安全的选项启用…我这样做是为了学习)。
<标题>编辑:x1是一个特征构造。
标题>我会把它分成3个循环:
float t1[9];
float t2[9];
for (i = 0; i < 9; ++i) // (1) - gather input terms
t1[i] = x1(a1+a0*i);
for (i = 0; i < 9; ++i) // (2) - do expensive log/fabs operations
t2[i] = std::log(fabs(t1[i])); // with minimum redundancy
for (i = 1; i < 9; ++i) // (3) - wrap it all up
b2 += a0*0.5f*(t2[i-1] + t2[i]);
我怀疑(1)可能不是矢量化的(除非您有AVX2和聚集负载),但是(2)和(3)有合理的机会。
您的示例不能容易地向量化,因为您没有以顺序方式访问x1的条目。
对于顺序访问,它可以像这样向量化:ArrayXf x1;
b2 = (x1.segment(i,9).abs().log() + x1.segment(j,9).abs().log()).sum() * a0;
相关文章:
- 在无向图中打印循环
- Visual Studio 2017循环自动向量化问题
- 如何向用户显示特定错误,要求他/她使用循环再次提供输入?
- 循环矢量化001
- c++ tron 播放器光循环向一个方向移动
- 使用Windows中另一个进程的事件循环向Qt应用程序发送退出消息
- 使用循环向后打印一个char数组
- NEON向量化无符号字节积和:(a[i]-int1) * (b[i]-int2)
- 为什么GCC不自动向量化这个循环?
- 明确的向量化
- 英特尔编译器不能向量化这个简单的循环
- 用特征向量化表达式
- 对于小型查找表,表查找是可向量化的
- 向量化(SIMD)树操作
- 优化向量化嵌套循环
- 向量化短到浮点的转换
- 需要帮助向量化此代码
- 重叠数组的和,自动向量化,和限制
- 如何使GCC向量化此循环
- 使用循环向链表中添加随机数