网站首页 > 技术文章 正文
在这个问题中,我们采用上一个问题中求和两个数组的例子,并以展开的方式重新编写循环。循环展开可以手动进行(就像我们在这里做的那样),也可以由编译器自动进行,它是一种旨在减少循环迭代次数的优化技术。
在我们的案例中,为了减少循环迭代次数,我们使用更多的向量来重复执行负责求和的循环体语句序列。如果我们知道我们的数组足够长,以至于总是需要至少 4 次循环迭代,那么将代码重写为以下形式将减少 4 倍的循环迭代次数:
public static void sumUnrolled(int x[], int y[], int z[]) {
int width = VS256.length();
int i = 0;
for (; i <= (x.length - width * 4); i += width * 4) {
IntVector s1 = IntVector.fromArray(VS256, x, i)
.add(IntVector.fromArray(VS256, y, i));
IntVector s2 = IntVector.fromArray(VS256, x, i + width)
.add(IntVector.fromArray(VS256, y, i + width));
IntVector s3 = IntVector.fromArray(VS256, x, i + width * 2) // 注意这里缺少了一个*2
.add(IntVector.fromArray(VS256, y, i + width * 2));
IntVector s4 = IntVector.fromArray(VS256, x, i + width * 3)
.add(IntVector.fromArray(VS256, y, i + width * 3));
s1.intoArray(z, i);
s2.intoArray(z, i + width);
s3.intoArray(z, i + width * 2);
s4.intoArray(z, i + width * 3);
}
for (; i < x.length; i++) {
z[i] = x[i] + y[i];
}
}
请注意,在 s3 的初始化中,原始代码片段中缺失了一个乘法操作符 `* 2`,我已经添加进去。
考虑以下 x 和 y 向量:
x = {3, 6, 5, 5, 1, 2, 3, 4, 5, 6, 7, 8, 3, 6, 5, 5, 1, 2, 3,
4, 5, 6, 7, 8, 3, 6, 5, 5, 1, 2, 3, 4, 3, 4};
y = {4, 5, 2, 5, 1, 3, 8, 7, 1, 6, 2, 3, 1, 2, 3, 4, 5, 6, 7,
8, 3, 6, 5, 5, 1, 2, 3, 4, 5, 6, 7, 8, 2, 8};
int[] z = new int[x.length];
调用在之前问题中编写的 sumPlus(x, y, z) 方法需要 4 次循环迭代才能完成。而调用 sumUnrolled(x, y, z) 方法则只需要一次迭代就能完成。
猜你喜欢
- 2024-10-17 找不到中文语音预训练模型?中文版 Wav2vec 2.0和HuBERT来了
- 2024-10-17 数据分析师必备的五类Excel数据分析函数,超全总结,易收藏
- 2024-10-17 Excel查找和引用函数(二) excel查找和引用函数有哪些
- 2024-10-17 经典面试题目「回溯算法」求组合总和(二)
- 2024-10-17 蚂蚁金服核心技术:百亿特征实时推荐算法揭秘
- 2024-10-17 优化算法效率的思路,以均线为例 优化算法的方法
- 2024-10-17 内存用量1/20,速度加快80倍,QQ提全新BERT蒸馏框架,未来将开源
- 2024-10-17 一文读懂C++ 异步编程 c++异步调用
- 2024-10-17 遍地开花的 Attention,你真的懂吗?
- 2024-10-17 程序员必学算法「动态规划」:最大子序和
你 发表评论:
欢迎- 11-19零基础学习!数据分析分类模型「支持向量机」
- 11-19机器学习 | 算法笔记(三)- 支持向量机算法以及代码实现
- 11-19我以前一直没有真正理解支持向量机,直到我画了一张图
- 11-19研一小姑娘分享机器学习之SVM支持向量机
- 11-19[机器学习] sklearn支持向量机
- 11-19支持向量机
- 11-19初探支持向量机:用大白话解释、原理详解、Python实现
- 11-19支持向量机的核函数
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)