From 9789dcb2b660e2442116e81fb9422bf7315dbbed Mon Sep 17 00:00:00 2001 From: Evgeniy Kulikov Date: Thu, 16 Jan 2020 10:52:36 +0300 Subject: [PATCH 1/3] Ignore vendor and binary --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ba7ea82..519795c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,7 @@ *.test # Output of the go coverage tool, specifically when used with LiteIDE -*.out \ No newline at end of file +*.out + +vendor +tzsum From d4b45131cd18daaa5ef01e44a60be6b980e465cb Mon Sep 17 00:00:00 2001 From: Evgeniy Kulikov Date: Thu, 16 Jan 2020 10:54:22 +0300 Subject: [PATCH 2/3] Update alpine image, fixup for Makefile, fixup for benchmark --- Dockerfile | 4 ++-- Makefile | 17 ++++++++++++----- benchmark | 8 +++----- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index 92b6036..7e6c0bd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.11-alpine3.8 as builder +FROM golang:1-alpine as builder RUN set -x \ && apk add --no-cache \ @@ -28,7 +28,7 @@ RUN set -x \ && go build -mod=vendor -o /go/bin/homo ./cmd/homo/main.go # Executable image -FROM alpine:3.8 +FROM alpine:3.11 WORKDIR /fixtures diff --git a/Makefile b/Makefile index b5a6677..49acee5 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,8 @@ R=\033[0m NAME ?= homo -.PHONY: help attach auto up down +.PHONY: help attach auto up down deps + # Show this help prompt help: @echo ' Usage:' @@ -15,22 +16,28 @@ help: @echo '' @awk '/^#/{ comment = substr($$0,3) } comment && /^[a-zA-Z][a-zA-Z0-9_-]+ ?:/{ print " ", $$1, comment }' $(MAKEFILE_LIST) | column -t -s ':' | grep -v 'IGNORE' | sort | uniq +# Install dependencies +deps: + @go mod tidy -v + @go mod vendor + # Auto Tillich-Zémor hasher demo -auto: down +auto: down deps @echo "\n${B}${G}build container${R}\n" @time docker build -t poc-demo . @echo "\n${B}${G}Bootup container:${R}\n" @time docker run -d --rm -it --name hash-demo poc-demo:latest sh @bash ./auto.sh + @make down # Stop demo container down: @echo "\n${B}${G}Stop container${R}\n" - @docker stop hash-demo || true - @docker rm hash-demo || true + @docker kill hash-demo || true + @docker rm -f hash-demo || true # Run Tillich-Zémor hasher demo -up: down +up: down deps @echo "\n${B}${G}build container${R}\n" @time docker build -t poc-demo . @echo "\n${B}${G}enter inside container:${R}\n" diff --git a/benchmark b/benchmark index 93f446a..926c02a 100755 --- a/benchmark +++ b/benchmark @@ -1,13 +1,11 @@ #!/bin/bash -#tmpfile=$(mktemp /tmp/random-file.XXXXXX) -#size=$1 -#dd if=/dev/urandom of=$tmpfile bs=$size count=1 -tmpfile=$1 +tmpfile=$(mktemp /tmp/random-file.XXXXXX) +dd if=/dev/urandom of=$tmpfile bs=$1 count=1 go build ./cmd/tzsum && \ for impl in avx avx2 avx2inline purego; do echo $impl implementation: - /usr/bin/env time -f "time: %e seconds" ./tzsum -name $tmpfile -impl $impl + /usr/bin/env time ./tzsum -name $tmpfile -impl $impl echo done From 77b7d87549dbc53eb682b0f1a3992140388cc93d Mon Sep 17 00:00:00 2001 From: Evgeniy Kulikov Date: Thu, 16 Jan 2020 10:54:54 +0300 Subject: [PATCH 3/3] Use golang.org/x/sys instead of self-implemented detector --- go.mod | 5 ++- go.sum | 2 + internal/cpuid/cpuid_x86.go | 77 ------------------------------------- internal/cpuid/cpuid_x86.s | 48 ----------------------- tz/hash.go | 6 +-- 5 files changed, 9 insertions(+), 129 deletions(-) delete mode 100644 internal/cpuid/cpuid_x86.go delete mode 100644 internal/cpuid/cpuid_x86.s diff --git a/go.mod b/go.mod index 0249af4..35b9370 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/nspcc-dev/tzhash go 1.12 -require github.com/stretchr/testify v1.3.0 +require ( + github.com/stretchr/testify v1.3.0 + golang.org/x/sys v0.0.0-20200113162924-86b910548bc1 +) diff --git a/go.sum b/go.sum index 380091e..e24edc8 100644 --- a/go.sum +++ b/go.sum @@ -6,3 +6,5 @@ github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1 h1:gZpLHxUX5BdYLA08Lj4YCJNN/jk7KtquiArPoeX0WvA= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/internal/cpuid/cpuid_x86.go b/internal/cpuid/cpuid_x86.go deleted file mode 100644 index bf19137..0000000 --- a/internal/cpuid/cpuid_x86.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2009 The Go Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build 386 amd64 amd64p32 - -package cpuid - -const ( - bitOSXSAVE = 1 << 27 - bitAVX = 1 << 28 - bitAVX2 = 1 << 5 -) - -var ( - hasAVX bool - hasAVX2 bool -) - -func init() { - maxID, _, _, _ := cpuid(0, 0) - if maxID < 1 { - return - } - - _, _, ecx1, _ := cpuid(1, 0) - hasOSXSAVE := isSet(ecx1, bitOSXSAVE) - - osSupportsAVX := false - if hasOSXSAVE { - eax, _ := xgetbv() - osSupportsAVX = isSet(eax, 1<<1) && isSet(eax, 1<<2) - } - - hasAVX = isSet(ecx1, bitAVX) && osSupportsAVX - - if maxID < 7 { - return - } - - _, ebx7, _, _ := cpuid(7, 0) - hasAVX2 = isSet(ebx7, bitAVX2) && osSupportsAVX -} - -func HasAVX() bool { return hasAVX } -func HasAVX2() bool { return hasAVX2 } - -func isSet(hwc uint32, value uint32) bool { - return hwc&value != 0 -} - -func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) -func xgetbv() (eax, edx uint32) diff --git a/internal/cpuid/cpuid_x86.s b/internal/cpuid/cpuid_x86.s deleted file mode 100644 index 655744c..0000000 --- a/internal/cpuid/cpuid_x86.s +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2009 The Go Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include "textflag.h" - -// func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) -TEXT ·cpuid(SB), NOSPLIT, $0-24 - MOVL eaxArg+0(FP), AX - MOVL ecxArg+4(FP), CX - CPUID - MOVL AX, eax+8(FP) - MOVL BX, ebx+12(FP) - MOVL CX, ecx+16(FP) - MOVL DX, edx+20(FP) - RET - -// func xgetbv() (eax, edx uint32) -TEXT ·xgetbv(SB),NOSPLIT,$0-8 - MOVL $0, CX - XGETBV - MOVL AX, eax+0(FP) - MOVL DX, edx+4(FP) - RET diff --git a/tz/hash.go b/tz/hash.go index fd43709..13e09c7 100644 --- a/tz/hash.go +++ b/tz/hash.go @@ -7,7 +7,7 @@ import ( "errors" "hash" - "github.com/nspcc-dev/tzhash/internal/cpuid" + "golang.org/x/sys/cpu" ) type Implementation int @@ -25,10 +25,10 @@ const ( ) var ( - hasAVX = cpuid.HasAVX() + hasAVX = cpu.X86.HasAVX // Having AVX2 does not guarantee // that AVX is also present. - hasAVX2 = cpuid.HasAVX2() && hasAVX + hasAVX2 = cpu.X86.HasAVX2 && hasAVX ) func (impl Implementation) String() string {