为Win32编译的Win64 SSE代码产生错误的性能计数器结果

aleksv

我有一个正常运行的SSE代码,该代码通常是为Win64编译的(我使用的是Intel C ++编译器14)。完成后,该代码(由SSE内部函数组成)还执行性能计数操作。当我为Win32编译相同的代码时,此操作存在问题。

操作很简单:

LARGE_INTEGER Count;
QueryPerformanceCounter( &Count );
uint64_t v = Count.QuadPart;
printf( "%llu\n", v );
printf( "%f\n", (double) v ); 

第一个printf打印正确的64位值。第二个printf产生-1。#IND00。

如果我手动分配v,该错误就会消失。

针对可能的缓冲区不足/溢出和未初始化的访问检查了代码。不知道怎么了 在Win64上没有这样的错误。

编译器产生以下代码:在该块上:

;;; LARGE_INTEGER Count;
;;; QueryPerformanceCounter( &Count );
    lea       eax, DWORD PTR [1408+esp]                     ;152.1
    push      eax                                           ;152.1
    call      DWORD PTR [__imp__QueryPerformanceCounter@4]  ;152.1
                            ; LOE ebx esi
.B1.94:                     ; Preds .B1.93

;;; uint64_t v = Count.QuadPart;
    mov       eax, DWORD PTR [1408+esp]                     ;153.14
    mov       edi, DWORD PTR [1412+esp]                     ;153.14
    mov       DWORD PTR [24+esp], eax                       ;153.14

;;; printf( "%llu\n", v );
    push      edi                                           ;154.1
    push      eax                                           ;154.1
    push      OFFSET FLAT: ??_C@_05A@?$CFllu?6?$AA@         ;154.1
    call      _printf                                       ;154.1
                            ; LOE ebx esi edi
.B1.344:                    ; Preds .B1.94
    add       esp, 12                                       ;154.1
                            ; LOE ebx esi edi
.B1.95:                     ; Preds .B1.344

;;; printf( "%f\n", (double) v ); 
    mov       DWORD PTR [esp], OFFSET FLAT: ??_C@_03A@?$CFf?6?$AA@ ;155.1
    mov       eax, DWORD PTR [24+esp]                       ;155.1
    mov       DWORD PTR [32+esp], eax                       ;155.1
    mov       DWORD PTR [36+esp], edi                       ;155.1
    fild      QWORD PTR [32+esp]                            ;155.1
    shr       edi, 31                                       ;155.1
    fadd      QWORD PTR [_2il0floatpacket.1575+edi*8]       ;155.1
    fstp      QWORD PTR [4+esp]                             ;155.1
    call      _printf                                       ;155.1

但是,如果我在第二次printf之后重复此部分:

QueryPerformanceCounter( &Count );
v = Count.QuadPart;
printf( "%f\n", (double) v );

printf打印正确的值。汇编代码有些不同:

;;; QueryPerformanceCounter( &Count );
    lea       eax, DWORD PTR [1408+esp]                     ;156.1
    push      eax                                           ;156.1
    call      DWORD PTR [__imp__QueryPerformanceCounter@4]  ;156.1
                            ; LOE ebx esi
.B1.97:                         ; Preds .B1.96

;;; v = Count.QuadPart;
;;; printf( "%f\n", (double) v );
    fild      QWORD PTR [1408+esp]                          ;158.1
    mov       eax, DWORD PTR [1412+esp]                     ;158.1
    shr       eax, 31                                       ;158.1
    mov       DWORD PTR [esp], OFFSET FLAT: ??_C@_03A@?$CFf?6?$AA@ ;158.1
    fadd      QWORD PTR [_2il0floatpacket.1575+eax*8]       ;158.1
    fstp      QWORD PTR [4+esp]                             ;158.1
    call      _printf                                       ;158.1
aleksv

找到了解决方案:执行SSE计算后,应调用_mm_empty()函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Delphi中,编译器指令WIN32和CPUX86,WIN64和CPUX64是否可以互换?

来自分类Dev

如何判断是否为PE Win32启用了/ GS编译器

来自分类Dev

使MSBuild编译具有Win32和Win64平台依赖项的项目

来自分类Dev

使用Visual Studio 2015 Win64编译MySQL连接器

来自分类Dev

为Win32和Win64开发的最低Visual Studio版本是哪个?

