相关疑难解决方法(0)

用于AVX和SSE的visual studio的cpu调度程序

我使用两台电脑.一个没有AVX支持,另一个没有AVX.让我的代码在运行时找到我的CPU支持的指令集并选择适当的代码路径会很方便.我遵循Agner Fog的建议来制作一个CPU调度员(http://www.agner.org/optimize/#vectorclass).但是,在我的机器上进行AVX编译并与visual studio链接时,启用AVX的代码会导致代码在运行时崩溃.

我的意思是例如我有两个源文件,其中一个SSE2指令集定义了一些SSE2指令,另一个源文件定义了AVX指令集和一些AVX指令.在我的主函数中,如果我只引用SSE2函数,代码仍会因启用了AVX和AVX指令的任何源代码而崩溃.我可以解决这个问题的任何线索?

编辑:好的,我想我已经解决了这个问题.我正在使用Agner Fog的矢量类,我已经定义了三个源文件:

//file sse2.cpp - compiled with /arch:SSE2
#include "vectorclass.h"
float func_sse2(const float* a) {
    Vec8f v1 = Vec8f().load(a);
    float sum = horizontal_add(v1);
    return sum;
}
//file avx.cpp - compiled with /arch:AVX
#include "vectorclass.h"
float func_avx(const float* a) {
    Vec8f v1 = Vec8f().load(a);
    float sum = horizontal_add(v1);
    return sum;
}
//file foo.cpp - compiled with /arch:SSE2
#include <stdio.h>
extern float func_sse2(const float* a);
extern float func_avx(const float* a);
int main() {
    float (*fp)(const float*a); …
Run Code Online (Sandbox Code Playgroud)

c++ sse avx visual-studio

8
推荐指数
2
解决办法
3301
查看次数

为什么Windows VM会产生与Linux不同的浮点输出?

问题

我们有多台运行Ubuntu的机器具有非常相似的规格.我们运行了一个简单的程序来验证我们在Windows VM中看到的每个机器正在运行的问题.在64位Linux计算机上使用gcc 4.8.4编译,在64位Windows VM上使用Visual Studio中的v140编译.

#include <cmath>
#include <stdio.h>

int main()
{
  double num = 1.56497856262158219209;
  double numHalf = num / 2.0;

  double cosVal = cos(num);
  double cosValHalf = cos(numHalf);

  printf("num = %a\n", num);
  printf("numHalf = %af\n", numHalf);
  printf("cosVal(num) = %a\n", cosVal);
  printf("cosValHalf(numHalf) = %a\n", cosValHalf);

  //system("pause");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在具有某些CPU的主机上运行相同的二进制文件时会出现此问题.

结果

在Linux上,所有机器都产生相同的输出.在Windows VM上,即使VM版本和设置相同,也会产生不同的结果.另外,每个VM上生成的二进制文件在移动到不同的主机时会产生不同的结果.即在VM2中生成但在LM1上执行的二进制文件返回与VM1生成二进制文件相同的结果.我们甚至复制了虚拟机来确认这种行为,并且确定它仍在继续.

通过上述努力,我认为它不是库差异或VM问题.至于输出,以下CPU产生以下结果:

  • 英特尔®至强(R)CPU E5-2630 0
  • 英特尔®至强(R)CPU E5-2630 v2

以前的CPU在Linux和Windows之间产生统一的结果.结果是十六进制,因为可读性比是否存在差异更重要.

num = 0x1.90a26f616699cp+0
numHalf = 0x1.90a26f616699cp-1
cosVal(num) = 0x1.7d4555e817bdcp-8
cosValHalf(numHalf) = 0x1.6b171bb5e3434p-1
Run Code Online (Sandbox Code Playgroud)

这些CPU在Windows VM上产生的结果与Linux相同:

  • 英特尔®至强(R)CPU E5-2630 v3 …

linux windows precision cpu-architecture virtual-machine

5
推荐指数
1
解决办法
78
查看次数

C++ 浮点数差异

我试图在 2 个不同的平台上获得完全相同的结果,即 Solaris 和 Linux(sun-studio vs GCC)。整个代码使用双数据类型。但是当我打印输出时,我看到浮点数的差异(如小数点后 20 位)。

我需要知道的是我是否可以设置一些编译器标志来使 GCC 和 sun-studio 编译器的行为相同。附加图像显示了 Double 数据类型的差异。左侧是 GCC 的输出,另一侧是 sun-studio。

在此处输入图片说明

c++ gcc

3
推荐指数
1
解决办法
238
查看次数