通信协议中的高层协议栈,多在CPU上编程,CPU较强的逻辑控制。
空口协议开发,多在专用的数字信号处理芯片上实现,受益于其强的高并发,多线程。
要学习的这个GPU,了解下来,由于其上万个cuda核和tensor核,所以高并发,多线程,计算能力也是非常厉害,并且NVDIA的产品,都是厉害的科学家的名字命名,这个也是非常有意思,如A6000系列,就是以安培的名字命名的,老黄这一点和马斯克有一拼,不是特斯拉车我还真不知道特斯拉这个科学家,其实非常牛,体外话哈!
GPU因为计算能力强,和CPU可以配合使用,CPU作为host侧,GPU作为device侧,CPU负责控制逻辑,将数据拆分好,通过全局内存?或共享内存给到GPU侧,GPU就做计算,grid(x,y,z), block(x,y,z)的设置block数和线程数,一般根据所需要处理的数据量,还有数据维度,算法,选择合适的线程数和block数,这样block间所有线程可以使用共享内存做同步。
GPU编码没啥特殊,因为支持C/C++,所以不用额外学习太多,只要知道多线程的概念,一行代码,所有线程都同时在执行,有了这种简单的理解,写代码,实现乘加功能,就问题不大了;
至于GPU基础的语法以及API,可以看https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html ,有帮助,但不大,我个人还是觉得多看别人写的代码,上手更快些。
虽说GPU上手简单,也有些代码中值得注意的地方:
线程束分化:从代码的角度来说,所有线程都是并行运行的,代码所有线程都跑得到,但从硬件角度来说,一个block上的所有线程,叫线程块,如grid(1,1,1), block(32,4,1), 1个block上有 32*4*1= 128个线程,叫一个线程块,线程块分布在SM中, 线程块里面的线程会进一步划分为线程束,128个线程划分为4个线程束,一个线程束上32个连续线程,在一个线程束中,所有线程都执行相同的指令,数据每个线程独立的一份,这种调度,其实就说,要想线程调度更有效率,肯定是一个线程束里面执行的指令都一样,别16个线程执行加,另外16个线程执行乘,这种就是一个线程束里面的线程出现了分化,并行效率就下来了,线程一半活跃一半禁用。
代码尽量32个线程走同一套,访问内存(全局/共享内存)寻址数据时,能连续寻址,这种效率时比较高的,想想也理解,连续内存找起来就是比跳着找快。