分治法之并行计算(附多台机器测试结果)

前言

本文以一个简单的求和问题,展示如何通过并行计算使用分治法求解。

问题

求    ∑ n = 1 1 0 9 f ( n ) ,    其 中   f ( n ) = 3 n 3 + 2 n 2 + 5 n − 10. 求\; \sum^{10^9}_{n=1} f(n), \;其中\: f(n) = 3n^3+2n^2+5n-10. n=1109f(n),f(n)=3n3+2n2+5n10.

分析

由于每次调用 f ( n ) f(n) f(n)是独立的,所以我们可以分段计算,比如平均分成 [ 1 , 2 , . . , 5.0 × 1 0 8 ] [1, 2, .., 5.0\times 10^8] [1,2,..,5.0×108] [ 5.0 × 1 0 8 + 1 , 5.0 × 1 0 8 + 2 , . . . , 1 0 9 ] [5.0\times 10^8 + 1, 5.0\times 10^8 + 2, ..., 10^9] [5.0×108+1,5.0×108+2,...,109] 两段,然后分别计算后再求和,如下所示:
∑ n = 1 1 0 9 f ( n ) = ∑ n = 1 5.0 × 1 0 8 f ( n ) + ∑ n = 5.0 × 1 0 8 + 1 1 0 9 f ( n ) \sum^{10^9}_{n=1} f(n) = \sum^{5.0\times 10^8}_{n=1} f(n) + \sum^{10^9}_{n=5.0\times10^8+1} f(n) n=1109f(n)=n=15.0×108f(n)+n=5.0×108+1109f(n)
由于两段的求值是完全独立的,所以我们可以利用多核CPU进行计算,然后等两段计算都完成后,再将计算的结果合并。以上是以两段为例,我们可以分成n段,这样可以充分利用多核CPU的处理能力。同时,根据一般常识,当由于达到CPU的最大核心后,再增加线程已经不会减少运算时间(双13线程时在MBP上的测试),所以以下测试时最多线程数只取和CPU最大线程相同。

机器列表

名称类型CPU核心与线程内存容量与类型SSD
PC1桌面i5 9600K @ 3.60GHz6核6线程32G DDR4512GB NVME
Honor2018笔记本i7 8550U @ 1.80GHz4核8线程8GB, DDR4256 SSD
MBP 2018笔记本i7-8750H @ 2.20GHz6核12线程32 GB, DDR4 2400512 SSD
Server1服务器i7 3930K @ 3.20GHz6核12线程64GB, DDR3 1600512 SSD
Server2服务器双Xeon E5 2600v2 @ 3.10GHz20核40线程128GB, DD3512 SSD

测试结果

以下结果最多6核心计算的运行结果(单位:ms)。

线程数123456
PC1 (6C6T)54362751184314071134962
Honor2018 (4C8T)765340632979217019251663
MBP (6C12T)594929942001150912111016
Server1 (6C12T)739937642476175114141194
Server2 (20C40T)1057153093545267121571814

以下为使用超过6线程计算的运行结果(单位:ms)

线程数7891011121314151617181920
MBP (6C12T)877775695628581542542-------
Server1 (6C12T)1029913826802784791--------
Server2 (20C40T)1555127411401051964897844807774731710681656646

一些结论

  • 通过增加核心数,能够有效减少运行时间。
  • 物理核心比超线程能够更加有效地减少时间。
  • 一般有超线程的CPU,超线程部分能带来约80%的物理核心性能。
  • MBP的超线程约可以带来 95%的真核性能。
  • i5 9600K 的单核性能最强,MBP的i7 8750H作为笔记本居然达到i5 9600K的91.6%。
  • MBP的多核性能非常强大,在不超过6校时,性能接近台式 i5 9600K;10线程就达到了双至强20物理核心的性能!而12线程全开时,达到所有机器的最强性能。
  • 初始化频率不能反应实际运行时的性能情况。
  • 当CPU满核心运行后,再增加线程不能减少运算时间。

