多线程是一种并发编程技术,它允许程序同时执行多个线程,从而提高程序运行速度。
在开始多线程优化之前,先看两个概念:进程和线程。
进程我们可以简单粗暴的理解为一个应用进程,比如你在电脑上开一个QQ聊天,那么一个QQ应用就是一个进程,但如果你用一个QQ和多人同时聊天,可以认为每个人聊天都是一个线程,你此时在多线程工作。
对应到 C++ 的 resnet50 示例中,当你在 linux 上执行 ./resnet 时,就开启了一个进程,在没有进行多线程编程的情况下,resnet 默认使用一个线程。如果你的 CPU 是多核比如 8 核,那么可能只用到了一个 CPU 核来进行计算。
因此你可能明白了,多线程编程,可以使程序用多个 CPU 核并行计算。而目前大部分的电脑,早就是多核CPU了,因此不用多线程编程纯粹就是浪费电脑资源。
多线程编程
多线程编程最重要也是最核心的思想,就是把一个大的任务拆分成多个小任务,每个小任务占用一个线程。
这就要求拆分的小任务之间最好是资源(数据、内存等)独立的,如果资源不独立,线程之间有依赖,那么就需要有线程间的数据同步,会导致多线程效率下降,严重者出现性能回退。
我们所熟悉的 GPU, 其实就是一种多线程编程,GPU 有众多的 cuda core,每个core独立处理一块数据,在计算一些任务时,众多的 cuda core 一起计算,人多力量大,从而 GPU 的性能比传统 CPU 要好。在其他条件不变的情况下,GPU 核心数越多,性能越好,其实都是一样的道理。
回到把大任务拆分成小任务这个话题,在进行多线程编程时,需要根据算法来区分哪些数据是独立可拆分的,如此一来,将可拆分的数据拆分到
多线程编程:提高并发效率与理解核心概念
本文介绍了多线程编程的基本概念,通过对比进程与线程,阐述了多线程能有效利用多核CPU资源,提高程序运行效率。重点讲解了线程间的资源独立性和数据同步问题,并通过二维数组累加的例子说明正确的数据拆分原则。最后,提出了卷积运算的多线程优化思考问题。
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



