Skip to content

Commit

Permalink
update linking
Browse files Browse the repository at this point in the history
  • Loading branch information
kstoykov committed Sep 25, 2023
1 parent 3aaafd0 commit 0677cb7
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 67 deletions.
17 changes: 8 additions & 9 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,19 @@ import (
)

func main() {
if cpu.X86.HasAVX512F {
fmt.Println("Using AVX512")
} else if cpu.X86.HasAVX2 {
fmt.Println("Using AVX2")
} else {
fmt.Println("Using x64 instructions")
}
if runtime.GOOS == "linux" && runtime.GOARCH == "amd64" {
fmt.Println("Using vectorized version")
fmt.Println("Using C++ library version")
if cpu.X86.HasAVX512F {
fmt.Println("Using AVX512")
} else if cpu.X86.HasAVX2 {
fmt.Println("Using AVX2")
} else {
fmt.Println("Using x64 instructions")
}
} else {
fmt.Println("Using iden3 version")
}

// var SIZE int = 1000000
var SIZE int = 1000000
var TESTS int = 4

Expand Down
40 changes: 21 additions & 19 deletions makefile
Original file line number Diff line number Diff line change
@@ -1,33 +1,35 @@
LIBOMP_SYM_PATH := $(shell find /usr/lib/llvm-* -name "libomp.so")
LIBOMP_ABSOLUTE_PATH := $(shell readlink -f ${LIBOMP_SYM_PATH})
LIBOMP_BASENAME := $(shell basename ${LIBOMP_ABSOLUTE_PATH})
LIBOMP_SYM_PATH := $(shell find /usr/lib/llvm-* -name "libomp.so" 2> /dev/null)
ifdef LIBOMP_SYM_PATH
LIBOMP_ABSOLUTE_PATH := $(shell readlink -f ${LIBOMP_SYM_PATH})
LIBOMP_BASENAME := $(shell basename ${LIBOMP_ABSOLUTE_PATH})
endif
# LIBOMP_PATH := $(${LIBOMP_SYM_PATH} | sed 's/libomp.so//')

build-linux_x86_64:
cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux
cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux/libomp.so
g++ ./src/goldilocks/* ./src/cwrapper/CWrapper.h ./src/cwrapper/CWrapper.c -lgmp -lomp -fPIC -g -c -Wall -pthread -fopenmp -O2 -std=c++17 -L./build/linux
g++ --shared -o ./build/linux/libvectorizedposeidongold.linux.x86_64.so ./*.o
rm -rf ./*.o && rm -rf ./src/goldilocks/*.gch && rm -rf ./src/cwrapper/*.gch
@cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux
@cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux/libomp.so
@g++ ./src/goldilocks/* ./src/cwrapper/CWrapper.h ./src/cwrapper/CWrapper.c -lgmp -lomp -fPIC -g -c -Wall -pthread -fopenmp -O2 -std=c++17 -L./build/linux
@g++ --shared -o ./build/linux/libvectorizedposeidongold.linux.x86_64.so ./*.o
@rm -rf ./*.o && rm -rf ./src/goldilocks/*.gch && rm -rf ./src/cwrapper/*.gch

build-linux_x86_64-avx2:
cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux
cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux/libomp.so
g++ ./src/goldilocks/* ./src/cwrapper/CWrapper.h ./src/cwrapper/CWrapperAvx2.c -lgmp -lomp -fPIC -g -c -Wall -pthread -fopenmp -O2 -mavx2 -std=c++17 -L./build/linux -D __AVX2__
g++ --shared -o ./build/linux/libvectorizedposeidongold.linux.x86_64.avx2.so ./*.o
rm -rf ./*.o && rm -rf ./src/goldilocks/*.gch && rm -rf ./src/cwrapper/*.gch
@cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux
@cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux/libomp.so
@g++ ./src/goldilocks/* ./src/cwrapper/CWrapper.h ./src/cwrapper/CWrapperAvx2.c -lgmp -lomp -fPIC -g -c -Wall -pthread -fopenmp -O2 -mavx2 -std=c++17 -L./build/linux -D __AVX2__
@g++ --shared -o ./build/linux/libvectorizedposeidongold.linux.x86_64.avx2.so ./*.o
@rm -rf ./*.o && rm -rf ./src/goldilocks/*.gch && rm -rf ./src/cwrapper/*.gch

build-linux_x86_64-avx512:
cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux
cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux/libomp.so
g++ ./src/goldilocks/* ./src/cwrapper/CWrapper.h ./src/cwrapper/CWrapperAvx512.c -lgmp -lomp -fPIC -g -c -Wall -pthread -fopenmp -O2 -mavx2 -mavx512f -std=c++17 -L./build/linux -D __AVX512__
g++ --shared -o ./build/linux/libvectorizedposeidongold.linux.x86_64.avx512.so ./*.o
rm -rf ./*.o && rm -rf ./src/goldilocks/*.gch && rm -rf ./src/cwrapper/*.gch
@cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux
@cp $(LIBOMP_ABSOLUTE_PATH) ./build/linux/libomp.so
@g++ ./src/goldilocks/* ./src/cwrapper/CWrapper.h ./src/cwrapper/CWrapperAvx512.c -lgmp -lomp -fPIC -g -c -Wall -pthread -fopenmp -O2 -mavx2 -mavx512f -std=c++17 -L./build/linux -D __AVX512__
@g++ --shared -o ./build/linux/libvectorizedposeidongold.linux.x86_64.avx512.so ./*.o
@rm -rf ./*.o && rm -rf ./src/goldilocks/*.gch && rm -rf ./src/cwrapper/*.gch

build-apple_x86_64:
echo "Under development"
# g++ ./src/goldilocks/* ./src/cwrapper/CWrapper.h ./src/cwrapper/CWrapper.c -lgmp -lomp -fPIC -g -c -Wall -pthread -O2 -std=c++17 -L./build/macos -L/usr/local/opt/libomp/lib -I/usr/local/opt/libomp/include -L/usr/local/Cellar/gmp/6.2.1_1/lib -I/usr/local/Cellar/gmp/6.2.1_1/include

build-vectorizedposeidongold-test:
go build -mod=readonly -o ./build/vectorizedposeidongold -ldflags="-s -w" ./cmd
@go build -mod=readonly -o ./build/vectorizedposeidongold -ldflags="-s -w" ./cmd

2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Mac - x86_64: To be added

Mac - arm64: To be added

If architecture is not supported the code falblack to iden3 library
If architecture is not supported the code fallback to iden3 library

# Make

Expand Down
38 changes: 0 additions & 38 deletions src/vectorizedposeidongold/vectorizedposeidongold.go
Original file line number Diff line number Diff line change
@@ -1,21 +1,5 @@
package vectorizedposeidongold

/*
#cgo CFLAGS: -fPIC
#cgo CXXFLAGS: -fPIC
#cgo LDFLAGS: -Wl,-rpath,$ORIGIN/linux:${SRCDIR}/../../build/linux -fPIC -lvectorizedposeidongold.linux.x86_64 -lvectorizedposeidongold.linux.x86_64.avx2 -lvectorizedposeidongold.linux.x86_64.avx512 -lgmp -lomp -L${SRCDIR}/../../build/linux
#include "../../build/vectorizedposeidongold.h"
*/
import "C"

import (
"runtime"
"unsafe"

goldenposeidon "github.com/iden3/go-iden3-crypto/goldenposeidon"
"golang.org/x/sys/cpu"
)

func Hash(in [8]uint64, capacity [4]uint64) ([4]uint64, error) {
var result [4]uint64 = [4]uint64{0, 0, 0, 0}
HashWithResult(&in, &capacity, &result)
Expand All @@ -27,25 +11,3 @@ func HashDirect(in *[8]uint64, capacity *[4]uint64) [4]uint64 {
HashWithResult(in, capacity, &result)
return result
}

func HashWithResult(in *[8]uint64, capacity *[4]uint64, result *[4]uint64) {
cInput := (*C.ulonglong)(unsafe.Pointer(&in[0]))
cCapacity := (*C.ulonglong)(unsafe.Pointer(&capacity[0]))
cResult := (*C.ulonglong)(unsafe.Pointer(&result[0]))

if runtime.GOOS == "linux" && runtime.GOARCH == "amd64" {
if cpu.X86.HasAVX512F {
C.hashAvx512(cInput, cCapacity, cResult)
} else if cpu.X86.HasAVX2 {
C.hashAvx2(cInput, cCapacity, cResult)
} else {
C.hash(cInput, cCapacity, cResult)
}
} else {
res, _ := goldenposeidon.Hash(*in, *capacity)
result[0] = res[0]
result[1] = res[1]
result[2] = res[2]
result[3] = res[3]
}
}
15 changes: 15 additions & 0 deletions src/vectorizedposeidongold/vectorizedposeidongold_fallback.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//go:build !linux || !amd64

package vectorizedposeidongold

import (
goldenposeidon "github.com/iden3/go-iden3-crypto/goldenposeidon"
)

func HashWithResult(in *[8]uint64, capacity *[4]uint64, result *[4]uint64) {
res, _ := goldenposeidon.Hash(*in, *capacity)
result[0] = res[0]
result[1] = res[1]
result[2] = res[2]
result[3] = res[3]
}
39 changes: 39 additions & 0 deletions src/vectorizedposeidongold/vectorizedposeidongold_linux_x86_64.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//go:build linux && amd64

package vectorizedposeidongold

/*
#cgo CFLAGS: -fPIC
#cgo CXXFLAGS: -fPIC
#cgo LDFLAGS: -Wl,-rpath,$ORIGIN/linux:${SRCDIR}/../../build/linux -fPIC -lvectorizedposeidongold.linux.x86_64 -lvectorizedposeidongold.linux.x86_64.avx2 -lvectorizedposeidongold.linux.x86_64.avx512 -lgmp -lomp -L${SRCDIR}/../../build/linux
#include "../../build/vectorizedposeidongold.h"
*/
import "C"

import (
"unsafe"

"golang.org/x/sys/cpu"
)

func HashWithResult(in *[8]uint64, capacity *[4]uint64, result *[4]uint64) {
cInput := (*C.ulonglong)(unsafe.Pointer(&in[0]))
cCapacity := (*C.ulonglong)(unsafe.Pointer(&capacity[0]))
cResult := (*C.ulonglong)(unsafe.Pointer(&result[0]))

// if runtime.GOOS == "linux" && runtime.GOARCH == "amd64" {
if cpu.X86.HasAVX512F {
C.hashAvx512(cInput, cCapacity, cResult)
} else if cpu.X86.HasAVX2 {
C.hashAvx2(cInput, cCapacity, cResult)
} else {
C.hash(cInput, cCapacity, cResult)
}
// } else {
// res, _ := goldenposeidon.Hash(*in, *capacity)
// result[0] = res[0]
// result[1] = res[1]
// result[2] = res[2]
// result[3] = res[3]
// }
}

0 comments on commit 0677cb7

Please sign in to comment.