我正在通过 Go 中的 goroutines 优化矩阵乘法。
我的基准测试显示,每行或每元素引入并发会大大降低性能:
goos: darwin goarch: amd64 BenchmarkMatrixDotNaive/A.MultNaive-8 2000000 869 ns/op 0 B/op 0 allocs/op BenchmarkMatrixDotNaive/A.ParalMultNaivePerRow-8 100000 14467 ns/op 80 B/op 9 allocs/op BenchmarkMatrixDotNaive/A.ParalMultNaivePerElem-8 20000 77299 ns/op 528 B/op 65 allocs/op
我知道缓存局部性的一些基本先验知识,每个元素并发性降低性能是有道理的。但是,为什么即使在原始版本中每行仍然会降低性能?
事实上,我还写了一个 block/tiling optimization,它的 vanilla 版本(没有 goroutine 并发)甚至比 naive 版本更差(这里不存在,让我们先关注 naive)。
我在这里做错了什么?为什么?这里怎么优化?
慕桂英546537
相关分类