gpt4 book ai didi

c++ - 编译器 (gcc) 可以保证 c++ 循环吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:01 28 4
gpt4 key购买 nike

我必须进行以下 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: error: the last argument must be an 8-bit immediate

      __mask);
^

这里的 icc 报告了一个类似的案例:

https://software.intel.com/en-us/forums/intel-c-compiler/topic/287217

关于c++ - 编译器 (gcc) 可以保证 c++ 循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35767318/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com