URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [math/] [big/] [calibrate_test.go] - Rev 747
Compare with Previous | Blame | View Log
// Copyright 2009 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.// This file prints execution times for the Mul benchmark// given different Karatsuba thresholds. The result may be// used to manually fine-tune the threshold constant. The// results are somewhat fragile; use repeated runs to get// a clear picture.// Usage: gotest -calibratepackage bigimport ("flag""fmt""testing""time")var calibrate = flag.Bool("calibrate", false, "run calibration test")// measure returns the time to run ffunc measure(f func()) time.Duration {const N = 100start := time.Now()for i := N; i > 0; i-- {f()}stop := time.Now()return stop.Sub(start) / N}func computeThresholds() {fmt.Printf("Multiplication times for varying Karatsuba thresholds\n")fmt.Printf("(run repeatedly for good results)\n")// determine Tk, the work load execution time using basic multiplicationkaratsubaThreshold = 1e9 // disable karatsubaTb := measure(benchmarkMulLoad)fmt.Printf("Tb = %dns\n", Tb)// thresholdsn := 8 // any lower values for the threshold lead to very slow multipliesth1 := -1th2 := -1var deltaOld time.Durationfor count := -1; count != 0; count-- {// determine Tk, the work load execution time using Karatsuba multiplicationkaratsubaThreshold = n // enable karatsubaTk := measure(benchmarkMulLoad)// improvement over Tbdelta := (Tb - Tk) * 100 / Tbfmt.Printf("n = %3d Tk = %8dns %4d%%", n, Tk, delta)// determine break-even pointif Tk < Tb && th1 < 0 {th1 = nfmt.Print(" break-even point")}// determine diminishing returnif 0 < delta && delta < deltaOld && th2 < 0 {th2 = nfmt.Print(" diminishing return")}deltaOld = deltafmt.Println()// trigger counterif th1 >= 0 && th2 >= 0 && count < 0 {count = 20 // this many extra measurements after we got both thresholds}n++}}func TestCalibrate(t *testing.T) {if *calibrate {computeThresholds()}}
