Por causa de um ciclo, a CPU se engajou em uma nova tecnologia!

Xiaogu tem um amigo chamado Ah Q, que é funcionário da oficina de CPU nº 1. Algo incrível aconteceu com ele recentemente~

A CPU em que estou tem 8 workshops, ou seja, 8 núcleos, cada um dos nossos núcleos pode executar duas threads ao mesmo tempo, ou seja, 8 núcleos e 16 threads, e a velocidade é ótima.

Na oficina nº 1, além de mim, que é responsável por executar as instruções, há também Xiao A que é responsável por ler as instruções, Xiao Chuan que é responsável por decodificar as instruções e K que é responsável por escrever de volta as instruções. resultados.Executar o trabalho do programa.

um laço simples

No outro dia, nos deparamos com um pedaço de código:

void array_add(int data[], int len) {
  for (int i = 0; i < len; i++) {
    data[i] += 1;
  }
}
复制代码

Depois de fazer um loop por centenas de vezes, esse código é executado. Cada loop está fazendo um trabalho simples e repetitivo, o que me deixa exausto.

O velho K, encarregado de escrever os resultados, também estava cansado e suando profusamente.

As palavras do velho K fizeram meus olhos brilharem, sim, você pode fazer operações em lote?

Enquanto pensava nisso, continuei a trabalhar.

O dia agitado acabou rapidamente, e já era noite novamente.Depois que o computador foi desligado, chamei todos juntos.

"Irmãos, lembram-se do ciclo que encontramos durante o dia?"

“De qual ciclo você está falando, realizamos muitos ciclos neste dia”, disse Xiao A.

"É o loop que incrementa cada elemento do array inteiro em 1"

"Lembrei-me, o que aconteceu com o loop? Há algum problema?"

Olhei para o antigo K e disse: "Estava pensando nas palavras do antigo K hoje, como esse tipo de ciclo, toda vez que eu tiro, acrescento 1 e escrevo de volta, e opero um número de cada vez, a eficiência é muito baixo, se o atualizarmos, suporta tirar vários números de uma vez e adicionar 1 em lotes, isso não é muito mais rápido?"

Assim que o Velho K ouviu, ficou interessado: "Isso é uma coisa boa, o que você vai fazer?"

"Eu não pensei sobre isso ainda, você tem alguma sugestão?"

O pequeno gordo encarregado da decodificação de instruções disse: "Você pode adicionar uma instrução, que é especialmente usada para buscar vários dados de uma só vez para adicionar 1".

"Não, não, não pode ser limitado assim. Hoje é um aumento de 1. E se for um aumento de 2 da próxima vez? O comando não pode ser limitado a 1."

"E se cada dado for adicionado de forma diferente?"

"Se você diz isso, e se não for adição, mas subtração e multiplicação?"

"Também,..."

Todos começaram a falar sobre isso, mas não esperávamos que um pequeno loop de adição levasse a tantos problemas de uma só vez, o que não esperávamos.

Computação Paralela

Com o aprofundamento da discussão, sinto que está fora do controle da nossa oficina nº 1. Precisamos reportar ao líder e organizar oito representantes da oficina para discutirmos juntos.

领导一听说有提高性能的新技术,马上来了兴趣,很快便开会组织大家一起来商讨方案。

“都到齐了是吧,阿Q你给大家说一下这个会议的目的”,领导说到。

我站了起来,开始把我们遇到的问题和想法跟大家讲了一遍。

“是这样的,我们一号车间那天遇到了一段循环代码,循环体的内容很简单,就是给数组中的每一个元素加1。我们执行的时候,就是不断取出每一个元素,然后将其执行加法计算后,再写回去。这样一个一个来加1,我们感觉太慢了, 要是可以一次多取几个,并行加1,那一定比一个一个加快上不少。”

我刚说完,大家都开始小声议论起来。

“我看出来了,这其实就是并行计算!”,二号车间小虎一语道出了关键。

六号车间小六问道:”阿Q,你们已经有方案了吗?“

“还没有,这正是今天开会的目的,因为情况有点复杂,还需要大家一起来出出主意”

“好像并不复杂嘛”

“我上面举的例子只是一个简单的情况,并行计算还可能不是固定的数,可能是一个数组和另一个数组相加。还有可能不是整数相加,而是浮点数,甚至,还可能不是加法,而是减法或者乘法,再或者不是算术运算,而是逻辑运算”

我刚一说完,大家又开始窃窃私语交流起来。

“我琢磨着你说的这一系列东西,咱们是要新增一套专门用来并行计算的指令集啊”,小虎说道。

“这可是大工程啊”

“是啊···”

这时,小六又问道:“咱们的计算的时候,都是把数据读取到寄存器进行的,可这寄存器一次只能装一个数,怎么一次读取多个数据呢?”

“可能需要新增一些容量大一些的寄存器,比如128bit长度,可以同时容纳4个32位的整数”

“有这个必要吗?咱们是通用CPU,又不是专门做数学计算的芯片,搞这些东西干嘛?”,四号车间代表提出了质疑。

我也不甘示弱:“那可太有必要了,在图像、视频、音频处理等领域,有大量这样的计算需求,咱们得提升处理这些数据的能力”

见我们争执不下,领导拍了拍桌子,会场一下安静了下来。

“我觉得阿Q说的有道理,咱们确实需要提升处理这类数据运算的能力了。不过不用一下搞那么复杂,先支持整数并行运算就行了。新增寄存器这个也不用着急,可以先借用一下浮点数运算单元FPU的寄存器。这件事先这么定下来,具体的方案你们再继续讨论。”,说完便离开了会议室。

领导不愧是领导,几句话就把我们安排的明明白白。

SIMD

又经过一阵紧张的讨论,我们终于敲定了方案。

我们借用浮点数运算单元的寄存器,还给它们起了新的名字:MM0-MM7。因为是64位的寄存器,所以可以同时存储两个32位的整数或者4个16位整数或者8个8位的整数。

我们还新增了一套叫MMX的指令集,用来并行执行整数的运算。

我们把这种在一条指令中同时处理多个数据的技术叫做单指令多数据流(Single Instruction Multiple Data),简称SIMD

有了这套指令集,咱们处理这类整数运算问题的速度快了不少。

不过渐渐地发现了两个很麻烦的问题:

第一个问题,因为是借用FPU的寄存器,所以当执行SIMD指令的时候,就不能用FPU计算单元,反过来也一样,同时使用的话就会出乱子,所以要经常在不同的模式之间切换,实在是有些麻烦。

另一个更重要的问题,咱们这套指令集只能处理整数的并行运算,可现在浮点数的并行运算越来越多,尤其是图像、视频还有深度学习的一些数据处理,浮点数情况越来越多,这时候都派不上用场。

我们把这些问题给领导做了汇报,看到我们已经做出的成绩,领导终于同意继续升级。

这一次,我们扩展了一套新的SSE指令集出来,新增了XMM0-XMM7总共8个128位的寄存器,再也不用跟FPU共享寄存器了。而且位宽加了一倍,能容纳的数据更多了,能同时处理的数据自然也变多了。

后来,我们又不断的修改升级,不仅支持了对浮点数并行处理,还推出了新一代的AVX指令集,把寄存器再一次扩大为256位,现在我们的SIMD技术更加先进,处理数据运算的能力越来越强了!

Acho que você gosta

Origin juejin.im/post/7078499407145992206
Recomendado
Clasificación