栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

并发:Chudnovky的算法,比同步慢

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

并发:Chudnovky的算法,比同步慢

您正在进行的计算太简单了,无法在单独的goroutine中进行每个计算。与实际计算相比,您在运行时中浪费的时间更多(创建goroutine,复用,调度等)。例如,您尝试做的事情更适合于GPU,因为您拥有大量并行执行单元,这些单元可以立即进行一次简单的计算。但是您将需要其他语言和API来做到这一点。

您可以做的是为每个执行硬件线程创建执行软件线程。您想将

max
变量拆分为大块并并行执行。这是一个非常简单的例子,仅用于说明这个想法:

package mainimport (  "fmt"  "math"  "strconv"  "time"  "runtime")func main() {  var input string  var sum float64  var pi float64  c := make(chan float64, runtime.GOMAXPROCS(-1))  fmt.Print("How many iterations? ")  fmt.Scanln(&input)  max,err := strconv.Atoi(input)  if err != nil {    panic("You did not enter a valid integer")  }  start := time.Now() //start timing execution of concurrent routine  for i := 0; i < runtime.GOMAXPROCS(-1); i++ {    go func(i int){      var sum float64      for j := 0; j < max/runtime.GOMAXPROCS(-1); j++  {        sum += chudnovskySync(j + i*max/runtime.GOMAXPROCS(-1))      }      c <- sum    }(i)  }  for i := 0; i < runtime.GOMAXPROCS(-1); i++ {    sum += <-c  }  end := time.Now() //end of concurrent routine  fmt.Println("Duration of concurrent calculation: ",end.Sub(start))  pi = 1/(12*sum)  fmt.Println(pi)  start = time.Now() //start timing execution of syncronous routine  sum = 0  for i := 0; i < max; i++ {    sum += chudnovskySync(i)  }  end = time.Now() //end of syncronous routine  fmt.Println("Duration of synchronous calculation: ",end.Sub(start))  pi = 1/(12*sum)  fmt.Println(pi)}func chudnovskySync(i int) (r float64) {  var numerator float64  var denominator float64  ifloat := float64(i)  iun := uint64(i)  numerator = math.Pow(-1, ifloat) * float64(factorial(6*iun)) * (545140134*ifloat+13591409)  denominator = float64(factorial(3*iun)) * math.Pow(float64(factorial(iun)),3) * math.Pow(math.Pow(640320,3),ifloat+0.5)  r = numerator/denominator  return}func factorial(n uint64) (res uint64) {  if ( n > 0 ) {    res = n * factorial(n-1)    return res  }  return 1}

这是结果

$ go versiongo version go1.5.2 windows/amd64$ go run main.goGOMAXPROCS = 4How many iterations? 10000Duration of concurrent calculation:  932.8916msNaNDuration of synchronous calculation:  2.0639744sNaN


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/371242.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号