来自分类Dev

#ifdef WIN32 #elif WIN64 #endif

来自分类Dev

Python Win32:错误

来自分类Dev

C ++,Win32错误

来自分类Dev

资源编译器无法在Win32的资源脚本中编译枚举语句?

来自分类Dev

DSN连接问题(Win64应用程序连接到32Bit Postgres服务器)

来自分类Dev

win32 程序在 GCC 中编译但不是 G++ HDC 错误

来自分类Dev

Visual Studio:从win32更改为x64时,显示链接错误

来自分类Dev

Win32 :: Job产生错误,使用严格

来自分类Dev

Win32逻辑块预处理器显示为不活动

来自分类Dev

MSE将Google Chrome浏览器检测为PWS:Win32 / Zbot

来自分类Dev

osgi.os属性的“ win32”和“ win64”

来自分类Dev

python输出信息中的win32 ro win64?

来自分类Dev

python输出信息中的win32 ro win64?

来自分类Dev

可变函数在Win32中起作用,但在Win64中不起作用

来自分类Dev

在 WIN32 和 WIN64 中配置浮点单元上下文

来自分类Dev

win32 GetConsoleMode()错误代码6

来自分类Dev

win32 GetConsoleMode()错误代码6

来自分类Dev

用Nuitka编译任何Python程序后,我得到“不是有效的win32应用程序”错误

来自分类Dev

使用Eclipse Paho MQTT编译Visual C ++ Win32项目时出现LNK2019错误

来自分类Dev

Delphi编译器错误:个性化“ Delphi.Personality”和平台“ Win32”的编译器丢失或不可用

来自分类Dev

当我在x64位模式下编译MFC应用程序且在win32模式下没有问题时,错误lnk2019无法解析的符号sqlite3_open

来自分类Dev

VS团队服务中的生成过程错误地将Win32映射到x64

来自分类Dev

VS代码未定义_WIN32

来自分类Dev

在Win32应用程序中连续运行代码

Related 相关文章

  1. 1

    在Delphi中,编译器指令WIN32和CPUX86,WIN64和CPUX64是否可以互换?

  2. 2

    如何判断是否为PE Win32启用了/ GS编译器

  3. 3

    使MSBuild编译具有Win32和Win64平台依赖项的项目

  4. 4

    使用Visual Studio 2015 Win64编译MySQL连接器

  5. 5

    为Win32和Win64开发的最低Visual Studio版本是哪个?

  6. 6

    #ifdef WIN32 #elif WIN64 #endif

  7. 7

    Python Win32:错误

  8. 8

    C ++,Win32错误

  9. 9

    资源编译器无法在Win32的资源脚本中编译枚举语句?

  10. 10

    DSN连接问题(Win64应用程序连接到32Bit Postgres服务器)

  11. 11

    win32 程序在 GCC 中编译但不是 G++ HDC 错误

  12. 12

    Visual Studio:从win32更改为x64时,显示链接错误

  13. 13

    Win32 :: Job产生错误,使用严格

  14. 14

    Win32逻辑块预处理器显示为不活动

  15. 15

    MSE将Google Chrome浏览器检测为PWS:Win32 / Zbot

  16. 16

    osgi.os属性的“ win32”和“ win64”

  17. 17

    python输出信息中的win32 ro win64?

  18. 18

    python输出信息中的win32 ro win64?

  19. 19

    可变函数在Win32中起作用,但在Win64中不起作用

  20. 20

    在 WIN32 和 WIN64 中配置浮点单元上下文

  21. 21

    win32 GetConsoleMode()错误代码6

  22. 22

    win32 GetConsoleMode()错误代码6

  23. 23

    用Nuitka编译任何Python程序后,我得到“不是有效的win32应用程序”错误

  24. 24

    使用Eclipse Paho MQTT编译Visual C ++ Win32项目时出现LNK2019错误

  25. 25

    Delphi编译器错误:个性化“ Delphi.Personality”和平台“ Win32”的编译器丢失或不可用

  26. 26

    当我在x64位模式下编译MFC应用程序且在win32模式下没有问题时,错误lnk2019无法解析的符号sqlite3_open

  27. 27

    VS团队服务中的生成过程错误地将Win32映射到x64

  28. 28

    VS代码未定义_WIN32

  29. 29

    在Win32应用程序中连续运行代码

热门标签

归档