静态调度:
动态调度:
可以看到只需要修改引导语句即可。
2.3.大规模矩阵计算优化
2.3.1.问题描述
2.3.2.构思
我这里的理解比较简单,只要完成parallel_for函数(实现for循环Pthreads的并行化),在parallel_for函数中完成分支(划分任务),创建任务,给线程分配任务即可执行。
将parallel_for 函数打包为.so 文件。调用函数时需要指定线程的工作函数,所以需要自己完成functor函数。比较简单,直接完成矩阵乘法即可。
2.3.3.核心代码
①parallel_for函数
这个需要根据总行数和线程数来划分,可能会有不均匀的情况,所以划分的时候需要注意最后一个线程要处理的行数。然后为划分的任务创建工作线程。
②For_index结构
这个结构用来表示线程需要处理的工作的数量和跨度。 (这里的span其实可以很灵活的实现,比如在矩阵乘法的最内层调用for_parallel函数时,通过指定span就可以很方便地实现矩阵乘法)
③函子函数
这里只是简单的从结构中取出线程所需的行数,进行矩阵乘法。
在Main函数中,只需要调用parallel_for函数即可。
3.实验结果3.1.基于OpenMP的通用矩阵乘法的实现
可以看到手算证明斯特拉森矩阵乘法的正确性,计算结果是正确的;
矩阵大小从512到1024,线程从1到8所需时间:
可以看出线程效率从2到4有明显提升手算证明斯特拉森矩阵乘法的正确性,但从4到8没有明显提升,主要原因是虚拟机核心数不足。
3.2.基于OpenMP的通用矩阵优化
为了体现OpenMP的任务调度机制,我们选择使用2个线程。
可以看出,静态和动态的区别并不大。我认为原因是矩阵乘法任务本身的for循环中的计算量大致相同。
3.3.基于Pthreads构造并行for循环分解、分配和执行机制。
成功生成.so文件;
成功生成可执行文件;
执行结果正确。
4.实验性想法
本实验是高性能实验的 OpenMP 部分。从简单到深入,我掌握了OpenMP的大致内容。同时,第三个任务提高了实验的难度,更好地锻炼了编程能力。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 欧资源网