编译器(gcc)能否保证c ++循环
Can c++ loops be guaranteed by the compiler (gcc)?
我必须进行以下AVX操作:
__m256 perm, func;
__m256 in = _mm256_load_ps(inPtr+x);
__m256 acc = _mm256_setzero_ps();
perm = _mm256_shuffle_ps(in, in, _MM_SHUFFLE(3,2,1,0));
func = _mm256_load_ps(fPtr+0);
acc = _mm256_add_ps(acc, _mm256_mul_ps(perm, func));
perm = _mm256_shuffle_ps(in, in, _MM_SHUFFLE(2,3,0,1));
func = _mm256_load_ps(fPtr+1);
acc = _mm256_add_ps(acc, _mm256_mul_ps(perm, func));
perm = _mm256_shuffle_ps(in, in, _MM_SHUFFLE(1,0,3,2));
func = _mm256_load_ps(fPtr+2);
acc = _mm256_add_ps(acc, _mm256_mul_ps(perm, func));
perm = _mm256_shuffle_ps(in, in, _MM_SHUFFLE(0,1,2,3));
func = _mm256_load_ps(fPtr+3);
acc = _mm256_add_ps(acc, _mm256_mul_ps(perm, func));
这可以像这样重写:
__m256 perm, func;
__m256 in = _mm256_load_ps(inPtr+x);
__m256 acc = _mm256_setzero_ps();
for(int i=0;i<4;++i)
{
perm = _mm256_shuffle_ps(in, in, _MM_SHUFFLE(3^i,2^i,1^i,0^i));
func = _mm256_load_ps(fPtr+i);
acc = _mm256_add_ps(acc, _mm256_mul_ps(perm, func));
}
这在 gcc 4.9.1 中编译,尽管_mm256_shuffle_ps
只接受即时整数值作为第三个参数。这意味着,i
被接受为即时,因此意味着循环已经展开。
所以我很好奇:这是编译器保证的,还是在修改优化标志或 gcc 版本更改时导致编译错误?使用其他编译器(msvc,icc,clang...)怎么样?
内部函数确实需要一个即时值。编译之所以有效,只是因为它通过展开循环优化为常量,并且使用 -O0 进行编译确实会触发以下错误:
(...\lib\gcc\x86_64-w64-mingw32\4.9.2\include\avxintrin.h:331: 错误:最后一个参数必须是 8 位即时参数
__mask); ^
ICC在这里报告了类似的案例:
https://software.intel.com/en-us/forums/intel-c-compiler/topic/287217
相关文章:
- gcc 如何优化此循环?
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 为什么 std::count 比 MSVC 编译器的普通循环慢,但与 GCC 相等?
- GCC 优化了基于固定范围的 for 循环,就好像它具有更长的可变长度一样
- 循环中的前递增/减少与邮政为gcc和VisualC的增量/减少
- gcc优化对具有明显恒定变量的循环的影响
- 为什么 GCC 不能矢量化这个函数和循环
- 为什么clang和gcc在循环中重复代码和分支与无条件跳转
- Clang或GCC能够自动化手动展开的循环
- 如何使用某些参数展开某个循环,例如 GCC 中的最大展开时间
- GCC自动矢量化在减少循环中失败
- GCC 4.4 不实现 C++11 范围循环.它还支持哪些其他范围循环语法
- 为什么gcc抱怨我的循环
- c++ 中带有容器迭代器的循环类型依赖关系(GCC 失败,而 MSVC 正常)
- 编译器(gcc)能否保证c ++循环
- 对于循环在 gcc -O3 使用 OpenMP 优化后不会加速
- gcc和clang都无法编译循环程序
- 为什么具有多个嵌套循环的代码可以在 GCC 上立即完成,但在 VS 上需要很长时间
- 为什么GCC只需将未定义的行为放入循环中就可以允许它