Мне нужно выполнить следующие операции 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
? Что просходит? - person mindriot   schedule 03.03.2016const int
и спецификации Intel, похоже, утверждает то же самое. - person mindriot   schedule 03.03.2016const int
ничего не говорит, так как в языке нет ничего, что указывало бы, является ли параметр непосредственным. Кроме того, любой параметрimm
в документации по внутренним компонентам Intel означает немедленный. Это яснее в документации MSDN. И, наконец, использование не немедленного значения в gcc вызывает ошибку: последний аргумент должен быть 8-битным немедленным - person galinette   schedule 03.03.2016