[英]Optimization in C
我一直在尝试优化一些简单的代码,我尝试了两种优化,循环注册和 memory 别名。
我的原始代码:
int paint(char *dst, unsigned n, char *src, char bias)
{
unsigned i;
for (i=0;i<n;i++) {
*dst++ = bias + *src++;
}
return 0;
}
循环注册后我的优化代码:
int paint(char *dst, unsigned n, char *src, char bias)
{
unsigned i;
for (i=0;i<n;i+=2) {
*dst++ = bias + *src++;
*dst++ = bias + *src++;
}
return 0;
}
在此之后如何使用 memory 别名优化代码? 这段代码还有其他很好的优化吗? (就像将指针转换为长指针以快速复制)
C 中的优化比这更容易。
cc -Wall -W -pedantic -O3 -march=native -flto source.c
这将展开任何需要展开的循环。 自行展开、Duff's Device 和其他技巧已经过时且毫无用处。
至于别名,您的 function 使用两个char*
参数。 如果保证它们永远不会指向同一个 arrays 那么您可以使用restrict
关键字。 这将允许优化器假设更多关于代码的事情并使用矢量化指令。
查看此处生成的组件: https://godbolt.org/z/xMfebr或https://godbolt.org/z/j1xMYz
你能设法手工完成所有这些吗? 可能不是。
你只关心性能吗? 正确性呢?
从您的 function paint
的名称和可变bias
(并使用我的水晶球)来看,我想您需要添加饱和度(以防溢出)。 这可以通过使用paddusb
的内在函数( https://www.felixcloutier.com/x86/paddusb:paddusw ): https://software.intel.com/sites4#79and7= 4179&cats=算术&文本=paddusb
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.