Xxhash: XXH3 和 Windows ARM 版本

创建于 2019-06-27  ·  6评论  ·  资料来源: Cyan4973/xxHash

我在为 ARM 架构构建时在 Widows 上使用xxh3.h有问题。
问题是__emulu是一个仅限 x64/x86 的 Windows 内部宏( MS Docs )。

/* U64 XXH_mult32to64(U32 a, U64 b) { return (U64)a * (U64)b; } */
#ifdef _MSC_VER
#   include <intrin.h>
    /* MSVC doesn't do a good job with the mull detection. */
#   define XXH_mult32to64 __emulu
#else
#   define XXH_mult32to64(x, y) ((U64)((x) & 0xFFFFFFFF) * (U64)((y) & 0xFFFFFFFF))
#endif

定义它的地方只在使用它之前检查_MSC_VER 。 如果这也可以检查架构,那将非常有帮助。 要么在 ARM 时不包括它,要么只在 x64/x86 处理器上使用它。 谢谢。

最有用的评论

当我使用 CMake 和 Visual Studio 2019 运行这些步骤时:

  1. cd cmake_unofficial
  2. mkdir build
  3. cd build
  4. cmake -G "Visual Studio 16 2019" -A ARM ..
  5. cmake --build .

我收到此错误:

xxhash.obj : error LNK2019: unresolved external symbol __emulu referenced in function XXH3_mul128_fold64 [C:\Users\steve\Do
cuments\xxHash\cmake_unofficial\build\xxhash.vcxproj]
C:\Users\steve\Documents\xxHash\cmake_unofficial\build\Debug\xxhash.dll : fatal error LNK1120: 1 unresolved externals [C:\U
sers\steve\Documents\xxHash\cmake_unofficial\build\xxhash.vcxproj]

我对 appveyor.yml 没有太多经验,但按照现有模式,我认为这将使您为 ARM 生成和运行:

- if "%PLATFORM%"=="visual_arm" (
      cd cmake_unofficial &&
      cmake . -DCMAKE_BUILD_TYPE=Release -A ARM &&
      cmake --build . --config Release
  )

所有6条评论

好点,感谢通知@carstenskyboxlabs

我们应该强制执行此代码路径仅对x86 / x64 ,因为这是定义__emulu指令的目标。

旁注:如果我能找到一种方法来测试 ARM 的 Visual Studio 编译,并将这样的测试自动化到 AppveyorCI 中,那就太好了。 它会发现这个问题,以及潜在的未来问题。

感谢您的回复。
我不确定我从未使用过 AppveyorCI,但我知道 VS/MSBuild 确实支持 UWP ARM 构建。

当我使用 CMake 和 Visual Studio 2019 运行这些步骤时:

  1. cd cmake_unofficial
  2. mkdir build
  3. cd build
  4. cmake -G "Visual Studio 16 2019" -A ARM ..
  5. cmake --build .

我收到此错误:

xxhash.obj : error LNK2019: unresolved external symbol __emulu referenced in function XXH3_mul128_fold64 [C:\Users\steve\Do
cuments\xxHash\cmake_unofficial\build\xxhash.vcxproj]
C:\Users\steve\Documents\xxHash\cmake_unofficial\build\Debug\xxhash.dll : fatal error LNK1120: 1 unresolved externals [C:\U
sers\steve\Documents\xxHash\cmake_unofficial\build\xxhash.vcxproj]

我对 appveyor.yml 没有太多经验,但按照现有模式,我认为这将使您为 ARM 生成和运行:

- if "%PLATFORM%"=="visual_arm" (
      cd cmake_unofficial &&
      cmake . -DCMAKE_BUILD_TYPE=Release -A ARM &&
      cmake --build . --config Release
  )

感谢@v-strob 的提示! 值得一试!

这应该可以工作。 它应该修复 ARM 编译,它应该提高 x64 性能

#if defined(_MSC_VER) && defined(_M_IX86)
#    include <intrin.h>
#    define XXH_mult32to64 __emulu
#else
#    define XXH_mult32to64(x, y) ((U64)((x) & 0xFFFFFFFF) * (U64)((y) & 0xFFFFFFFF))
#endif

固定在dev分支

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

jvriezen picture jvriezen  ·  6评论

easyaspi314 picture easyaspi314  ·  6评论

devnoname120 picture devnoname120  ·  8评论

WayneD picture WayneD  ·  7评论

hiqbn picture hiqbn  ·  7评论