gpt4 book ai didi

c++ - 分支屏蔽在 CryENGINE 3 中如何工作?

转载 作者:可可西里 更新时间:2023-11-01 15:14:57 24 4
gpt4 key购买 nike

CryENGINE SDK header 的这一部分引起了我的注意:

branchmask.h

#ifndef __BRANCHLESS_MASK__
#define __BRANCHLESS_MASK__

///////////////////////////////////////////
// helper functions for branch elimination
//
// msb/lsb - most/less significant byte
//
// mask - 0xFFFFFFFF
// nz - not zero
// zr - is zero

ILINE const uint32 nz2msb(const uint32 x)
{
return -(int32)x | x;
}

ILINE const uint32 msb2mask(const uint32 x)
{
return (int32)(x) >> 31;
}

ILINE const uint32 nz2one(const uint32 x)
{
return nz2msb(x) >> 31; // int((bool)x);
}

ILINE const uint32 nz2mask(const uint32 x)
{
return (int32)msb2mask(nz2msb(x)); // -(int32)(bool)x;
}


ILINE const uint32 iselmask(const uint32 mask, uint32 x, const uint32 y)// select integer with mask (0xFFFFFFFF or 0x0 only!!!)
{
return (x & mask) | (y & ~mask);
}


ILINE const uint32 mask_nz_nz(const uint32 x, const uint32 y)// mask if( x != 0 && y != 0)
{
return msb2mask(nz2msb(x) & nz2msb(y));
}

ILINE const uint32 mask_nz_zr(const uint32 x, const uint32 y)// mask if( x != 0 && y == 0)
{
return msb2mask(nz2msb(x) & ~nz2msb(y));
}


ILINE const uint32 mask_zr_zr(const uint32 x, const uint32 y)// mask if( x == 0 && y == 0)
{
return ~nz2mask(x | y);
}

#endif//__BRANCHLESS_MASK__

有人可以简短地解释一下这些函数究竟是如何用于减少分支的吗? ILINE 我想是预定义的强制内联或类似的东西。我在谷歌上搜索了它,但我发现的只是在不同站点上传的 CryENGINE header 的拷贝,但没有关于这个特定 header 的讨论。

最佳答案

这些函数返回的位掩码可以与其他计算中的结果一起执行,以便在没有条件的情况下执行操作,因此不会引入分支。

例如:

  • nz2mask返回 0如果参数是 0 , 和 0xffffffff否则。
  • msb2mask返回 0如果参数的最高位是 0 , 和 0xffffffff如果是1 .

因此,如果您有类似的代码(带有 x86 指令以供引用):

if(a != 0) x += y;
// test ebx,ebx
// je skip
// add dword ptr [x],eax
// skip:

您可以将其替换为:

x += y & (nz2mask(a));
// mov ecx,ebx
// neg ecx
// or ecx,ebx
// sar ecx,1Fh
// and ecx,eax
// add ecx,dword ptr [x]

它产生更多的指令(​​至少在 x86 上),但它避免了分支。

然后还有像iselmask()这样的附加函数它允许根据提供的掩码选择任一输入,因此您可以替换:

x = (a != 0) ? r1 : r2;

x = iselmask(nz2mask(a), r1, r2);

同样,这些函数应该内联并编译成相对高效的汇编程序,以牺牲一些额外的数学运算来换取无分支。

关于c++ - 分支屏蔽在 CryENGINE 3 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13894302/

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