g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
g++ 6.3, Kahan summation on avx intrinsics get serialized with volatile keyword
使用 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++ 的(。
相关文章:
- 求和 int 乘以双倍时的欠/过近似
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 递归求和任务的错误答案
- 向量值(字符串和整数)求和C++
- 通过 RCPP 中的索引求和
- 矩阵行求和与 RowMajor 和 ColMajor 数据排列的奇怪性能差异
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 如何使用循环对所有数字求和?
- 循环中的线程 Runnin 用于对 c++ 中的数字求和
- 使用动态数组求和和和求平均值
- 找到所有与自己求和的数字X的快速方法,去掉一个数字得到N
- 如何对堆栈中的所有项目求和?Postfix计算器
- MPI 归约操作中的求和顺序
- 在高通六边形处理器的word32上执行水平求和的最快方法是什么
- 模板化求和(参数...)可变参数函数无法编译
- 平衡数组索引,同时从左和右对数组求和
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 简单的计数和求和函数没有按照我预期的方式工作
- C++ 如何从文本文件中扫描二维数组并对行求和?
- Kahan求和算法在GCC编译时存在较大的计算错误