繁体   English   中英

C 中的优化

[英]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/xMfebrhttps://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM