教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go的隐秘世界:从 Cgo 到 Goroutine 调度

Go的隐秘世界:从 Cgo 到 Goroutine 调度

发布时间:2022-03-01   编辑:jiaochengji.com
教程集为您提供Go的隐秘世界:从 Cgo 到 Goroutine 调度等资源,欢迎您收藏本站,我们将为您提供最新的Go的隐秘世界:从 Cgo 到 Goroutine 调度资源

我曾经以为 Go 程序能调用 C 函数是天经地义的,就像 C 程序可以调用 C。

我也曾经以为 C 函数在 goroutine 里的执行,就如同 Go 函数被 goroutine 执行一样,没有什么差别。

这些幻想在开发 GoTorch <span class="invisible">https://</span><span class="visible">github.com/wangkuiyi/go</span><span class="invisible">torch</span><span class="ellipsis"/> 的过程里彻底破灭了。

作为一个深度学习库,GoTorch 调用 PyTorch 的 C 内核 libtorch —— 即使 GoTorch 不依赖 libtorch,也得依赖 TensorFlow 的 C 内核,因为深度学习的基本操作,在 TensorFlow 里被称为 operators 的,或者在 PyTorch 里被称为 native functions,都是用 C 写的 —— 所以 GoTorch 离不开 Cgo。

在 GoTorch 的开发过程中,我们发现,即使一个 GoTorch 程序只用一个 goroutine 来做训练,也会”无缘无故“地启动非常多的操作系统线程,从而占用相当大的内存。

为了解决这个问题,我们一路寻找线索,不知不觉就深入到了 Cgo 以及它和 goroutine 调度机制之间的关系。这个探索过程,带我们进入到一个大多数 Go 程序员并不了解的隐秘世界。

这个寻求答案的探索过程从 Googling 开始。有一些非常值得一读的文章,比如 William Kennedy 的 Scheduling In Go 三部曲。如其开篇所说:

<blockquote>The design and behavior of the Go scheduler allows your multithreaded Go programs to be more efficient and performant. This is thanks to the mechanical sympathies the Go scheduler has for the operating system (OS) scheduler. However, if the design and behavior of your multithreaded Go software is not mechanically sympathetic with how the schedulers work, none of this will matter.
Go 调度器让大家可以高效地开发高性能的多线程程序。这归功于 Go 调度器和操作系统调度器的和谐。然而,如果我们的应用程序设计不能和 Go 调度器保持这种和谐,那么上述优势都成了泡影。</blockquote>

其实,如果我们的程序不调用 system calls 或者 C/C 库,只是纯粹的 Go 程序的话,还真不容易打破这种和谐。但是一旦涉及类似高性能计算,不管是基于 CPU、GPU、还是 TPU 的,那么势必要调用底层库,要通过Cgo;而使用 Cgo 很容易打破这种和谐。

为了保持和谐,我们必须了解这个隐秘世界。这远不是读完这些 Google 出来的文章就足够了的。我们不得不深入Go 编译器和 runtime 的源码。这一系列文章记述我们探寻 Go 的隐秘世界的过程。

如果你准备好了,那就开始吧!

<span class="LinkCard-backdrop" style="background-image:url(https://zhstatic.zhihu.com/assets/zhihu/editor/zhihu-card-default.svg)"/><span class="LinkCard-content"><span class="LinkCard-text"><span class="LinkCard-title" data-text="true">王益:Go的隐秘世界:有Thread为啥还要Goroutine</span><span class="LinkCard-meta"><span style="display:inline-flex;align-items:center">​<svg class="Zi Zi--InsertLink" fill="currentColor" viewbox="0 0 24 24" width="17" height="17"><path d="M13.414 4.222a4.5 4.5 0 1 1 6.364 6.364l-3.005 3.005a.5.5 0 0 1-.707 0l-.707-.707a.5.5 0 0 1 0-.707l3.005-3.005a2.5 2.5 0 1 0-3.536-3.536l-3.005 3.005a.5.5 0 0 1-.707 0l-.707-.707a.5.5 0 0 1 0-.707l3.005-3.005zm-6.187 6.187a.5.5 0 0 1 .638-.058l.07.058.706.707a.5.5 0 0 1 .058.638l-.058.07-3.005 3.004a2.5 2.5 0 0 0 3.405 3.658l.13-.122 3.006-3.005a.5.5 0 0 1 .638-.058l.069.058.707.707a.5.5 0 0 1 .058.638l-.058.069-3.005 3.005a4.5 4.5 0 0 1-6.524-6.196l.16-.168 3.005-3.005zm8.132-3.182a.25.25 0 0 1 .353 0l1.061 1.06a.25.25 0 0 1 0 .354l-8.132 8.132a.25.25 0 0 1-.353 0l-1.061-1.06a.25.25 0 0 1 0-.354l8.132-8.132z"/></svg></span>zhuanlan.zhihu.com</span></span><span class="LinkCard-imageCell"></span></span>

到此这篇关于“ Go的隐秘世界:从 Cgo 到 Goroutine 调度”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Go的隐秘世界:从 Cgo 到 Goroutine 调度
Go的隐秘世界:有Thread为啥还要Goroutine
Go的隐秘世界:一个Goroutine要几个Thread
Go的隐秘世界:Goroutine调度机制概览
Go 语言十年而立,Go2 蓄势待发
简单理解 Goroutine 是如何工作的
也谈goroutine调度器
Go的隐秘世界:Go程序的启动和runtime初始化
获取 Goroutine ID
goroutine 调度器

[关闭]
~ ~