代码之家  ›  专栏  ›  技术社区  ›  Michael Honey

0进行位移位的目的是什么

  •  4
  • Michael Honey  · 技术社区  · 8 年前

    我正在复习Linux的开源AMD GPU驱动程序。我注意到一些我以前从未见过的东西,我想知道它的用途。sid的第1441行。在h文件中,有一系列定义是被0左移的整数。这难道不会导致对原始整数进行运算吗?

    这是一个摘录和链接到头部

        #define VGT_EVENT_INITIATOR                      0xA2A4
        #define SAMPLE_STREAMOUTSTATS1                   (1 << 0)
        #define SAMPLE_STREAMOUTSTATS2                   (2 << 0)
        #define SAMPLE_STREAMOUTSTATS3                   (3 << 0)
    

    https://github.com/torvalds/linux/blob/master/drivers/gpu/drm/amd/amdgpu/sid.h#L1441

    此外,我正在学习访问AMD GPU的性能计数器寄存器,以计算GPU负载。如有任何提示,我们将不胜感激。

    1 回复  |  直到 8 年前
        1
  •  10
  •   AnT stands with Russia    8 年前

    这样做只是为了保持一致性(不一定适用于您的具体情况)。例如,我可以将一组单位标志描述为

    #define FLAG_1 0x01
    #define FLAG_2 0x02
    #define FLAG_3 0x04
    #define FLAG_4 0x08
    

    或作为

    #define FLAG_1 (1u << 0)
    #define FLAG_2 (1u << 1)
    #define FLAG_3 (1u << 2)
    #define FLAG_4 (1u << 3)
    

    在后一种方法的第一行中,我不必 0 . 但这样看起来更加一致,强调了以下事实: FLAG_1 与其他旗帜具有相同的性质。和 0 如果有一天我决定更改某个值,它将作为另一个值的占位符。

    实际上,您可以在带有shift by的链接代码中看到这一点 0 在定义中 DYN_OR_EN DYN_RR_EN 宏。


    该方法可以扩展到一个字内的多位字段,如下面的(人为)示例所示

    // Bits 0-3 - lower counter, bits 4-7 - upper counter
    
    #define LOWER_0  (0u << 0)
    #define LOWER_1  (1u << 0)
    #define LOWER_2  (2u << 0)
    #define LOWER_3  (3u << 0)
    
    #define UPPER_0  (0u << 4)
    #define UPPER_1  (1u << 4)
    #define UPPER_2  (2u << 4)
    #define UPPER_3  (3u << 4)
    
    unsigned packed_counters = LOWER_2 + UPPER_3; /* or `LOWER_2 | UPPER_3` */
    

    同样,通过 0 位仅用于视觉一致性。以及 0 价值观

    实际上,您可以在带有shift by的链接代码中看到这一点 0 在定义中 LC_XMIT_N_FTS LC_XMIT_N_FTS_MASK 宏。