• pebble
    2019-11-08
    支持 AVX-512 指令(也就是它的一个寄存器有 512 位)。每次能处理 8 个 64 位整数,或 16 个 32 位整数,或者 32 个双精度数、64 个单精度数。你想想,一条指令顶 64 条指令,几十倍的性能提升,是不是很厉害!

    这句里,最后的32个双精度跟64个单精度数量不对啊,双精度是64位的,512字节应该是8个,单精度也就是16个了

    作者回复: 回复。我这个地方确实写得不准确,要再补充点内容。我引用的是Intel的官网的内容。它的意思不是只用一个寄存器处理。而是因为使用了两个 512 位融合乘加 (FMA) 单元,每次可以同时处理32 次双精度和 64 次单精度浮点运算,以及八个 64 位和十六个 32 位整数。FMA单元的指令比较特殊,它可以完成乘法运算的时候同时完成加法运算。
    我把正文调一下。参考:
    https://www.intel.cn/content/www/cn/zh/architecture-and-technology/avx-512-overview.html

    
     1
  • 沉淀的梦想
    2019-11-04
    为什么nums1和nums2的内存位置有重叠就不能进行矢量化了呢?

    作者回复: 这个地方我确实没有细讲。
    假设,我们做8个32位整数的计算。让nums2 = nums1 + 1。但是,nums2[0]的地址跟nums1[4]的地址相同,也就是nums2是从nums1的一半开始的。nums1和nums2一共占了12个整数位置。

    假设nums1中各个元素的值都是1。然后做矢量计算。做完以后,结果是怎样的呢?从nums1开始,是4个1,8个2,一共12个数字。对吧。

    但如果你用标量的循环去做,是怎样的呢?
    for(int i = 1; i < 8; i++)
        nums2[i] = nums1[i] + 1;
    会是4个1,4个2,4个3。
    它等价于nums1[i+4] = nums1[i] + 1。


     1
     1
我们在线,来聊聊吧