位移 0 的目的是什么

What is the purpose of bitshifting by 0

我正在查看 Linux 的开源 AMD GPU 驱动程序。我注意到一些我以前没有见过的东西,我想知道目的。在sid.h文件的第1441行,有一系列定义是整数被左移0位。这不就是对原始整数进行运算吗?

这里是摘录和link到头

    #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 负载。对此的任何提示也将不胜感激。

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

#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 充当不同值的占位符,如果有一天我决定更改它。

您实际上可以在 DYN_OR_ENDYN_RR_EN 宏的定义中通过 0 移位的链接代码中准确地看到这一点。


该方法可以扩展到单词中的多位字段,如以下(人为的)示例

// 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 值的变化。

您实际上可以在 LC_XMIT_N_FTSLC_XMIT_N_FTS_MASK 宏的定义中通过 0 移位的链接代码中准确地看到这一点。