Goroutines (cgo): необъяснимый поток ОС порождает при использовании goroutines - PullRequest
0 голосов
/ 28 ноября 2018

Я использую go для распараллеливания 2d сверток, где свертка (реализованная в go) происходит в c-архиве, включенном в двоичный файл C (где вызывается код go).Из кода go не поступают никакие вызовы для любой функции c

Перед порождением процедур все матрицы загружаются в память с помощью кода c, и все программы обращаются к нему через общую память.

Я используюGOMAXPROCS-1, чтобы решить, сколько подпрограмм запускается, и каждой подпрограмме присваивается идентификатор.Группам присваиваются строки матрицы на основе их идентификатора в полосатой форме.Подпрограммы go блокируются для потока ОС при порождении и освобождают поток после его завершения.

например, если для GOMAXPROCS задано значение 4, процедура 0 принимает строки 0, 4, 8, 12 и т. Д., А процедура 1 - строку 1, 5, 9, 13 и т. Д.

Моя проблема заключается в том, что, когда для GOMAXPROCS установлено значение 4, запускаются процессы 11 ОС

htop и atop: enter image description here

Насколько я понимаю, эти потоки ОС порождаются, потому что планировщик пытается убедиться, что всегда есть доступные потоки, которые не заблокированы.

НетВвод / вывод или системные вызовы, происходящие после порождения подпрограмм, поэтому я не понимаю, почему планировщик создает все эти процессы или что блокирует потоки.

Количество порождаемых потоков замедляетвыполнение при выполнении с GOMAXPROCS> = 20 на машине с 40 ядрами

Почему планировщик порождает все эти потоки?Как я могу отладить, где / как процедуры блокируются?

Исходный код

...