在GPU或其他并行编程中的规约算法,经常要用到大于某个数而且是2的幂的最小整数,来实现折叠计算。但是怎么来找到这个数呢?下面给出三种方法,本人觉得第三种算法最好!
方法一:
unsigned int GetNoSmall2PowNum1(unsigned int num)
{
if (num<=1) return num;
double pn=log2(num);
if ((pn-(int)pn)>DBL_EPSILON)
{
return (unsigned int)pow(2,(int)(pn)+1);
}
else
{
return (unsigned int)pow(2,(int)(pn));
}
}
方法二:
unsigned int GetNoSmall2PowNum2(unsigned int num)
{
if (num<=1) return num;
unsigned int tn=1;
width(tn<num) tn*=2;
return tn;
}
方法三:
unsigned int GetNoSmall2PowNum3(unsigned int num)
{
if (num<=1) return num;
if (num & (num-1))
{
unsigned int r=1;
while(num)
{
num>>=1;
r<<=1;
}
return r;
}
else
{
return num;
}
}
如果有更高效的方法请分享!