一种实用的循环展开技术

时间:2011-04-03 01:27:19

标签: c++ c optimization loops duffs-device

我找到了一个实用的循环展开技术示例。

我认为Duff的设备是一个不错的提示 但是Duff's device's destination is never increased。对于将数据复制到串行设备而非普通程序员的嵌入式程序员来说,它可能很有用。

你能给我一个很好的有用的例子吗? 如果您曾在实际代码中使用它,那就更好了。

3 个答案:

答案 0 :(得分:4)

最实用的技术是学习并喜欢编译器的优化选项,如果在分析中遇到热点,偶尔会手动检查生成的程序集。

答案 1 :(得分:1)

我不确定你的意思是“目的地永远不会增加。”

手动循环展开相当罕见。如今的嵌入式微处理器足够快,不需要这样的优化(并且会浪费宝贵的程序存储器)。

我在线性求解器内核中使用了Duff设备的变体。每个back_step必须有一个fwd_step,并且它们以四个为一组执行。

请注意,前向和后向循环由goto实现。当跳过if中的fwd_step时,执行跳转到后向循环的中间。所以它真的是一种双Duff的设备。

这不是任何一种“实用”技术,它只是我能找到表达一些非常复杂的流量控制的最好方法。

switch ( entry ) {

#define fwd_step( index )                                                                                         \
                                                                                                     \
case (index):                                                                                                    \
    if ( -- count ) {                                                                                               \
        ...

startf:
    fwd_step( 0 )
    fwd_step( 1 )
    fwd_step( 2 )
    fwd_step( 3 )

        stream = stream_back;
        goto startf;


#define back_step( index )                                                            \
        .... \
    }                                                                                    \

startb:
    stream -= block_size;

    back_step( 3 )
    if ( ! -- countb ) break;
    back_step( 2 )
    if ( ! -- countb ) break;
    back_step( 1 )
    if ( ! -- countb ) break;
    back_step( 0 )
        if ( -- countb ) goto startb;
} // end switch

答案 2 :(得分:0)

(为了其他人的利益,可以找到关于Duff设备的背景herehere

我在图像处理优化中遇到过这种情况,尤其是处理边界条件,其中要复制的像素少于完整的图块或内核(这样可以避免在每个坐标处进行测试。)