日志

以下为所有配置的日志信息

PC1

i5 9600K 6C6T + 32GB

c:\temp>java ParallelDemo 1
ID: 0 finished in 5436 ms.
Time: 5473 ms. Result = 7.500000e+35

c:\temp>java ParallelDemo 2
ID: 1 finished in 2727 ms.
ID: 0 finished in 2727 ms.
Time: 2751 ms. Result = 7.500000e+35

c:\temp>java ParallelDemo 3
ID: 2 finished in 1820 ms.
ID: 1 finished in 1822 ms.
ID: 0 finished in 1820 ms.
Time: 1843 ms. Result = 7.500000e+35

c:\temp>java ParallelDemo 4
ID: 3 finished in 1381 ms.
ID: 0 finished in 1385 ms.
ID: 2 finished in 1385 ms.
ID: 1 finished in 1385 ms.
Time: 1407 ms. Result = 7.500000e+35

c:\temp>java ParallelDemo 5
ID: 1 finished in 1108 ms.
ID: 0 finished in 1114 ms.
ID: 2 finished in 1111 ms.
ID: 4 finished in 1110 ms.
ID: 3 finished in 1109 ms.
Time: 1134 ms. Result = 7.500000e+35

c:\temp>java ParallelDemo 6
ID: 2 finished in 935 ms.
ID: 5 finished in 944 ms.
ID: 1 finished in 942 ms.
ID: 0 finished in 941 ms.
ID: 4 finished in 939 ms.
ID: 3 finished in 938 ms.
Time: 962 ms. Result = 7.500000e+35

Honor 2018

D:\Java>javac ParallelDemo.java && java ParallelDemo 1
ID: 0 finished in 7653 ms.
Time: 7653 ms. Result = 7.500000e+35

D:\Java>javac ParallelDemo.java && java ParallelDemo 2
ID: 0 finished in 4057 ms.
ID: 1 finished in 4061 ms.
Time: 4063 ms. Result = 7.500000e+35

D:\Java>javac ParallelDemo.java && java ParallelDemo 3
ID: 0 finished in 2975 ms.
ID: 1 finished in 2977 ms.
ID: 2 finished in 2975 ms.
Time: 2979 ms. Result = 7.500000e+35

D:\Java>javac ParallelDemo.java && java ParallelDemo 4
ID: 1 finished in 2155 ms.
ID: 2 finished in 2169 ms.
ID: 0 finished in 2159 ms.
ID: 3 finished in 2157 ms.
Time: 2170 ms. Result = 7.500000e+35

D:\Java>javac ParallelDemo.java && java ParallelDemo 5
ID: 3 finished in 1881 ms.
ID: 4 finished in 1922 ms.
ID: 1 finished in 1923 ms.
ID: 2 finished in 1889 ms.
ID: 0 finished in 1888 ms.
Time: 1925 ms. Result = 7.500000e+35

D:\Java>javac ParallelDemo.java && java ParallelDemo 6
ID: 4 finished in 1569 ms.
ID: 0 finished in 1583 ms.
ID: 5 finished in 1623 ms.
ID: 1 finished in 1633 ms.
ID: 3 finished in 1650 ms.
ID: 2 finished in 1662 ms.
Time: 1663 ms. Result = 7.500000e+35

MBP 2018

(base) haodeMBP:java hao$ java ParallelDemo 1
ID: 0 finished in 5949 ms. 
Time: 5949 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 2
ID: 1 finished in 2993 ms. 
ID: 0 finished in 2994 ms. 
Time: 2994 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 3
ID: 1 finished in 2000 ms. 
ID: 0 finished in 2000 ms. 
ID: 2 finished in 2000 ms. 
Time: 2001 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 4
ID: 1 finished in 1503 ms. 
ID: 2 finished in 1508 ms. 
ID: 0 finished in 1506 ms. 
ID: 3 finished in 1505 ms. 
Time: 1509 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 5
ID: 1 finished in 1210 ms. 
ID: 2 finished in 1211 ms. 
ID: 3 finished in 1210 ms. 
ID: 4 finished in 1210 ms. 
ID: 0 finished in 1210 ms. 
Time: 1211 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 6
ID: 3 finished in 1014 ms. 
ID: 1 finished in 1016 ms. 
ID: 2 finished in 1016 ms. 
ID: 5 finished in 1015 ms. 
ID: 0 finished in 1015 ms. 
ID: 4 finished in 1015 ms. 
Time: 1016 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 7
ID: 4 finished in 875 ms. 
ID: 2 finished in 878 ms. 
ID: 0 finished in 878 ms. 
ID: 1 finished in 878 ms. 
ID: 5 finished in 877 ms. 
ID: 6 finished in 876 ms. 
ID: 3 finished in 877 ms. 
Time: 877 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 8
ID: 5 finished in 772 ms. 
ID: 6 finished in 775 ms. 
ID: 7 finished in 775 ms. 
ID: 1 finished in 774 ms. 
ID: 4 finished in 774 ms. 
ID: 3 finished in 773 ms. 
ID: 0 finished in 773 ms. 
ID: 2 finished in 773 ms. 
Time: 775 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 9
ID: 0 finished in 692 ms. 
ID: 1 finished in 695 ms. 
ID: 2 finished in 694 ms. 
ID: 7 finished in 694 ms. 
ID: 6 finished in 693 ms. 
ID: 5 finished in 693 ms. 
ID: 3 finished in 693 ms. 
ID: 8 finished in 691 ms. 
ID: 4 finished in 692 ms. 
Time: 695 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 10
ID: 1 finished in 627 ms. 
ID: 4 finished in 628 ms. 
ID: 6 finished in 628 ms. 
ID: 2 finished in 629 ms. 
ID: 9 finished in 627 ms. 
ID: 0 finished in 628 ms. 
ID: 5 finished in 627 ms. 
ID: 3 finished in 627 ms. 
ID: 8 finished in 626 ms. 
ID: 7 finished in 626 ms. 
Time: 628 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 11
ID: 8 finished in 576 ms. 
ID: 6 finished in 580 ms. 
ID: 0 finished in 579 ms. 
ID: 2 finished in 577 ms. 
ID: 1 finished in 578 ms. 
ID: 4 finished in 577 ms. 
ID: 3 finished in 577 ms. 
ID: 10 finished in 577 ms. 
ID: 5 finished in 577 ms. 
ID: 9 finished in 576 ms. 
ID: 7 finished in 576 ms. 
Time: 581 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 12
ID: 9 finished in 532 ms. 
ID: 0 finished in 542 ms. 
ID: 1 finished in 541 ms. 
ID: 11 finished in 538 ms. 
ID: 4 finished in 537 ms. 
ID: 7 finished in 537 ms. 
ID: 3 finished in 535 ms. 
ID: 5 finished in 534 ms. 
ID: 8 finished in 534 ms. 
ID: 2 finished in 534 ms. 
ID: 6 finished in 532 ms. 
ID: 10 finished in 532 ms. 
Time: 542 ms. Result = 7.500000e+35
(base) haodeMBP:java hao$ java ParallelDemo 13
ID: 1 finished in 531 ms. 
ID: 5 finished in 540 ms. 
ID: 9 finished in 539 ms. 
ID: 4 finished in 539 ms. 
ID: 7 finished in 539 ms. 
ID: 12 finished in 530 ms. 
ID: 6 finished in 538 ms. 
ID: 0 finished in 537 ms. 
ID: 3 finished in 537 ms. 
ID: 2 finished in 537 ms. 
ID: 11 finished in 536 ms. 
ID: 8 finished in 535 ms. 
ID: 10 finished in 550 ms. 
Time: 542 ms. Result = 7.500000e+35

Server 1

c:\java>java ParallelDemo 1
ID: 0 finished in 7399 ms.
Time: 7401 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 2
ID: 1 finished in 3762 ms.
ID: 0 finished in 3763 ms.
Time: 3764 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 3
ID: 0 finished in 2467 ms.
ID: 2 finished in 2474 ms.
ID: 1 finished in 2472 ms.
Time: 2476 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 4
ID: 0 finished in 1736 ms.
ID: 2 finished in 1750 ms.
ID: 1 finished in 1749 ms.
ID: 3 finished in 1739 ms.
Time: 1751 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 5
ID: 3 finished in 1412 ms.
ID: 4 finished in 1412 ms.
ID: 2 finished in 1412 ms.
ID: 0 finished in 1412 ms.
ID: 1 finished in 1412 ms.
Time: 1414 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 6
ID: 4 finished in 1193 ms.
ID: 5 finished in 1192 ms.
ID: 2 finished in 1193 ms.
ID: 1 finished in 1193 ms.
ID: 3 finished in 1193 ms.
ID: 0 finished in 1193 ms.
Time: 1194 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 7
ID: 5 finished in 1021 ms.
ID: 2 finished in 1027 ms.
ID: 3 finished in 1025 ms.
ID: 0 finished in 1024 ms.
ID: 4 finished in 1024 ms.
ID: 1 finished in 1024 ms.
ID: 6 finished in 1023 ms.
Time: 1029 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 8
ID: 6 finished in 906 ms.
ID: 0 finished in 913 ms.
ID: 2 finished in 909 ms.
ID: 1 finished in 910 ms.
ID: 4 finished in 907 ms.
ID: 7 finished in 907 ms.
ID: 5 finished in 907 ms.
ID: 3 finished in 906 ms.
Time: 913 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 9
ID: 4 finished in 816 ms.
ID: 8 finished in 824 ms.
ID: 5 finished in 823 ms.
ID: 3 finished in 823 ms.
ID: 6 finished in 821 ms.
ID: 7 finished in 821 ms.
ID: 2 finished in 819 ms.
ID: 1 finished in 819 ms.
ID: 0 finished in 819 ms.
Time: 826 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 10
ID: 0 finished in 759 ms.
ID: 7 finished in 801 ms.
ID: 1 finished in 798 ms.
ID: 6 finished in 797 ms.
ID: 8 finished in 794 ms.
ID: 3 finished in 793 ms.
ID: 4 finished in 781 ms.
ID: 5 finished in 776 ms.
ID: 2 finished in 769 ms.
ID: 9 finished in 759 ms.
Time: 802 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 11
ID: 9 finished in 705 ms.
ID: 2 finished in 763 ms.
ID: 0 finished in 755 ms.
ID: 4 finished in 749 ms.
ID: 3 finished in 741 ms.
ID: 6 finished in 718 ms.
ID: 8 finished in 712 ms.
ID: 1 finished in 783 ms.
ID: 7 finished in 782 ms.
ID: 10 finished in 770 ms.
ID: 5 finished in 770 ms.
Time: 784 ms. Result = 7.500000e+35

c:\java>java ParallelDemo 12
ID: 2 finished in 648 ms.
ID: 11 finished in 665 ms.
ID: 3 finished in 660 ms.
ID: 8 finished in 649 ms.
ID: 9 finished in 729 ms.
ID: 6 finished in 738 ms.
ID: 5 finished in 755 ms.
ID: 0 finished in 766 ms.
ID: 1 finished in 762 ms.
ID: 7 finished in 762 ms.
ID: 4 finished in 761 ms.
ID: 10 finished in 790 ms.
Time: 791 ms. Result = 7.500000e+35

Server2


c:\Java>java ParallelDemo 1
Error: could not open `C:\Program Files\Java\jre1.8.0_211\lib\amd64\jvm.cfg'

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDeme 1
错误: 找不到或无法加载主类 ParallelDeme

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 1
ID: 0 finished in 10569 ms.
Time: 10571 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 2
ID: 0 finished in 5305 ms.
ID: 1 finished in 5305 ms.
Time: 5309 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 3
ID: 1 finished in 3541 ms.
ID: 0 finished in 3544 ms.
ID: 2 finished in 3542 ms.
Time: 3545 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 4
ID: 1 finished in 2669 ms.
ID: 2 finished in 2669 ms.
ID: 0 finished in 2669 ms.
ID: 3 finished in 2669 ms.
Time: 2671 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 5
ID: 3 finished in 2145 ms.
ID: 4 finished in 2156 ms.
ID: 0 finished in 2155 ms.
ID: 2 finished in 2145 ms.
ID: 1 finished in 2145 ms.
Time: 2157 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 6
ID: 3 finished in 1805 ms.
ID: 0 finished in 1811 ms.
ID: 4 finished in 1810 ms.
ID: 2 finished in 1810 ms.
ID: 1 finished in 1808 ms.
ID: 5 finished in 1806 ms.
Time: 1814 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 7
ID: 3 finished in 1551 ms.
ID: 5 finished in 1554 ms.
ID: 2 finished in 1551 ms.
ID: 1 finished in 1551 ms.
ID: 0 finished in 1551 ms.
ID: 6 finished in 1551 ms.
ID: 4 finished in 1551 ms.
Time: 1555 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 8
ID: 1 finished in 1269 ms.
ID: 0 finished in 1273 ms.
ID: 6 finished in 1272 ms.
ID: 2 finished in 1272 ms.
ID: 4 finished in 1272 ms.
ID: 5 finished in 1270 ms.
ID: 7 finished in 1269 ms.
ID: 3 finished in 1269 ms.
Time: 1274 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 9
ID: 5 finished in 1135 ms.
ID: 2 finished in 1139 ms.
ID: 3 finished in 1138 ms.
ID: 7 finished in 1137 ms.
ID: 1 finished in 1138 ms.
ID: 4 finished in 1137 ms.
ID: 6 finished in 1135 ms.
ID: 8 finished in 1135 ms.
ID: 0 finished in 1136 ms.
Time: 1140 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 10
ID: 5 finished in 1035 ms.
ID: 6 finished in 1049 ms.
ID: 1 finished in 1049 ms.
ID: 2 finished in 1048 ms.
ID: 7 finished in 1048 ms.
ID: 9 finished in 1039 ms.
ID: 8 finished in 1036 ms.
ID: 0 finished in 1036 ms.
ID: 4 finished in 1036 ms.
ID: 3 finished in 1035 ms.
Time: 1051 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 11
ID: 2 finished in 952 ms.
ID: 6 finished in 961 ms.
ID: 7 finished in 961 ms.
ID: 5 finished in 961 ms.
ID: 3 finished in 961 ms.
ID: 9 finished in 960 ms.
ID: 1 finished in 957 ms.
ID: 8 finished in 951 ms.
ID: 10 finished in 951 ms.
ID: 0 finished in 952 ms.
ID: 4 finished in 952 ms.
Time: 964 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 12
ID: 4 finished in 895 ms.
ID: 3 finished in 896 ms.
ID: 0 finished in 896 ms.
ID: 10 finished in 896 ms.
ID: 9 finished in 895 ms.
ID: 5 finished in 895 ms.
ID: 1 finished in 895 ms.
ID: 7 finished in 895 ms.
ID: 11 finished in 894 ms.
ID: 8 finished in 895 ms.
ID: 2 finished in 895 ms.
ID: 6 finished in 895 ms.
Time: 897 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 13
ID: 9 finished in 830 ms.
ID: 8 finished in 842 ms.
ID: 0 finished in 843 ms.
ID: 10 finished in 842 ms.
ID: 4 finished in 841 ms.
ID: 12 finished in 841 ms.
ID: 2 finished in 839 ms.
ID: 3 finished in 837 ms.
ID: 6 finished in 832 ms.
ID: 1 finished in 833 ms.
ID: 5 finished in 832 ms.
ID: 7 finished in 831 ms.
ID: 11 finished in 831 ms.
Time: 844 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 14
ID: 7 finished in 794 ms.
ID: 4 finished in 807 ms.
ID: 3 finished in 807 ms.
ID: 13 finished in 806 ms.
ID: 0 finished in 806 ms.
ID: 10 finished in 805 ms.
ID: 6 finished in 802 ms.
ID: 1 finished in 799 ms.
ID: 2 finished in 798 ms.
ID: 12 finished in 795 ms.
ID: 8 finished in 796 ms.
ID: 5 finished in 795 ms.
ID: 9 finished in 793 ms.
ID: 11 finished in 793 ms.
Time: 807 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 15
ID: 9 finished in 757 ms.
ID: 3 finished in 772 ms.
ID: 2 finished in 773 ms.
ID: 4 finished in 772 ms.
ID: 0 finished in 772 ms.
ID: 11 finished in 768 ms.
ID: 12 finished in 768 ms.
ID: 8 finished in 766 ms.
ID: 1 finished in 767 ms.
ID: 6 finished in 763 ms.
ID: 10 finished in 761 ms.
ID: 5 finished in 760 ms.
ID: 14 finished in 759 ms.
ID: 7 finished in 758 ms.
ID: 13 finished in 756 ms.
Time: 774 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 16
ID: 9 finished in 718 ms.
ID: 15 finished in 729 ms.
ID: 1 finished in 729 ms.
ID: 2 finished in 729 ms.
ID: 0 finished in 729 ms.
ID: 11 finished in 728 ms.
ID: 8 finished in 729 ms.
ID: 14 finished in 727 ms.
ID: 4 finished in 726 ms.
ID: 6 finished in 724 ms.
ID: 5 finished in 723 ms.
ID: 10 finished in 721 ms.
ID: 12 finished in 720 ms.
ID: 13 finished in 719 ms.
ID: 7 finished in 720 ms.
ID: 3 finished in 719 ms.
Time: 731 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 17
ID: 4 finished in 706 ms.
ID: 15 finished in 709 ms.
ID: 14 finished in 708 ms.
ID: 6 finished in 709 ms.
ID: 10 finished in 709 ms.
ID: 11 finished in 708 ms.
ID: 12 finished in 708 ms.
ID: 7 finished in 709 ms.
ID: 16 finished in 708 ms.
ID: 8 finished in 708 ms.
ID: 0 finished in 708 ms.
ID: 13 finished in 707 ms.
ID: 5 finished in 708 ms.
ID: 2 finished in 708 ms.
ID: 9 finished in 707 ms.
ID: 1 finished in 707 ms.
ID: 3 finished in 707 ms.
Time: 710 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 18
ID: 17 finished in 670 ms.
ID: 3 finished in 680 ms.
ID: 6 finished in 679 ms.
ID: 10 finished in 678 ms.
ID: 13 finished in 677 ms.
ID: 0 finished in 677 ms.
ID: 4 finished in 677 ms.
ID: 2 finished in 677 ms.
ID: 14 finished in 675 ms.
ID: 5 finished in 675 ms.
ID: 7 finished in 674 ms.
ID: 8 finished in 673 ms.
ID: 12 finished in 673 ms.
ID: 9 finished in 672 ms.
ID: 11 finished in 672 ms.
ID: 1 finished in 672 ms.
ID: 16 finished in 670 ms.
ID: 15 finished in 670 ms.
Time: 681 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 19
ID: 10 finished in 646 ms.
ID: 3 finished in 656 ms.
ID: 13 finished in 653 ms.
ID: 8 finished in 654 ms.
ID: 7 finished in 653 ms.
ID: 16 finished in 652 ms.
ID: 15 finished in 652 ms.
ID: 1 finished in 653 ms.
ID: 18 finished in 651 ms.
ID: 0 finished in 652 ms.
ID: 9 finished in 651 ms.
ID: 2 finished in 649 ms.
ID: 5 finished in 649 ms.
ID: 11 finished in 648 ms.
ID: 17 finished in 647 ms.
ID: 12 finished in 647 ms.
ID: 6 finished in 648 ms.
ID: 4 finished in 647 ms.
ID: 14 finished in 646 ms.
Time: 656 ms. Result = 7.500000e+35

c:\Java>"c:\Program Files\Java\jdk1.8.0_201\bin\java.exe" ParallelDemo 20
ID: 19 finished in 623 ms.
ID: 11 finished in 646 ms.
ID: 7 finished in 640 ms.
ID: 3 finished in 640 ms.
ID: 9 finished in 639 ms.
ID: 4 finished in 640 ms.
ID: 2 finished in 639 ms.
ID: 5 finished in 638 ms.
ID: 1 finished in 637 ms.
ID: 16 finished in 636 ms.
ID: 13 finished in 635 ms.
ID: 12 finished in 629 ms.
ID: 10 finished in 627 ms.
ID: 6 finished in 627 ms.
ID: 18 finished in 625 ms.
ID: 14 finished in 626 ms.
ID: 8 finished in 626 ms.
ID: 0 finished in 626 ms.
ID: 15 finished in 625 ms.
ID: 17 finished in 624 ms.
Time: 646 ms. Result = 7.500000e+35

源代码

/**
* 作者:郝老师
* 日期:2019/05/12
* 简介:一个测试类,用于分布式计算对一个数列函数计算及结果合并。
*/
class ParallelDemo extends Thread{
	int id, start, end;   // 线程ID,开始和结束范围
	private boolean done; // 当前计算是否结束
	public double result; // 分场计算的结果

	public ParallelDemo(int id, int start, int end){
		this.id = id;
		this.start = start;
		this.end = end;
        done = false;
	}

    @Override
	public void run(){
		done = false;
		result = 0;
		long t1 = System.currentTimeMillis(); 
		for (int i = start; i < end; i++)
			result += f1(i);
		long t2 = System.currentTimeMillis(); 
		System.out.printf("ID: %2d finished in %02d ms.\n", id, t2 - t1, result);
		done = true;
	}
    
    // 此处以 f(x) = 3X^3 + 2x^2 + 5x - 10 进行模拟。
    // 实际情况中可以改在相应的函数
	public double f1(double x)
	{
		return 3 * x * x * x + 2 * x * x + 5 * x - 10;
	}
    
    /********************* 以下为运行函数 ******************************/
    
    // 参数格式为 [分块数=1] [数据长度=1E9]
	public static void main(String[] args) throws Exception{ 
		int parts = args.length > 0 ? Integer.parseInt(args[0]) : 1;
		int n = args.length > 1 ? Integer.parseInt(args[1]) : 1000 * 1000 * 1000;
	 	int step = n / parts; 
		ParallelDemo[] pds = new ParallelDemo[parts];
	 
		 // 初始化 
		for(int i = 0; i < pds.length; i++){
			int start = i * step;
			int end = i == pds.length - 1 ? n + 1 : (i + 1) * step;
			pds[i] = new ParallelDemo(i, start, end);  
		}
		// 启动线程
   	 	long t1 = System.currentTimeMillis();
		for(int i = 0; i < pds.length; i++)
			pds[i].start();
	    
        // 等待执行结束
        boolean allDone = true;
	 	while(!ParallelDemo.allDone(pds))
            Thread.sleep(1); 
		long t2 = System.currentTimeMillis();
		double finalResult = 0;
        
        // 合并结果
		for(ParallelDemo ParallelDemo: pds)
			finalResult += ParallelDemo.result;

        // 最终输出
		System.out.printf("Time: %d ms. Result = %16.12E\n", t2 - t1, finalResult);
    }

    // 判断所有线程是否执行结果,全部结束返回true,否则fals
    static boolean allDone(ParallelDemo[] pds){
        for(ParallelDemo pd: pds)
            if(!pd.done)
            return false;
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值