我正在尝试调试我在OpenCL中运行的一个并行程序,在那里我获得了在线代码。我不理解的函数是mul_hi和mad_hi。OpenCL规范本身相当模糊,因为它说mul_hi(a,b)计算a和b的乘积的上半部分。
他们说的高半身是什么意思??
谢谢你的帮助,阿敏
发布于 2020-10-26 00:44:49
高半部分指的是32位整数的高16位。您可以单独使用整数的4个字节(或2个半字节)。这对于ARGB颜色来说是这样的,例如,阿尔法、红色、绿色和蓝色的4个字节分别上移了8比特。
int high = ...; // 16-bit range
int low = ...; // 16-bit range
int x = high<<16|(low&0xFF); // combine high and low: shift high 16 bits left, zero the upper 16 bits from low with bit mask 0xFF and combine the two with logical or所以c=mul_hi(a,b);计算c=(a*b)>>16;:a和b相乘,结果的高部分被下移并返回。d=mad_hi(a,b,c);等同于d=mul_hi(a,b)+c;
发布于 2021-10-22 08:00:26
mul_hi(a,b)计算a*b的双宽度数据类型计算的上半部分。这意味着它会计算任何溢出原始数据类型的内容。
因此:
char a = 16; // 0b0001'0000
assert(a*a == 0); // 0b0001'0000 * 0b0001'0000 = 0b0000'0000
assert(mul_hi<char>(a,a)==1); // 0b0001'0000 * 0b0001'0000
// = upper half of (0b0000'0001'0000'0000)
// = 0b0000'0001因此,对于任何类型T,mul_hi可能输出值的范围仍然是数据类型的整个范围,而不是@ProjectPhysX建议的half数据类型的范围。
https://stackoverflow.com/questions/64526014
复制相似问题