ComputeLibrary icon indicating copy to clipboard operation
ComputeLibrary copied to clipboard

WOA native building error (Exception 0xC0000005 with CpuElementwiseUnaryKernel.cpp)

Open xengpro opened this issue 1 year ago • 14 comments

Output of 'strings libarm_compute.so | grep arm_compute_version':

Platform: Snapdragon 8cx Gen 3/ X Elite X1E78100

Operating System: Windows 11 (23h2/24h2)

Problem description: I've tried to build by following the guide from: https://arm-software.github.io/ComputeLibrary/latest/how_to_build.xhtml#S1_6_windows_host, but failed with error like:

PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: clang-cl @C:\\Users\\xeng\\AppData\\Local\\Temp\\tmpdeamyx7s.lnk
1.      <eof> parser at end of file
2.      Code generation
3.      Running pass 'Function Pass Manager' on module 'src\cpu\kernels\CpuElementwiseUnaryKernel.cpp'.
4.      Running pass 'AArch64 Instruction Selection' on function '@"?validate@CpuElementwiseUnaryKernel@kernels@cpu@arm_compute@@SA?AVStatus@4@W4ElementWiseUnary@4@AEBVITensorInfo@4@1@Z"'
Exception Code: 0xC0000005
#0 0x00007ff7aadc9f14 (C:\Program Files\LLVM\bin\clang-cl.exe+0x1829f14)
#1 0x00007ff7aadc88a0 (C:\Program Files\LLVM\bin\clang-cl.exe+0x18288a0)
#2 0x00007ff7aadc6a54 (C:\Program Files\LLVM\bin\clang-cl.exe+0x1826a54)
clang-cl: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 18.1.8
Target: aarch64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
clang-cl: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-cl: note: diagnostic msg: C:\Users\xeng\AppData\Local\Temp\CpuElementwiseUnaryKernel-33a8dd.cpp
clang-cl: note: diagnostic msg: C:\Users\xeng\AppData\Local\Temp\CpuElementwiseUnaryKernel-33a8dd.sh
clang-cl: note: diagnostic msg:

********************
scons: *** [build\src\cpu\kernels\CpuElementwiseUnaryKernel.obj] Error 1
^C^C^C^C
scons: *** [build\src\core\utils\FormatUtils.obj] Error 3221225786
scons: *** [build\src\runtime\Utils.obj] Error 3221225786
scons: *** [build\src\core\Utils.obj] Error 3221225786
^Cscons: *** [build\src\runtime\NEON\functions\NEDetectionPostProcessLayer.obj] Error 3221225786
scons: *** [build\src\cpu\operators\CpuGemmLowpMatrixMultiplyCore.obj] Error 3221225786
scons: Build interrupted.
scons: building terminated because of errors.
scons: writing .sconsign file.

I've tried code base v23.x and v24.07/08, all failed. The toolchain I used:

  • vs2022 arm64 17.10.x/17.11.x (msvc latest, which is v143 and it required clang 17 or later)
  • llvm: 17.0.6/18.1.8 woa releases from llvm-project, and 17.0.6 in vs2022
  • python x64 3.10.11/3.11.5 with SCons 4.8.0

logs attached: v24.08_xelite.zip

xengpro avatar Aug 23 '24 09:08 xengpro

Hi @xengpro

This seems to be a toolchain problem, could you please try with Clang 16 and let us know if that works?

Hope this helps.

morgolock avatar Aug 27 '24 09:08 morgolock

Hi @xengpro

This seems to be a toolchain problem, could you please try with Clang 16 and let us know if that works?

Hope this helps.

Hi @morgolock , I tried clang15 earlier, but vs2022 requires clang 17+: "Unexpected compiler version, expected Clang 17.0.0 or newer."

xengpro avatar Aug 27 '24 11:08 xengpro

Hi @xengpro

There seems to be a problem with the Clang toolchain in VS. In order to compile ACL you have to download the external Clang toolchain I mentioned above. Try downloading https://github.com/llvm/llvm-project/releases/tag/llvmorg-16.0.6 and building ACL with it. That's what we use in the team to build ACL natively on Windows.

Hope this helps.

morgolock avatar Aug 27 '24 12:08 morgolock

Hi @morgolock, Thanks for you help. But I've tried llvmorg-16.0.6 a few minutes earlier, and get same error.

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\yvals_core.h(898,1): error:
      static assertion failed: error STL1000: Unexpected compiler version, expected Clang 17.0.0 or newer.
_EMIT_STL_ERROR(STL1000, "Unexpected compiler version, expected Clang 17.0.0 or newer.");
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\yvals_core.h(519,44): note:
      expanded from macro '_EMIT_STL_ERROR'
#define _EMIT_STL_ERROR(NUMBER, MESSAGE)   static_assert(false, "error " #NUMBER ": " MESSAGE)
                                           ^             ~~~~~
1 error generated.
scons: *** [build\src\common\cpuinfo\CpuInfo.obj] Error 1
scons: building terminated because of errors.

C:\xeng\ACL>clang-cl -v
clang version 16.0.6
Target: aarch64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin

So it seems still not possible for ACL to build completely natively (with Visual Studio 2022 Arm64 build, which is 17.4 and newer ) on windows at the moment?

xengpro avatar Aug 27 '24 13:08 xengpro

Hi @xengpro

It's possible to build ACL natively using the toolchain I mentioned above, we have jobs building ACL every day natively on Windows. The problem with VS22 is that it does not support inline assembly for arm64 targets.

