我正在使用go并行化2d卷积,其中卷积(在go中实现)在C二进制文件(称为go代码)中包含的c归档中发生。 go代码不会调用任何c函数
在生成goroutine之前,所有矩阵均由c代码加载到内存中,并且所有goroutine通过共享内存对其进行访问。
我使用GOMAXPROCS-1决定要生成的go例程数,并且为每个例程分配一个ID。根据goroutine的ID以条纹方式为其分配矩阵行。生成时,go例程将锁定到OS线程,并在完成后释放该线程。
例如 如果将GOMAXPROCS设置为4,则例行程序0会占用行0、4、8、12等,而例行程序1会占用行1、5、9、13等。
我的问题是,当GOMAXPROCS设置为4时,会生成 11个操作系统线程
我的理解是,这些OS线程是生成的,因为调度程序正在尝试确保始终有未阻塞的可用线程。
在生成goroutine之后,没有发生I / O或系统调用,所以我不明白为什么调度程序会创建所有这些进程,或者阻塞线程的原因。
当在具有40个内核的计算机上使用GOMAXPROCS> = 20执行时,产生的线程数量减慢了执行速度
为什么调度程序会产生所有这些线程? 我该如何调试例程在何处/如何被阻塞?