码迷,mamicode.com
首页 > 其他好文 > 详细

go:多核并行化问题

时间:2015-10-31 11:21:35      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:

分别用串行和并行实现了一个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

技术分享                                   技术分享

由结果可知,并行化的时间开销反而比串行大,若各位知道原因,希望能在评论区回复解答

go:多核并行化问题

标签:

原文地址:http://www.cnblogs.com/xiaopipi/p/4925045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!