From what I see in the logs you shared there is a problem with your environment. In the error you shared above I see mention to Clang 17.0.0. It's likely your devenv is not properly setup. If you use the standalone Clang 16 toolchain you should see no references to Clang 17.

morgolock avatar Aug 27 '24 14:08 morgolock

Hi @morgolock ,

I'm using standalone clang.

In the error you shared above I see mention to Clang 17.0.0.

It mentions Clang 17 because it detects that Clang 16.0.6 doesn't meet its expectations. So I tried standalone version Clang 18.1.8 and 17.0.6 which can build but get stuck in CpuElementwiseUnaryKernel.cpp. Comments out a few lines in it can let the build proceed, but still stuck somewhere else like framework.cpp.

The problem with VS22 is that it does not support inline assembly for arm64 targets.

That's true. And the Clang (17.0.3) that comes with vs2022 also fails anyway. So on a X Elite Laptop, I'm using the following setup :

  • vs2022:
    • Version 17.11 arm64 build
    • workloads: desktop c++ (latest, v143), winsdk(22621), no llvm/clang component
  • LLVM woa: standalone version 17.0.6 and 18.1.8
  • Python arm64: 3.12.5 + SCons 4.8.0

It's possible to build ACL natively using the toolchain I mentioned above

Could you share the version of your vs2022 and msvc/winsdk workloads?

xengpro avatar Aug 28 '24 01:08 xengpro

Hi @xengpro

image

Snapdragon (TM) 8cx Gen 2 @ 3.15 GHz 3.15 GHz Windows 11 Enterprise Microsoft Visual Studio Community 2022 (ARM 64-bit) - Current Version 17.9.0

That's true. And the Clang (17.0.3) that comes with vs2022 also fails anyway.

It sounds like there is a problem with development environment and it is not properly setup.

morgolock avatar Aug 28 '24 08:08 morgolock

Hi @morgolock ,

It sounds like there is a problem with development environment and it is not properly setup.

The setup is supposed to be very straight forward, so I couldn't mess it up:

  • install vs2022 latest or newer than 17.4 for arm64 version, add "Desktop development with C++" and "Windows 11 SDK"
  • install llvm woa standalone version (and add to sys path)
  • install python arm64 version then pip install scons.

then for my setup, llvm fails be like:

  • 16.0.6 can't build due to not meeting VS2022 requirement
  • 17.0.6/18.1.8: 0xc000005 exception in CpuElementwiseUnaryKernel.cpp or stuck somewhere else

But thanks to you information, I changed the VS2022 to 17.9.7 and compilation succeeded with 'standalone=0'.

However, when build with with 'standalone=1', the arm_compute.dll is linked but arm_compute.lib not produced:

LINK : fatal error LNK1181: cannot open input file 'arm_compute.lib'
scons: *** [build\arm_compute_graph.dll] Error 1181

xengpro avatar Aug 29 '24 01:08 xengpro

Hi @xengpro

If you want to build a program that uses ACL you will have to link statically against arm_compute-static-lib.

However, when build with with 'standalone=1', the arm_compute.dll is linked but arm_compute.lib not produced:

Could you please share you full build command? It should build without errors with standalone=1. I'm building with VS22 version 17.9.0 + Clang 16.0.6

Hope this helps,

morgolock avatar Sep 04 '24 10:09 morgolock

However, when build with with 'standalone=1', the arm_compute.dll is linked but arm_compute.lib not produced:

Could you please share you full build command? It should build without errors with standalone=1. I'm building with VS22 version 17.9.0 + Clang 16.0.6

Really sorry for the typo. I was using 'standalone=0' when I was trying to get .dll files.

scons opencl=0 neon=1 os=windows examples=0 validation_tests=0 benchmark_examples=0 build=native Werror=0 exceptions=1 standalone=0 -j8 arch=arm64-v8.2-a

xengpro avatar Sep 16 '24 11:09 xengpro

Hi @xengpro

That's right, we only support building with standalone=1. This means that arm_compute_validation will link statically with arm_compute-static-lib. If you want to write a program that uses ACL you will have to also link statically with arm_compute-static-lib

Hope this helps.

morgolock avatar Sep 20 '24 13:09 morgolock

Hi @xengpro

I tried to compile ACL with clang 17 or later and I got the same error you reported. This is a problem in the compiler crashing. I've raised a bug in LLVM as the see: https://github.com/llvm/llvm-project/issues/108976

morgolock avatar Sep 23 '24 09:09 morgolock

I tried to compile ACL with clang 17 or later and I got the same error you reported. This is a problem in the compiler crashing. I've raised a bug in LLVM as the see: llvm/llvm-project#108976

Cool, thanks~!

That's right, we only support building with standalone=1.

Any plan to add standalone=0 support? Some program, such as onnx runtime, needs to change a lot to use static load.

xengpro avatar Sep 29 '24 01:09 xengpro

Hi @xengpro

Any plan to add standalone=0 support? Some program, such as onnx runtime, needs to change a lot to use static load.

No plans in the short term, we have more important things like multi_isa support for Windows. I'll have a look into it and see how much effort will be require to produce the DLLs that can be used from a standalone program.

The following patch will fix the problems you had when you tried to build ACL with clang17 and the latest version of VS22. I had to disable optimizations when building with clang 17 or later because the compilers would crash otherwise. We'll enable this again once the toolchain gets fixed.

Hope this helps

morgolock avatar Oct 10 '24 12:10 morgolock