Xxhash: Versions XXH3 et Windows ARM

Créé le 27 juin 2019  ·  6Commentaires  ·  Source: Cyan4973/xxHash

J'ai un problème avec l'utilisation de xxh3.h sur Widows lors de la construction d'une architecture ARM.
Le problème est que __emulu est une macro interne x64/x86 uniquement 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

Là où il est défini, il ne vérifie qu'un _MSC_VER avant de l'utiliser. Ce serait très utile si cela pouvait également vérifier l'architecture. Dites soit en ne l'incluant pas lors de l'ARM ou en l'utilisant uniquement sur les processeurs x64/x86. Merci.

bug

Commentaire le plus utile

Lorsque j'exécute ces étapes à l'aide de CMake et 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 .

J'obtiens cette erreur :

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]

Je n'ai pas beaucoup d'expérience avec appveyor.yml, mais en suivant le modèle existant, je pense que cela vous permettra de générer et d'exécuter pour ARM :

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

Tous les 6 commentaires

Bon point, merci pour la notification @carstenskyboxlabs !

Nous devrions probablement imposer que ce chemin de code n'est valide que pour x86 / x64 , puisque c'est la cible où l'instruction __emulu est définie .

Remarque : ce serait formidable si je pouvais trouver un moyen de tester la compilation Visual Studio pour ARM et d' automatiser un tel test dans AppveyorCI . Il aurait attrapé ce problème, et d'éventuels futurs.

Merci pour la réponse.
Je ne suis pas sûr de n'avoir jamais utilisé AppveyorCI, mais je sais que VS/MSBuild prend en charge les builds UWP ARM.

Lorsque j'exécute ces étapes à l'aide de CMake et 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 .

J'obtiens cette erreur :

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]

Je n'ai pas beaucoup d'expérience avec appveyor.yml, mais en suivant le modèle existant, je pense que cela vous permettra de générer et d'exécuter pour ARM :

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

Merci @v-strob pour l'astuce ! Ça vaut le coup d'essayer !

Cela devrait probablement fonctionner. Cela devrait corriger la compilation ARM et améliorer les performances 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

Fixé dans la branche dev

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

shuffle2 picture shuffle2  ·  6Commentaires

devnoname120 picture devnoname120  ·  8Commentaires

xinglin picture xinglin  ·  6Commentaires

witedragen picture witedragen  ·  3Commentaires

ifduyue picture ifduyue  ·  8Commentaires