我正在 Golang 中实施一些并行算法作为练习。现在我正在尝试对向量中的所有元素求和,但为此,我需要一个障碍。我四处搜索,但找不到任何可以帮助我的东西。
这是我的代码的样子:
package main
import (
"fmt"
"math"
"sync"
)
func main() {
var wg sync.WaitGroup
sumWorkerFunc := func(k int, a []int, br *sync.WaitGroup) {
bound := int(math.Ceil(math.Log2(float64(k))))
for i := 1; i < bound; i++ {
if k%int(math.Pow(2, float64(i))) == 0 {
a[k] = a[k-int(math.Pow(2, float64(i-1)))] + a[k]
}
/* barrier here */
}
wg.Done()
}
a := []int{0, 1, 2, 3, 4, 5, 6, 7}
fmt.Println("Before:")
fmt.Println(a)
workers := 8
wg.Add(workers)
for k := 0; k < workers; k++ {
go sumWorkerFunc(k, a, br)
}
wg.Wait()
fmt.Println("After:")
fmt.Println(a)
}
在开始下一次迭代之前,我需要等待所有工作人员完成,因为他们需要下一次迭代的结果。这就是我试图做的:
package main
import (
"fmt"
"math"
"sync"
)
func main() {
var wg sync.WaitGroup
sumWorkerFunc := func(k int, a []int, br *sync.WaitGroup) {
bound := int(math.Ceil(math.Log2(float64(k))))
for i := 1; i < bound; i++ {
if k%int(math.Pow(2, float64(i))) == 0 {
a[k] = a[k-int(math.Pow(2, float64(i-1)))] + a[k]
}
br.Done()
br.Wait() // this should not be here
br.Add(1)
}
wg.Done()
}
a := []int{0, 1, 2, 3, 4, 5, 6, 7}
fmt.Println("Before:")
fmt.Println(a)
workers := 8
wg.Add(workers)
var barrier sync.WaitGroup
barrier.Add(workers)
for k := 0; k < workers; k++ {
go sumWorkerFunc(k, a, &barrier)
}
wg.Wait()
fmt.Println("After:")
fmt.Println(a)
}
但是我不能在那里放置一个 Wait() 因为它会被所有的工人调用。在那里实施障碍的正确方法是什么?我开始认为这个问题可能更多地针对可能不适合 Golang 的共享内存模型。
谢谢!
茅侃侃
一只甜甜圈
相关分类