连载:编写高效代码(5)——选用合适的指令

     处理器除了一些常用的加法、移位、乘法等指令外,还有一些完成复杂功能的指令,例如:DSP中的乘累加指令、求绝对值指令,x86中的SIMD指令等等。在用高级语言编程时,编译器常常不会使用到这些指令,而是用多条简单的指令去实现它们,这时就需要程序员自己去使用它们。
     使用这些复杂指令,最直接的方式当然是写汇编语言,不过汇编语言编程难度太大,还好,编译器提供了一种方便使用汇编指令的方式:Intrinsic function。例如,SSE3中的指令addsubps,它对应的Intrinsic function为_mm_addsub_ps,Intrinsic function的使用方式和普通函数一样:
w = _mm_addsub_ps ( u , v);
     虽然它看起来像个函数调用,不过它不是真正的函数,它会被编译器翻译成对应的汇编指令。u和v也不是函数的参数,u是指令addsubps的第一个操作数,v是指令addsubps的第二个操作数。数据类型是128bit。
     手工优化过的纯汇编,性能当然是最高的,不过也是最不易编程和可移植性最差的,使用标准C语言编程,易编程,可移植性高,不过性能也差,Intrinsic function是介于它们中间的一种产物。对于调用次数非常多,非常影响性能的模块,可以使用汇编对其优化,对于一般影响程序的模块,可以使用Intrinsic function对其优化,其他模块,使用标准C即可。

汇编、 Intrinsic function 、标准 C 在性能和可移植性关系

 

你可能感兴趣的:(编程,优化,汇编,function,语言,编译器)