比特移位的目的是什么?

Mic*_*ney 4 c linux gpu driver performance-testing

我正在审查Linux的开源AMD GPU驱动程序.我注意到了以前没见过的东西,我想知道目的.在sid.h文件的第1441行,有一系列定义是整数被0左移位.这不会导致原始整数被操作吗?

这是摘录和头部的链接

    #define VGT_EVENT_INITIATOR                      0xA2A4
    #define SAMPLE_STREAMOUTSTATS1                   (1 << 0)
    #define SAMPLE_STREAMOUTSTATS2                   (2 << 0)
    #define SAMPLE_STREAMOUTSTATS3                   (3 << 0)
Run Code Online (Sandbox Code Playgroud)

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

此外,我正在学习访问AMD GPU的性能计数器寄存器,以计算GPU负载.关于这一点的任何提示也将受到赞赏.

AnT*_*AnT 10

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

#define FLAG_1 0x01
#define FLAG_2 0x02
#define FLAG_3 0x04
#define FLAG_4 0x08
Run Code Online (Sandbox Code Playgroud)

或者作为

#define FLAG_1 (1u << 0)
#define FLAG_2 (1u << 1)
#define FLAG_3 (1u << 2)
#define FLAG_4 (1u << 3)
Run Code Online (Sandbox Code Playgroud)

在后一种方法的第一行中,我没有必要转变0.但它看起来更加一致,并强调FLAG_1与其他旗帜具有相同性质的事实.并0充当一个不同的值的占位符,如果我有一天会改变它.

实际上,你可以看到正是带换档链接的代码通过0在定义DYN_OR_ENDYN_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` */
Run Code Online (Sandbox Code Playgroud)

同样,按位移0位纯粹是为了视觉上的一致性.以及0价值观的转变.

实际上,你可以看到正是带换档链接的代码通过0在定义LC_XMIT_N_FTSLC_XMIT_N_FTS_MASK宏.