我在为 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 处理器上使用它。 谢谢。
好点,感谢通知@carstenskyboxlabs !
我们应该强制执行此代码路径仅对x86
/ x64
,因为这是定义__emulu
指令的目标。
旁注:如果我能找到一种方法来测试 ARM 的 Visual Studio 编译,并将这样的测试自动化到 AppveyorCI 中,那就太好了。 它会发现这个问题,以及潜在的未来问题。
感谢您的回复。
我不确定我从未使用过 AppveyorCI,但我知道 VS/MSBuild 确实支持 UWP ARM 构建。
当我使用 CMake 和 Visual Studio 2019 运行这些步骤时:
cd cmake_unofficial
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -A ARM ..
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
分支
最有用的评论
当我使用 CMake 和 Visual Studio 2019 运行这些步骤时:
cd cmake_unofficial
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -A ARM ..
cmake --build .
我收到此错误:
我对 appveyor.yml 没有太多经验,但按照现有模式,我认为这将使您为 ARM 生成和运行: