比特移位的目的是什么?

问题描述 投票:4回答:1

我正在审查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)

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

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

c linux driver gpu performance-testing
1个回答
10
投票

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

#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就会扮演不同价值的占位符。

实际上你可以在0DYN_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值的变化。

实际上你可以在0LC_XMIT_N_FTS宏的定义中通过LC_XMIT_N_FTS_MASK的链接代码确切地看到它。

© www.soinside.com 2019 - 2024. All rights reserved.