gpt4 book ai didi

c++ - 优化从子位掩码生成父位掩码

转载 作者:搜寻专家 更新时间:2023-10-31 00:50:13 25 4
gpt4 key购买 nike

给定一个 64 位子掩码输入,例如:

10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000000

8 位父掩码为:

11111110

父掩码中的单个位映射到子掩码字符串中的 8 位,当 8 个子位中的一个设置为 1 时,父掩码中的位设置为 1。计算这个的简单算法是如下所示:

unsigned __int64 childMask = 0x8040201008040200; // The number above in hex
unsigned __int8 parentMask = 0;
for (int i = 0; i < 8; i++)
{
const unsigned __int8 child = childMask >> (8 * i);
parentMask |= (child > 0) << i;
}

我想知道上面的代码是否还有任何优化要做。代码将在 CUDA 上运行,我希望尽可能避免分支。对于答案,C++/C 中的代码就可以了。 for 循环可以展开,但我宁愿将其留给编译器进行优化,在必要时使用例如 #pragma unroll 给出提示。

最佳答案

一种可能的方法是使用 __vcmpgtu4 进行每字节比较,它以打包掩码的形式返回结果,可以与 0x08040201(高半部分为 0x80402010)进行 AND 运算以转换将它们放入最终结果的位中,但随后它们需要水平求和,这似乎没有得到很好的支持,但可以用普通的旧 C 风格代码来完成。

例如,

unsigned int low = childMask;
unsigned int high = childMask >> 32;
unsigned int lowmask = __vcmpgtu4(low, 0) & 0x08040201;
unsigned int highmask = __vcmpgtu4(high, 0) & 0x80402010;
unsigned int mask = lowmask | highmask;
mask |= mask >> 16;
mask |= mask >> 8;
parentMask = mask & 0xff;

关于c++ - 优化从子位掩码生成父位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58155201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com