Я использую 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](https://i.stack.imgur.com/84Gch.png)
Насколько я понимаю, эти потоки ОС порождаются, потому что планировщик пытается убедиться, что всегда есть доступные потоки, которые не заблокированы.
НетВвод / вывод или системные вызовы, происходящие после порождения подпрограмм, поэтому я не понимаю, почему планировщик создает все эти процессы или что блокирует потоки.
Количество порождаемых потоков замедляетвыполнение при выполнении с GOMAXPROCS> = 20 на машине с 40 ядрами
Почему планировщик порождает все эти потоки?Как я могу отладить, где / как процедуры блокируются?
Исходный код