Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 启用矢量化后的结果(略有不同)_C++_Vectorization_Precision_Eigen3 - Fatal编程技术网

C++ 启用矢量化后的结果(略有不同)

C++ 启用矢量化后的结果(略有不同),c++,vectorization,precision,eigen3,C++,Vectorization,Precision,Eigen3,我们的一个软件是使用Eigen(3.2.5)执行一些矩阵/向量相关计算。该软件是在这方面精心开发的,首先禁用所有选项和优化(包括使用-DEIGEN\u DONT\u VECTORIZE),并设置准确度测试 由于我们现在对更快的数值吞吐量感兴趣,我们已经开始在Eigen内部启用矢量化。然而,我们已经注意到,我们的一个测试现在给出了一个稍微不同的输出:与参考实现的差异大约是1e-4,而之前是1e-5 我们将在这个测试中稍微放宽一点精度(因为我们并不真正知道参考数据的准确性,我们有另一个合成数据的测试

我们的一个软件是使用Eigen(3.2.5)执行一些矩阵/向量相关计算。该软件是在这方面精心开发的,首先禁用所有选项和优化(包括使用
-DEIGEN\u DONT\u VECTORIZE
),并设置准确度测试

由于我们现在对更快的数值吞吐量感兴趣,我们已经开始在Eigen内部启用矢量化。然而,我们已经注意到,我们的一个测试现在给出了一个稍微不同的输出:与参考实现的差异大约是
1e-4
,而之前是
1e-5

我们将在这个测试中稍微放宽一点精度(因为我们并不真正知道参考数据的准确性,我们有另一个合成数据的测试用例,我们有一个精确的解决方案,并且仍然通过),但出于好奇:这种变化的可能原因是什么


如果相关,此计算涉及欧几里德范数。

这是意料之中的,因为启用矢量化时,浮点运算的执行顺序并不完全相同。这通常发生在涉及减法的表达式中,例如和、范数、矩阵乘积等。例如,让我们考虑下面的简单和:

float s = 0;
for(int i=0;i<n;i++)
  s += v[i];
float s=0;

对于(int i=0;i ),这是必须的,因为当启用矢量化时,浮点运算不是按完全相同的顺序执行的。这通常发生在涉及减法的表达式中,例如和、范数、矩阵积等。例如,让我们考虑下面的简单和:

float s = 0;
for(int i=0;i<n;i++)
  s += v[i];
float s=0;

对于(int i=0;i ),这是必须的,因为当启用矢量化时,浮点运算不是按完全相同的顺序执行的。这通常发生在涉及减法的表达式中,例如和、范数、矩阵积等。例如,让我们考虑下面的简单和:

float s = 0;
for(int i=0;i<n;i++)
  s += v[i];
float s=0;

对于(int i=0;i ),这是必须的,因为当启用矢量化时,浮点运算不是按完全相同的顺序执行的。这通常发生在涉及减法的表达式中,例如和、范数、矩阵积等。例如,让我们考虑下面的简单和:

float s = 0;
for(int i=0;i<n;i++)
  s += v[i];
float s=0;

对于(int i=0;i),如果我没有弄错,中间结果的内部精度也不同(在x86处理器上),标量(40和80位)的扩展精度与向量(32和64位)的正常精度不同,如果我没有弄错,中间结果的内部精度也不同(在x86处理器上),标量中的扩展精度(40和80位)与向量中的正常精度(32和64位)相比,如果我没有弄错的话,中间结果的内部精度也不同(在x86处理器上),标量中的扩展精度(40和80位)与向量中的正常精度(32和64位)如果我没有弄错的话,中间结果的内部精度也不同(在x86处理器上),标量的扩展精度(40和80位)与向量的正常精度(32和64位)