SIMT 样例开发需求
编程模型
特殊值处理放在正常值路径之前,命中即提前 return 基线
case1(hlog10)
特殊值处理放在正常值路径之后,统一 return 临时变量 temp 优化方式,与基线对照特殊值处理的位置
case2(j0f) NaN/Inf 特殊值处理放在正常数据之前,所有分支命中即直接返回 基线
case3(j0f)
正常数据分段处理后逐级覆盖临时变量 result,NaN/Inf 特殊值处理放在最后,统一 return 优化方式一:全部分支统一 return,与 case2 对照返回方式 case4(j0f) 覆盖范围广的低值段与中值段命中后直接返回,高值段算出 result,特殊值处理放在最后覆盖 result,统一 return 优化方式二:大范围分支直接返回、剩余统一 return,与 case2 对照返回方式
计算逻辑 case0(hlog10):特殊值处理放在正常值路径之前,命中即 return 先对精度有偏差的特殊值做矫正,命中即返回修正结果;全部未命中则继续执行正常值路径。 SIMT_DEVICE_FUNCTIONS_DECL inline half hlog10_case0(half x) { if (x == static_cast(0.2362060546875f)) { return static_cast(-0.62646484375f); } else if (x == static_cast(0.2490234375f)) { return static_cast(-0.60400390625f); } else if (x == static_cast(3.0703125f)) { return static_cast(0.487060546875f); } else if (x == static_cast(126.0625f)) { return static_cast(2.099609375f); } else if (x == static_cast(11496.0f)) { return static_cast(4.05859375f); } else if (x == static_cast(2976.0f)) { return static_cast(3.474609375f); } float x_fp32 = __cvt_float<__internal_get_round<__RoundMode::CAST_RINT>(), RoundingSaturation::RS_DISABLE_VALUE>(x); float result_fp32 = logf(x_fp32) / logf(10.0f); // log10(x) = log(x) / log(10) return __cvt_half<__internal_get_round<__RoundMode::CAST_RINT>(), RoundingSaturation::RS_DISABLE_VALUE>(result_fp32); } case1(hlog10):特殊值处理放在正常值路径之后,统一 return temp 先完整执行正常值路径得到 temp,再对精度有偏差的特殊值做矫正,覆盖 temp,最后统一返回 temp。 SIMT_DEVICE_FUNCTIONS_DECL inline half hlog10_case1(half x) { float x_fp32 = __cvt_float<__internal_get_round<__RoundMode::CAST_RINT>(), RoundingSaturation::RS_DISABLE_VALUE>(x); float result_fp32 = logf(x_fp32) / logf(10.0f); // log10(x) = log(x) / log(10) half temp = __cvt_half<__internal_get_round<__RoundMode::CAST_RINT>(), RoundingSaturation::RS_DISABLE_VALUE>(result_fp32); if (x == static_cast(0.2362060546875f)) { temp = static_cast(-0.62646484375f); } else if (x == static_cast(0.2490234375f)) { temp = static_cast(-0.60400390625f); } else if (x == static_cast(3.0703125f)) { temp = static_cast(0.487060546875f); } else if (x == static_cast(126.0625f)) { temp = static_cast(2.099609375f); } else if (x == static_cast(11496.0f)) { temp = static_cast(4.05859375f); } else if (x == static_cast(2976.0f)) { temp = static_cast(3.474609375f); } return temp; } case2(j0f):所有分支命中即直接返回 先处理 NaN/Inf 特殊值,命中即返回;再依次处理低值段、中值段、高值段,任一段命中即返回该段结果,无统一出口。 SIMT_DEVICE_FUNCTIONS_DECL inline float j0f_case2(float x) { if (__isnan(x)) { return x; } float ax = __fabsf(x); if (__isinf(ax)) { return 0.0f; } if (ax <= 8.0f) { return __internal_j0f_less8(ax); } if (ax <= 1.0e13f) { return __internal_j0f_middle_range(ax); } return __internal_j0f_huge_range(ax); } case3(j0f):全部分支命中后逐级覆盖,统一 return 先按数值最大的高值段算出 result,随后中值段与低值段处理依次执行,命中则覆盖 result,最后经 NaN/Inf 特殊值处理覆盖 result,统一返回。 SIMT_DEVICE_FUNCTIONS_DECL inline float j0f_case3(float x) { float ax = __fabsf(x); float result = __internal_j0f_huge_range(ax); if (ax <= 1.0e13f) { result = __internal_j0f_middle_range(ax); } if (ax <= 8.0f) { result = __internal_j0f_less8(ax); } if (__isnan(x)) { result = x; // NaN -> NaN } if (__isinf(ax)) { result = 0.0f; // ±Inf -> 0 } return result; } case4(j0f):部分分支直接返回,剩余统一 return 先处理覆盖范围广的低值段与中值段,命中即返回;未命中的输入按高值段算出 result,再经 NaN/Inf 特殊值处理覆盖 result,最后统一返回。 SIMT_DEVICE_FUNCTIONS_DECL inline float j0f_case4(float x) { float ax = __fabsf(x); if (ax <= 8.0f) { return __internal_j0f_less8(ax); } if (ax <= 1.0e13f) { return __internal_j0f_middle_range(ax); } float result = __internal_j0f_huge_range(ax); if (__isnan(x)) { result = x; } if (__isinf(ax)) { result = 0.0f; } return result; } 预期结果
您好,感谢您的建议,我们将安排希求增加此样例
Background(背景信息)
Origin(信息来源)
SIMT 样例开发需求
Benefit / Necessity (价值/作用)
Design(设计方案)
编程模型
入参与出参
case对照设计.
case
分支结构
对照范围
case0(hlog10)
特殊值处理放在正常值路径之前,命中即提前 return
基线
case1(hlog10)
特殊值处理放在正常值路径之后,统一 return 临时变量 temp
优化方式,与基线对照特殊值处理的位置
case2(j0f)
NaN/Inf 特殊值处理放在正常数据之前,所有分支命中即直接返回
基线
case3(j0f)
正常数据分段处理后逐级覆盖临时变量 result,NaN/Inf 特殊值处理放在最后,统一 return
优化方式一:全部分支统一 return,与 case2 对照返回方式
case4(j0f)
覆盖范围广的低值段与中值段命中后直接返回,高值段算出 result,特殊值处理放在最后覆盖 result,统一 return
优化方式二:大范围分支直接返回、剩余统一 return,与 case2 对照返回方式
计算逻辑(0.2362060546875f)) {(-0.62646484375f);(0.2490234375f)) {(-0.60400390625f);(3.0703125f)) {(0.487060546875f);(126.0625f)) {(2.099609375f);(11496.0f)) {(4.05859375f);(2976.0f)) {(3.474609375f);(0.2362060546875f)) {(-0.62646484375f);(0.2490234375f)) {(-0.60400390625f);(3.0703125f)) {(0.487060546875f);(126.0625f)) {(2.099609375f);(11496.0f)) {(4.05859375f);(2976.0f)) {(3.474609375f);
case0(hlog10):特殊值处理放在正常值路径之前,命中即 return
先对精度有偏差的特殊值做矫正,命中即返回修正结果;全部未命中则继续执行正常值路径。
SIMT_DEVICE_FUNCTIONS_DECL inline half hlog10_case0(half x)
{
if (x == static_cast
return static_cast
} else if (x == static_cast
return static_cast
} else if (x == static_cast
return static_cast
} else if (x == static_cast
return static_cast
} else if (x == static_cast
return static_cast
} else if (x == static_cast
return static_cast
}
float x_fp32 = __cvt_float<__internal_get_round<__RoundMode::CAST_RINT>(), RoundingSaturation::RS_DISABLE_VALUE>(x);
float result_fp32 = logf(x_fp32) / logf(10.0f); // log10(x) = log(x) / log(10)
return __cvt_half<__internal_get_round<__RoundMode::CAST_RINT>(), RoundingSaturation::RS_DISABLE_VALUE>(result_fp32);
}
case1(hlog10):特殊值处理放在正常值路径之后,统一 return temp
先完整执行正常值路径得到 temp,再对精度有偏差的特殊值做矫正,覆盖 temp,最后统一返回 temp。
SIMT_DEVICE_FUNCTIONS_DECL inline half hlog10_case1(half x)
{
float x_fp32 = __cvt_float<__internal_get_round<__RoundMode::CAST_RINT>(), RoundingSaturation::RS_DISABLE_VALUE>(x);
float result_fp32 = logf(x_fp32) / logf(10.0f); // log10(x) = log(x) / log(10)
half temp = __cvt_half<__internal_get_round<__RoundMode::CAST_RINT>(), RoundingSaturation::RS_DISABLE_VALUE>(result_fp32);
if (x == static_cast
temp = static_cast
} else if (x == static_cast
temp = static_cast
} else if (x == static_cast
temp = static_cast
} else if (x == static_cast
temp = static_cast
} else if (x == static_cast
temp = static_cast
} else if (x == static_cast
temp = static_cast
}
return temp;
}
case2(j0f):所有分支命中即直接返回
先处理 NaN/Inf 特殊值,命中即返回;再依次处理低值段、中值段、高值段,任一段命中即返回该段结果,无统一出口。
SIMT_DEVICE_FUNCTIONS_DECL inline float j0f_case2(float x)
{
if (__isnan(x)) {
return x;
}
float ax = __fabsf(x);
if (__isinf(ax)) {
return 0.0f;
}
if (ax <= 8.0f) {
return __internal_j0f_less8(ax);
}
if (ax <= 1.0e13f) {
return __internal_j0f_middle_range(ax);
}
return __internal_j0f_huge_range(ax);
}
case3(j0f):全部分支命中后逐级覆盖,统一 return
先按数值最大的高值段算出 result,随后中值段与低值段处理依次执行,命中则覆盖 result,最后经 NaN/Inf 特殊值处理覆盖 result,统一返回。
SIMT_DEVICE_FUNCTIONS_DECL inline float j0f_case3(float x)
{
float ax = __fabsf(x);
float result = __internal_j0f_huge_range(ax);
if (ax <= 1.0e13f) {
result = __internal_j0f_middle_range(ax);
}
if (ax <= 8.0f) {
result = __internal_j0f_less8(ax);
}
if (__isnan(x)) {
result = x; // NaN -> NaN
}
if (__isinf(ax)) {
result = 0.0f; // ±Inf -> 0
}
return result;
}
case4(j0f):部分分支直接返回,剩余统一 return
先处理覆盖范围广的低值段与中值段,命中即返回;未命中的输入按高值段算出 result,再经 NaN/Inf 特殊值处理覆盖 result,最后统一返回。
SIMT_DEVICE_FUNCTIONS_DECL inline float j0f_case4(float x)
{
float ax = __fabsf(x);
if (ax <= 8.0f) {
return __internal_j0f_less8(ax);
}
if (ax <= 1.0e13f) {
return __internal_j0f_middle_range(ax);
}
float result = __internal_j0f_huge_range(ax);
if (__isnan(x)) {
result = x;
}
if (__isinf(ax)) {
result = 0.0f;
}
return result;
}
预期结果
出口标准