OpenCL 中的 mul_hi 函数:"high half" 是什么意思?

mul_hi function in OpenCL: What does "high half" mean?

我正在尝试调试我在 OpenCL 中有 运行 的并行程序,我从那里获得了在线代码。我不明白的函数是mul_himad_hi。 OpenCL 规范本身非常晦涩,因为它说 mul_hi(a,b) 计算 a 和 b 的乘积的高半部分。

高半是什么意思??

感谢您的帮助 胺

高半是指32位整数的高16位。 您可以独立使用整数的 4 个字节(或 2 个半字节)。这是针对 ARGB 颜色完成的,例如 4 个字节用于 alpha、红色、绿色和蓝色,每个颜色向上移动 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;ab相乘,结果的高位部分向下移动并返回。 d=mad_hi(a,b,c); 等同于 d=mul_hi(a,b)+c;

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 可能输出值的范围仍然是数据类型的整个范围,而不是 half 数据类型的范围,正如@ProjectPhysX 所建议的那样。