去年十月写过一篇《并行执行》,讨论了多核与锁的问题。提到了『并行执行』和『并发访问』两个概念。最近看公司里面老外写的文档,也用了同样的概念,不同的名称,分别叫做『性能化多线程』和『功能化多线程』。根据公司里项目的实践,『并行执行』除了像《并行执行》里讨论的向 GPGPU 转化之外,也在向 Intel TBB 、MKL 之类的 non-lock-based 技术转化。锁这个技术,在『性能化多线程』中的应用已经逐渐萎缩,并且我认为『功能化多线程』也会为了降低复杂度而逐渐向 timer 等 cooperative 并发技术转移。
本质上说,OpenGL 也是『性能化多线程』。这种多线程的特点是所有线程都不共享数据,所以无需中间同步。只需要最后的结果同步一次。类似主线程对所有性能化线程调用 join
。OpenGL 有两个操作可以提供这种 join
的语义,glReadPixels()
和 glFlush()
。这两个操作都是为了防止用户看到数据(渲染结果)的不合法状态。比如 glFlush()
经常作为 glutSwapBuffers()
的隐含步骤执行。
发表评论