如何解决C 语言中的优化
我一直在尝试优化一些简单的代码,我尝试了两种优化,循环注册和内存别名。
我的原始代码:
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,char bias)
{
unsigned i;
for (i=0;i<n;i+=2) {
*dst++ = bias + *src++;
*dst++ = bias + *src++;
}
return 0;
}
此后如何使用内存别名优化代码?这段代码还有其他很好的优化吗? (比如将指针转换为长指针以便快速复制)
解决方法
C 中的优化比这更容易。
cc -Wall -W -pedantic -O3 -march=native -flto source.c
这将展开所有需要展开的循环。自己展开,达夫的装置和其他技巧已经过时且毫无用处。
至于别名,您的函数使用两个 char*
参数。如果它们保证永远不会指向相同的数组,那么您可以使用 restrict
关键字。这将允许优化器承担更多关于代码的事情并使用向量化指令。
查看此处生成的组件:https://godbolt.org/z/xMfebr 或 https://godbolt.org/z/j1xMYz
你能手工完成所有这些吗?可能不会。
,你只关心性能吗?正确性怎么样?
根据您的函数名称 paint
和变量 bias
(并使用我的水晶球)判断,我猜您需要添加饱和度(以防溢出)。这可以通过使用 paddusb
(https://www.felixcloutier.com/x86/paddusb:paddusw) 的内在函数来完成:https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=774,4179&cats=Arithmetic&text=paddusb
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。