diff --git a/backend/groth16/bn254/prove_gpu.go b/backend/groth16/bn254/prove_gpu.go index fc1ec391d5..5a43fd896b 100644 --- a/backend/groth16/bn254/prove_gpu.go +++ b/backend/groth16/bn254/prove_gpu.go @@ -20,7 +20,6 @@ package groth16 import ( - "fmt" "math/big" "time" "unsafe" @@ -37,8 +36,6 @@ import ( "github.com/consensys/gnark/constraint/solver" "github.com/consensys/gnark/internal/utils" "github.com/consensys/gnark/logger" - goicicle "github.com/ingonyama-zk/icicle/goicicle" - icicle "github.com/ingonyama-zk/icicle/goicicle/curves/bn254" iciclegnark "github.com/ingonyama-zk/iciclegnark/curves/bn254" ) @@ -154,9 +151,11 @@ func Prove(r1cs *cs.R1CS, pk *ProvingKey, fullWitness witness.Witness, opts ...b } wireValuesASize := len(wireValuesA) scalarBytes := wireValuesASize * fr.Bytes - wireValuesADevicePtr, _ := goicicle.CudaMalloc(scalarBytes) - goicicle.CudaMemCpyHtoD[fr.Element](wireValuesADevicePtr, wireValuesA, scalarBytes) - iciclegnark.MontConvOnDevice(wireValuesADevicePtr, wireValuesASize, false) + + copyDone := make(chan unsafe.Pointer, 1) + iciclegnark.CopyToDevice(wireValuesA, scalarBytes, copyDone) + wireValuesADevicePtr := <-copyDone + wireValuesADevice = iciclegnark.OnDeviceData{ P: wireValuesADevicePtr, Size: wireValuesASize, @@ -175,9 +174,11 @@ func Prove(r1cs *cs.R1CS, pk *ProvingKey, fullWitness witness.Witness, opts ...b } wireValuesBSize := len(wireValuesB) scalarBytes := wireValuesBSize * fr.Bytes - wireValuesBDevicePtr, _ := goicicle.CudaMalloc(scalarBytes) - goicicle.CudaMemCpyHtoD[fr.Element](wireValuesBDevicePtr, wireValuesB, scalarBytes) - iciclegnark.MontConvOnDevice(wireValuesBDevicePtr, wireValuesBSize, false) + + copyDone := make(chan unsafe.Pointer, 1) + iciclegnark.CopyToDevice(wireValuesB, scalarBytes, copyDone) + wireValuesBDevicePtr := <-copyDone + wireValuesBDevice = iciclegnark.OnDeviceData{ P: wireValuesBDevicePtr, Size: wireValuesBSize, @@ -233,9 +234,6 @@ func Prove(r1cs *cs.R1CS, pk *ProvingKey, fullWitness witness.Witness, opts ...b } computeKRS := func() error { - // we could NOT split the Krs multiExp in 2, and just append pk.G1.K and pk.G1.Z - // however, having similar lengths for our tasks helps with parallelism - var krs, krs2, p1 curve.G1Jac sizeH := int(pk.Domain.Cardinality - 1) // comes from the fact the deg(H)=(n-1)+(n-1)-n=n-2 @@ -256,11 +254,13 @@ func Prove(r1cs *cs.R1CS, pk *ProvingKey, fullWitness witness.Witness, opts ...b } scalarBytes := len(scalars) * fr.Bytes - scalars_d, _ := goicicle.CudaMalloc(scalarBytes) - goicicle.CudaMemCpyHtoD[fr.Element](scalars_d, scalars, scalarBytes) - iciclegnark.MontConvOnDevice(scalars_d, len(scalars), false) + + copyDone := make(chan unsafe.Pointer, 1) + iciclegnark.CopyToDevice(scalars, scalarBytes, copyDone) + scalars_d := <-copyDone + krs, _, err = iciclegnark.MsmOnDevice(scalars_d, pk.G1Device.K, len(scalars), true) - goicicle.CudaFree(scalars_d) + iciclegnark.FreeDevicePointer(scalars_d) if err != nil { return err @@ -319,9 +319,9 @@ func Prove(r1cs *cs.R1CS, pk *ProvingKey, fullWitness witness.Witness, opts ...b log.Debug().Dur("took", time.Since(start)).Msg("prover done") go func() { - goicicle.CudaFree(wireValuesADevice.P) - goicicle.CudaFree(wireValuesBDevice.P) - goicicle.CudaFree(h) + iciclegnark.FreeDevicePointer(wireValuesADevice.P) + iciclegnark.FreeDevicePointer(wireValuesBDevice.P) + iciclegnark.FreeDevicePointer(h) }() return proof, nil @@ -395,7 +395,7 @@ func computeH(a, b, c []fr.Element, pk *ProvingKey) unsafe.Pointer { a_intt_d := iciclegnark.INttOnDevice(devicePointer, pk.DomainDevice.TwiddlesInv, nil, n, sizeBytes, false) iciclegnark.NttOnDevice(devicePointer, a_intt_d, pk.DomainDevice.Twiddles, pk.DomainDevice.CosetTable, n, n, sizeBytes, true) computeInttNttDone <- nil - goicicle.CudaFree(a_intt_d) + iciclegnark.FreeDevicePointer(a_intt_d) } go computeInttNttOnDevice(a_device) @@ -408,12 +408,12 @@ func computeH(a, b, c []fr.Element, pk *ProvingKey) unsafe.Pointer { h := iciclegnark.INttOnDevice(a_device, pk.DomainDevice.TwiddlesInv, pk.DomainDevice.CosetTableInv, n, sizeBytes, true) go func() { - goicicle.CudaFree(a_device) - goicicle.CudaFree(b_device) - goicicle.CudaFree(c_device) + iciclegnark.FreeDevicePointer(a_device) + iciclegnark.FreeDevicePointer(b_device) + iciclegnark.FreeDevicePointer(c_device) }() - icicle.ReverseScalars(h, n) + iciclegnark.ReverseScalars(h, n) return h } diff --git a/backend/groth16/bn254/setup_gpu.go b/backend/groth16/bn254/setup_gpu.go index 9475018d98..e051890080 100644 --- a/backend/groth16/bn254/setup_gpu.go +++ b/backend/groth16/bn254/setup_gpu.go @@ -30,7 +30,6 @@ import ( "github.com/consensys/gnark/backend/groth16/internal" "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/constraint/bn254" - icicle "github.com/ingonyama-zk/icicle/goicicle/curves/bn254" iciclegnark "github.com/ingonyama-zk/iciclegnark/curves/bn254" "math" "math/big" @@ -394,14 +393,12 @@ func (pk *ProvingKey) setupDevicePointers() error { go iciclegnark.CopyToDevice(denIcicleArr, sizeBytes, copyDenDone) /************************* Twiddles and Twiddles Inv ***************************/ - om_selector := int(math.Log(float64(n)) / math.Log(2)) - twiddlesInv_d_gen, twddles_err := icicle.GenerateTwiddles(n, om_selector, true) - + twiddlesInv_d_gen, twddles_err := iciclegnark.GenerateTwiddleFactors(n, true) if twddles_err != nil { return twddles_err } - twiddles_d_gen, twddles_err := icicle.GenerateTwiddles(n, om_selector, false) + twiddles_d_gen, twddles_err := iciclegnark.GenerateTwiddleFactors(n, false) if twddles_err != nil { return twddles_err } diff --git a/go.mod b/go.mod index 03d855a967..a1dd955fc9 100644 --- a/go.mod +++ b/go.mod @@ -10,8 +10,7 @@ require ( github.com/fxamacker/cbor/v2 v2.5.0 github.com/google/go-cmp v0.5.9 github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b - github.com/ingonyama-zk/icicle v0.0.0-20230907052343-04e5ff5d1af4 - github.com/ingonyama-zk/iciclegnark v0.0.0-20230914093448-b18f425e7e74 + github.com/ingonyama-zk/iciclegnark v0.1.0 github.com/leanovate/gopter v0.2.9 github.com/rs/zerolog v1.30.0 github.com/stretchr/testify v1.8.4 @@ -19,15 +18,14 @@ require ( golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 ) -require github.com/rogpeppe/go-internal v1.11.0 // indirect - require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/kr/text v0.2.0 // indirect + github.com/ingonyama-zk/icicle v0.0.0-20230928131117-97f0079e5c71 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/x448/float16 v0.8.4 // indirect golang.org/x/sys v0.11.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index a1a4fe1c04..af6fcb193c 100644 --- a/go.sum +++ b/go.sum @@ -7,7 +7,6 @@ github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH github.com/consensys/gnark-crypto v0.11.2 h1:GJjjtWJ+db1xGao7vTsOgAOGgjfPe7eRGPL+xxMX0qE= github.com/consensys/gnark-crypto v0.11.2/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fxamacker/cbor/v2 v2.5.0 h1:oHsG0V/Q6E/wqTS2O1Cozzsy69nqCiguo5Q1a1ADivE= @@ -18,13 +17,12 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo= github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/ingonyama-zk/icicle v0.0.0-20230907052343-04e5ff5d1af4 h1:3Va/VmQ+KZ0pI8eLRnS1j25eFzTQvjgfh6o85xbChcM= -github.com/ingonyama-zk/icicle v0.0.0-20230907052343-04e5ff5d1af4/go.mod h1:kAK8/EoN7fUEmakzgZIYdWy1a2rBnpCaZLqSHwZWxEk= -github.com/ingonyama-zk/iciclegnark v0.0.0-20230914093448-b18f425e7e74 h1:JuKkY/y6k1iYrudHTiekzQLKQGs12pp5danZa5eGLX0= -github.com/ingonyama-zk/iciclegnark v0.0.0-20230914093448-b18f425e7e74/go.mod h1:bPTeffNOZJtNcDx7SOYN0KQyGo49HNrk8wcIRqs5l80= +github.com/ingonyama-zk/icicle v0.0.0-20230928131117-97f0079e5c71 h1:YxI1RTPzpFJ3MBmxPl3Bo0F7ume7CmQEC1M9jL6CT94= +github.com/ingonyama-zk/icicle v0.0.0-20230928131117-97f0079e5c71/go.mod h1:kAK8/EoN7fUEmakzgZIYdWy1a2rBnpCaZLqSHwZWxEk= +github.com/ingonyama-zk/iciclegnark v0.1.0 h1:88MkEghzjQBMjrYRJFxZ9oR9CTIpB8NG2zLeCJSvXKQ= +github.com/ingonyama-zk/iciclegnark v0.1.0/go.mod h1:wz6+IpyHKs6UhMMoQpNqz1VY+ddfKqC/gRwR/64W6WU= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=