我正在通過 Go 中的 goroutines 優(yōu)化矩陣乘法。我的基準測試顯示,每行或每元素引入并發(fā)會大大降低性能: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我知道緩存局部性的一些基本先驗知識,每個元素并發(fā)性降低性能是有道理的。但是,為什么即使在原始版本中每行仍然會降低性能?事實上,我還寫了一個 block/tiling optimization,它的 vanilla 版本(沒有 goroutine 并發(fā))甚至比 naive 版本更差(這里不存在,讓我們先關(guān)注 naive)。我在這里做錯了什么?為什么?這里怎么優(yōu)化?
1 回答

慕桂英546537
TA貢獻1848條經(jīng)驗 獲得超10個贊
執(zhí)行 8x8 矩陣乘法是相對較小的工作。
Goroutines(雖然可能是輕量級的)確實有開銷。如果他們所做的工作是“小”的,那么啟動、同步和丟棄它們的開銷可能會超過利用多核/線程的性能增益,并且總體而言,您可能無法通過并發(fā)執(zhí)行此類小任務(wù)來獲得性能(見鬼,您可能甚至比不使用 goroutines 更糟糕)。措施。
如果我們將矩陣大小增加到 80x80,運行基準測試,我們已經(jīng)看到在以下情況下有一些性能提升ParalMultNaivePerRow
:
BenchmarkMatrixDotNaive/A.MultNaive-4???????????????2000?????1054775?ns/op BenchmarkMatrixDotNaive/A.ParalMultNaivePerRow-4????2000??????709367?ns/op BenchmarkMatrixDotNaive/A.ParalMultNaivePerElem-4????100????10224927?ns/op
(正如您在結(jié)果中看到的,我有 4 個 CPU 內(nèi)核,在您的 8 核機器上運行它可能會顯示出更多的性能提升。)
當行很小時,您正在使用 goroutines 來完成最少的工作,您可以通過在 goroutines 完成“微小”工作后不“丟棄”它們來提高性能,但您可以“重用”它們。
- 1 回答
- 0 關(guān)注
- 121 瀏覽
添加回答
舉報
0/150
提交
取消