OpenCL 中的 mul_hi 函数:"high half" 是什么意思?
mul_hi function in OpenCL: What does "high half" mean?
我正在尝试调试我在 OpenCL 中有 运行 的并行程序,我从那里获得了在线代码。我不明白的函数是mul_hi
和mad_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;
:a
和b
相乘,结果的高位部分向下移动并返回。 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 所建议的那样。
我正在尝试调试我在 OpenCL 中有 运行 的并行程序,我从那里获得了在线代码。我不明白的函数是mul_hi
和mad_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;
:a
和b
相乘,结果的高位部分向下移动并返回。 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 所建议的那样。