取整和内存对齐
【摘要】 算子开发里经常会看到这些类似的代码。向上取整uint32_t coreNum = (totalElements + ubFormer - 1) / ubFormer;向下取整// 直接整数除法(C++中整数除法自动向下取整)uint32_t coreNum = totalElements / ubFormer;示例对比,假设 totalElements = 10, ubFormer = 3:...
算子开发里经常会看到这些类似的代码。
向上取整
uint32_t coreNum = (totalElements + ubFormer - 1) / ubFormer;
向下取整
// 直接整数除法(C++中整数除法自动向下取整)
uint32_t coreNum = totalElements / ubFormer;
示例对比,假设 totalElements = 10, ubFormer = 3:
- 向上取整:
(10+3-1)/3 = 12/3 = 4(需要4核) - 向下取整:
10/3 = 3(只需要3核,但最后余数未处理)
ubFormer 是每个核处理的数据量,向下取整意味着可能有些核完全空闲或未充分利用,通常切分时用向上取整更合理。
内存对齐:向下取整到对齐因子的整数倍,将 maxElemNum 向下对齐到 alignFactor 的整数倍。
ubFormer = (maxElemNum / alignFactor) * alignFactor;
假设 alignFactor = 32(常见的向量化对齐单位):
| maxElemNum | 计算过程 | 结果 |
|---|---|---|
| 100 | (100 / 32) * 32 = 3 * 32 = 96 | 向下对齐到96 |
| 128 | (128 / 32) * 32 = 4 * 32 = 128 | 正好对齐 |
| 129 | (129 / 32) * 32 = 4 * 32 = 128 | 向下对齐到128 |
| 31 | (31 / 32) * 32 = 0 * 32 = 0 | 对齐到0(需处理) |
当然,也可以向上对齐。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)