1.2.1 算术运算

AVX内置函数中支持的算术运算如表1-5所示。

表1-5 AVX算术运算

新增加的乘加/乘减系列指令,使得优化人员更易于发挥处理器的峰值计算能力。在之前的Intel处理器上,要同时发挥处理器乘法和加法的性能需要非常小心地安排指令系列才有可能。许多科学计算任务(如矩阵运算)的核心运算就是乘加,FMA指令的出现使得科学计算应用比以前更易于发挥处理器的计算能力,如代码清单1-4代码所示。

代码清单1-4 fma示例


for(int i = 0; i < numRows; i++){
        for(int j = 0; j < numColumns; j++){
                float ret = r[i*numColumns+j]*beta;
                float sum = 0.0f;
                for(int k = 0; k < K; k++){
                        sum += a[i*K + k]*b[k*numColumns+j];
                }
                ret += sum*alpha;
                r[i*numColumns+j] = ret;
        }
}

假设数组a、b和r都可以保存到一级缓存中,即假设读取数据不会成为瓶颈。在这个前提下,代码清单1-4中的时间主要消耗在计算乘法和加法上。如果没有FMA指令,那么为了获得最高性能,代码优化人员需要依据处理器发射能力、算法和加法流水线的计算能力、乘法和加法指令的依赖关系、并行度等相关因素,合理地安排指令调度,这会相当复杂。而FMA指令的存在使得代码优化人员只需要关注一种指令即可,这就简化了指令调度工作。