g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化

g++ 6.3, Kahan summation on avx intrinsics get serialized with volatile keyword

本文关键字:求和 Kahan 易失性 关键字 序列化 avx 函数 g++      更新时间:2023-10-16

使用 avx 内联函数和 Kahan 求和算法,我试过这个(只是"adder"的一部分(:

void add(const __m256 valuesToAdd)
{
volatile __m256 y = _mm256_sub_ps(valuesToAdd, accumulatedError);
volatile __m256 t = _mm256_add_ps(accumulator,y);
accumulatedError = _mm256_sub_ps( _mm256_sub_ps(t,accumulator),y);
accumulator = t;
}

没有错误,但是当我检查反汇编(性能记录,ubuntu中的报告(时,它显示了累加器的所有元素,y和累加错误变量都是以标量方式逐个计算的。

问:如何定义一个内部变量,该变量可以保持其"操作顺序",并且仍然可以在内部指令中使用(作为矢量化(而不被优化?

为了确保它确实是标量,我删除了易失性,它变得更快。

有没有办法告诉 gcc 我需要矢量化的变量/代码,但没有其他要触及的东西?

如果您只想显式阻止关联数学优化,请不要使用volatile,而是使用函数属性禁用它们:

__attribute__ ((optimize("no-fast-math"))) 
inline void add(const __m256 &valuesToAdd) 
{
__m256 y = _mm256_sub_ps(valuesToAdd, accumulatedError);
__m256 t = _mm256_add_ps(accumulator, y);
accumulatedError = _mm256_sub_ps(_mm256_sub_ps(t, accumulator), y);
accumulator = t;
}

现场演示。使用编译标志和属性。此属性似乎不适用于 clang(我想有等效的东西,但你的问题是特定于 g++ 的(。