iden3 / circom

zkSnark circuit compiler
GNU General Public License v3.0
1.25k stars 232 forks source link

cpp witness generation illegal instruction Fr_rawMMul #229

Closed rickardomc closed 6 months ago

rickardomc commented 6 months ago

multiplier2.circom (I also tried with another example proposed on the circom documentation):

pragma circom 2.0.0;

template Multiplier2() {
    signal input a;
    signal input b;
    signal output c;
    c <== a*b;
 }

component main = Multiplier2();

commands:

circom multiplier2.circom --c
cd multiplier2_cpp
#create input.json as {"a":"3", "b":"11"}
make
./multipler2 input.json witness.wtns

gdb error:

Program received signal SIGILL, Illegal instruction.
0x000055555555c91b in Fr_rawMMul ()

env:

OS: ubuntu 20.04.6LTS 64bit
processor: Intel® Core™ i5-4440 CPU @ 3.10GHz × 4 
gcc: 9.4.0
GMP: 6.2.0
nasm: 2.14.02-1
nlohmann-json3-dev 3.7.3-1
rickardomc commented 6 months ago

UPDATE It works with another computer. env:

OS: Fedora Linux 39 (Workstation Edition)
processor: Intel® Core™ i7-8550U × 8
gcc: 13.2.1
json-devel (nlohmann-json3-dev):3.11.2-3.fc39.x86_64
gmp-devel: 6.2.1-5.fc39.x86_64
nasm: 2.16.01-4.fc39.x86_64

These dependencies, compared to the ones I used on Ubuntu, are more recent. I did not further analyze it, but I think this is the reason. I'd suggest you to specify the right versions in the docs here https://github.com/iden3/circom/blob/12c92e060c0daeca982e787c120d73b507602225/mkdocs/docs/getting-started/computing-the-witness.md?plain=1#L51

visopsys commented 6 months ago

I got exactly the same problem. The witness generation fails on Intel based CPU but succeeds on AMD (both using Ubuntu 22). Not sure if this has a link with CPU architecture.

Extra libs that I installed on: build-essential libgmp-dev libsodium-dev nasm nlohmann-json3-dev libssl-dev zlib1g-dev. I think these are libs needed for either compiling c++ or snarkjs.

Error:

Program received signal SIGILL, Illegal instruction.
0x000055555555d94b in Fr_rawMMul ()

In my case, all the main dependency libs between 2 machines are exactly the same.

rickardomc commented 6 months ago

Did you use the same version as mine with Fedora (the most recent, the working ones)? @visopsys

visopsys commented 6 months ago

@rickardomc Both of my machines are using Ubuntu 22.

I am trying to install different OS version on the machine that fails. Will let you know the result.

rickardomc commented 6 months ago

Sorry, I forgot the subject... I was referring to the dependencies' version.

gcc: 13.2.1
json-devel (nlohmann-json3-dev):3.11.2-3.fc39.x86_64
gmp-devel: 6.2.1-5.fc39.x86_64
nasm: 2.16.01-4.fc39.x86_64
OBrezhniev commented 6 months ago

Hello @rickardomc @visopsys! You need processor with the support of ADX instructions (Intel Broadwell from 2014 or newer). i5-4440 is older Haswell microarchitecture, which doesn't have it.

visopsys commented 6 months ago

Thanks @OBrezhniev . This makes sense. The server that fails uses intel xeon e5-1650v3 chip which is based on Haswell architecture.

I think this issue can be closed