标签:
分别用串行和并行实现了一个1亿*1000次加法的程序,代码如下:
package main import ( "fmt" //"runtime"//执行并行段时需要引入该包 "time" ) const ( NUM = 100000000 ) type vint struct { n []int } func (v vint) Doadd(p, i, n int, u []int, c chan int) { tempv=v.n[p] for j := 0; j < 1000; j++ { for ti := i; ti < n; ti++ { v.n[p] += u[ti] } v.n[p]=tempv//重置v.n[p] } c <- 1 return } func (v vint) Doall(ncpu int, u []int) (sum int) { c := make(chan int, ncpu) segment := NUM / ncpu for i := 0; i < ncpu; i++ { go v.Doadd(i, i*segment, (i+1)*segment, u, c) } for i := 0; i < ncpu; i++ { <-c } for i := 0; i < ncpu; i++ { sum += v.n[i] } return } func main() { /*并行段 ncpu := runtime.NumCPU() runtime.GOMAXPROCS(ncpu) u := make([]int, NUM) for i := 0; i < NUM; i++ { u[i] = 1 } v := new(vint) v.n = make([]int, ncpu) ts := time.Now().UnixNano() sum := v.Doall(ncpu, u) te := time.Now().UnixNano() fmt.Println((te - ts), sum)*/ //串行段 u := make([]int, NUM) for i := 0; i < NUM; i++ { u[i] = 1 } ts := time.Now().UnixNano() for j := 0; j < 1000; j++ { sum := 0 for i := 0; i < NUM; i++ { sum += u[i] } } te := time.Now().UnixNano() fmt.Println((te - ts)) return }
串行和并行执行的结果如下:
8核并行化时间: 105026.076ms 串行时间: 80704.4503ms
由结果可知,并行化的时间开销反而比串行大,若各位知道原因,希望能在评论区回复解答
标签:
原文地址:http://www.cnblogs.com/xiaopipi/p/4925045.html