簡體   English   中英

Goroutines (cgo):使用 goroutines 時產生無法解釋的 OS 線程

[英]Goroutines (cgo): unexplained OS thread spawns when using goroutines

我正在使用 go 來並行化 2d 卷積,其中卷積(在 go 中實現)發生在包含在 C 二進制文件(調用 go 代碼的地方)中的 c-archive 中。 go 代碼不會調用任何 c 函數

在生成 goroutine 之前,所有矩陣都由 c 代碼加載到內存中,所有 goroutine 通過共享內存訪問它。

我使用 GOMAXPROCS-1 來決定生成多少個 go 例程,並且每個例程都分配了一個 ID。 goroutines 根據它們的 ID 以條紋方式分配矩陣的行。 go 例程在生成時鎖定到 OS 線程,並在完成后釋放線程。

例如,如果 GOMAXPROCS 設置為 4,則 goroutine 0 使用第 0、4、8、12 行等,goroutine 1 使用第 1、5、9、13 行等。

我的問題是當 GOMAXPROCS 設置為 4 時,go 會產生11 個操作系統線程

htop 和頂部: 在此處輸入圖片說明

我的理解是,這些 OS 線程之所以會產生,是因為調度程序試圖確保始終存在未被阻塞的可用線程。

在生成 goroutine 之后沒有 I/O 或系統調用發生,所以我不明白為什么調度程序要創建所有這些進程或什么阻塞了線程。

在具有 40 個內核的機器上使用 GOMAXPROCS >=20 執行時,產生的線程數會減慢執行速度

為什么調度程序會產生所有這些線程? 如何調試例程被阻止的位置/方式?

源代碼

GOMAXPROCS 限制了運行 Go 代碼的線程數,但是 cgo 調用不算作 Go 代碼,所以你仍然可以看到 GOMAXPROCS=1 的多個線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM