前言
本文以一个简单的求和问题,展示如何通过并行计算使用分治法求解。
问题
求    ∑ 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=1∑109f(n),其中f(n)=3n3+2n2+5n−10.
分析
由于每次调用
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=1∑109f(n)=n=1∑5.0×108f(n)+n=5.0×108+1∑109f(n)
由于两段的求值是完全独立的,所以我们可以利用多核CPU进行计算,然后等两段计算都完成后,再将计算的结果合并。以上是以两段为例,我们可以分成n段,这样可以充分利用多核CPU的处理能力。同时,根据一般常识,当由于达到CPU的最大核心后,再增加线程已经不会减少运算时间(双13线程时在MBP上的测试),所以以下测试时最多线程数只取和CPU最大线程相同。
机器列表
名称 | 类型 | CPU | 核心与线程 | 内存容量与类型 | SSD |
---|---|---|---|---|---|
PC1 | 桌面 | i5 9600K @ 3.60GHz | 6核6线程 | 32G DDR4 | 512GB NVME |
Honor2018 | 笔记本 | i7 8550U @ 1.80GHz | 4核8线程 | 8GB, DDR4 | 256 SSD |
MBP 2018 | 笔记本 | i7-8750H @ 2.20GHz | 6核12线程 | 32 GB, DDR4 2400 | 512 SSD |
Server1 | 服务器 | i7 3930K @ 3.20GHz | 6核12线程 | 64GB, DDR3 1600 | 512 SSD |
Server2 | 服务器 | 双Xeon E5 2600v2 @ 3.10GHz | 20核40线程 | 128GB, DD3 | 512 SSD |
测试结果
以下结果最多6核心计算的运行结果(单位:ms)。
线程数 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
PC1 (6C6T) | 5436 | 2751 | 1843 | 1407 | 1134 | 962 |
Honor2018 (4C8T) | 7653 | 4063 | 2979 | 2170 | 1925 | 1663 |
MBP (6C12T) | 5949 | 2994 | 2001 | 1509 | 1211 | 1016 |
Server1 (6C12T) | 7399 | 3764 | 2476 | 1751 | 1414 | 1194 |
Server2 (20C40T) | 10571 | 5309 | 3545 | 2671 | 2157 | 1814 |
以下为使用超过6线程计算的运行结果(单位:ms)
线程数 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
MBP (6C12T) | 877 | 775 | 695 | 628 | 581 | 542 | 542 | - | - | - | - | - | - | - |
Server1 (6C12T) | 1029 | 913 | 826 | 802 | 784 | 791 | - | - | - | - | - | - | - | - |
Server2 (20C40T) | 1555 | 1274 | 1140 | 1051 | 964 | 897 | 844 | 807 | 774 | 731 | 710 | 681 | 656 | 646 |
一些结论
- 通过增加核心数,能够有效减少运行时间。
- 物理核心比超线程能够更加有效地减少时间。
- 一般有超线程的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;
}
}