Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 8d6415b

Browse filesBrowse files
committed
aply patches lesson 2
1 parent 66dbb57 commit 8d6415b
Copy full SHA for 8d6415b
Expand file treeCollapse file tree

25 files changed

+1526
-24
lines changed
Open diff view settings
Collapse file

‎pom.xml‎

Copy file name to clipboardExpand all lines: pom.xml
+66-1Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,81 @@
2424
<plugin>
2525
<groupId>org.apache.maven.plugins</groupId>
2626
<artifactId>maven-compiler-plugin</artifactId>
27-
<version>3.1</version>
27+
<version>3.7.0</version>
2828
<configuration>
2929
<source>${java.version}</source>
3030
<target>${java.version}</target>
3131
</configuration>
3232
</plugin>
33+
<plugin>
34+
<groupId>org.apache.maven.plugins</groupId>
35+
<artifactId>maven-surefire-plugin</artifactId>
36+
<version>2.20.1</version>
37+
<configuration>
38+
<argLine>-Dfile.encoding=UTF-8</argLine>
39+
</configuration>
40+
</plugin>
41+
<plugin>
42+
<groupId>org.apache.maven.plugins</groupId>
43+
<artifactId>maven-shade-plugin</artifactId>
44+
<version>3.1.0</version>
45+
<executions>
46+
<execution>
47+
<phase>package</phase>
48+
<goals>
49+
<goal>shade</goal>
50+
</goals>
51+
<configuration>
52+
<finalName>benchmarks</finalName>
53+
<transformers>
54+
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
55+
<mainClass>org.openjdk.jmh.Main</mainClass>
56+
</transformer>
57+
</transformers>
58+
<filters>
59+
<filter>
60+
<!--
61+
Shading signed JARs will fail without this.
62+
http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar
63+
-->
64+
<artifact>*:*</artifact>
65+
<excludes>
66+
<exclude>META-INF/*.SF</exclude>
67+
<exclude>META-INF/*.DSA</exclude>
68+
<exclude>META-INF/*.RSA</exclude>
69+
</excludes>
70+
</filter>
71+
</filters>
72+
</configuration>
73+
</execution>
74+
</executions>
75+
</plugin>
3376
</plugins>
3477
</build>
3578

3679
<dependencies>
80+
<dependency>
81+
<groupId>org.openjdk.jmh</groupId>
82+
<artifactId>jmh-core</artifactId>
83+
<version>RELEASE</version>
84+
</dependency>
85+
<dependency>
86+
<groupId>org.openjdk.jmh</groupId>
87+
<artifactId>jmh-generator-annprocess</artifactId>
88+
<version>RELEASE</version>
89+
<scope>provided</scope>
90+
</dependency>
91+
<dependency>
92+
<groupId>com.google.guava</groupId>
93+
<artifactId>guava</artifactId>
94+
<version>21.0</version>
95+
</dependency>
96+
<dependency>
97+
<groupId>junit</groupId>
98+
<artifactId>junit</artifactId>
99+
<version>4.12</version>
100+
<scope>test</scope>
101+
</dependency>
37102
</dependencies>
38103

39104
<profiles>
Collapse file

‎src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java‎

Copy file name to clipboardExpand all lines: src/main/java/ru/javaops/masterjava/matrix/MainMatrix.java
+2-6Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@
44
import java.util.concurrent.ExecutorService;
55
import java.util.concurrent.Executors;
66

7-
/**
8-
* gkislin
9-
* 03.07.2016
10-
*/
117
public class MainMatrix {
128
private static final int MATRIX_SIZE = 1000;
139
private static final int THREAD_NUMBER = 10;
@@ -24,13 +20,13 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc
2420
while (count < 6) {
2521
System.out.println("Pass " + count);
2622
long start = System.currentTimeMillis();
27-
final int[][] matrixC = MatrixUtil.singleThreadMultiply(matrixA, matrixB);
23+
final int[][] matrixC = MatrixUtil.singleThreadMultiplyOpt(matrixA, matrixB);
2824
double duration = (System.currentTimeMillis() - start) / 1000.;
2925
out("Single thread time, sec: %.3f", duration);
3026
singleThreadSum += duration;
3127

3228
start = System.currentTimeMillis();
33-
final int[][] concurrentMatrixC = MatrixUtil.concurrentMultiply(matrixA, matrixB, executor);
29+
final int[][] concurrentMatrixC = MatrixUtil.concurrentMultiplyStreams(matrixA, matrixB, Runtime.getRuntime().availableProcessors() - 1);
3430
duration = (System.currentTimeMillis() - start) / 1000.;
3531
out("Concurrent thread time, sec: %.3f", duration);
3632
concurrentThreadSum += duration;
Collapse file
+85Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package ru.javaops.masterjava.matrix;
2+
3+
import org.openjdk.jmh.annotations.*;
4+
import org.openjdk.jmh.runner.Runner;
5+
import org.openjdk.jmh.runner.RunnerException;
6+
import org.openjdk.jmh.runner.options.Options;
7+
import org.openjdk.jmh.runner.options.OptionsBuilder;
8+
import org.openjdk.jmh.runner.options.TimeValue;
9+
10+
import java.util.concurrent.ExecutorService;
11+
import java.util.concurrent.Executors;
12+
import java.util.concurrent.TimeUnit;
13+
14+
@Warmup(iterations = 10)
15+
@Measurement(iterations = 10)
16+
@BenchmarkMode({Mode.SingleShotTime})
17+
@OutputTimeUnit(TimeUnit.MILLISECONDS)
18+
@State(Scope.Benchmark)
19+
@Threads(1)
20+
@Fork(10)
21+
@Timeout(time = 5, timeUnit = TimeUnit.MINUTES)
22+
public class MatrixBenchmark {
23+
24+
// Matrix size
25+
private static final int MATRIX_SIZE = 1000;
26+
27+
@Param({"3", "4", "10"})
28+
private int threadNumber;
29+
30+
private static int[][] matrixA;
31+
private static int[][] matrixB;
32+
33+
@Setup
34+
public void setUp() {
35+
matrixA = MatrixUtil.create(MATRIX_SIZE);
36+
matrixB = MatrixUtil.create(MATRIX_SIZE);
37+
}
38+
39+
private ExecutorService executor;
40+
41+
public static void main(String[] args) throws RunnerException {
42+
Options options = new OptionsBuilder()
43+
.include(MatrixBenchmark.class.getSimpleName())
44+
.threads(1)
45+
.forks(10)
46+
.timeout(TimeValue.minutes(5))
47+
.build();
48+
new Runner(options).run();
49+
}
50+
51+
// @Benchmark
52+
public int[][] singleThreadMultiplyOpt() throws Exception {
53+
return MatrixUtil.singleThreadMultiplyOpt(matrixA, matrixB);
54+
}
55+
56+
// @Benchmark
57+
public int[][] singleThreadMultiplyOpt2() throws Exception {
58+
return MatrixUtil.singleThreadMultiplyOpt(matrixA, matrixB);
59+
}
60+
61+
@Benchmark
62+
public int[][] concurrentMultiplyStreams() throws Exception {
63+
return MatrixUtil.concurrentMultiplyStreams(matrixA, matrixB, threadNumber);
64+
}
65+
66+
// @Benchmark
67+
public int[][] concurrentMultiply() throws Exception {
68+
return MatrixUtil.concurrentMultiply(matrixA, matrixB, executor);
69+
}
70+
71+
@Benchmark
72+
public int[][] concurrentMultiply2() throws Exception {
73+
return MatrixUtil.concurrentMultiply2(matrixA, matrixB, executor);
74+
}
75+
76+
@Setup
77+
public void setup() {
78+
executor = Executors.newFixedThreadPool(threadNumber);
79+
}
80+
81+
@TearDown
82+
public void tearDown() {
83+
executor.shutdown();
84+
}
85+
}
Collapse file

‎src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java‎

Copy file name to clipboardExpand all lines: src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java
+110-14Lines changed: 110 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,131 @@
11
package ru.javaops.masterjava.matrix;
22

3+
import java.util.ArrayList;
4+
import java.util.List;
35
import java.util.Random;
4-
import java.util.concurrent.ExecutionException;
5-
import java.util.concurrent.ExecutorService;
6+
import java.util.concurrent.*;
7+
import java.util.stream.IntStream;
68

7-
/**
8-
* gkislin
9-
* 03.07.2016
10-
*/
119
public class MatrixUtil {
1210

13-
// TODO implement parallel multiplication matrixA*matrixB
14-
public static int[][] concurrentMultiply(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException {
11+
public static int[][] concurrentMultiplyStreams(int[][] matrixA, int[][] matrixB, int threadNumber)
12+
throws InterruptedException, ExecutionException {
13+
1514
final int matrixSize = matrixA.length;
1615
final int[][] matrixC = new int[matrixSize][matrixSize];
1716

17+
new ForkJoinPool(threadNumber).submit(
18+
() -> IntStream.range(0, matrixSize)
19+
.parallel()
20+
.forEach(row -> {
21+
final int[] rowA = matrixA[row];
22+
final int[] rowC = matrixC[row];
23+
24+
for (int idx = 0; idx < matrixSize; idx++) {
25+
final int elA = rowA[idx];
26+
final int[] rowB = matrixB[idx];
27+
for (int col = 0; col < matrixSize; col++) {
28+
rowC[col] += elA * rowB[col];
29+
}
30+
}
31+
})).get();
32+
1833
return matrixC;
1934
}
2035

21-
// TODO optimize by https://habrahabr.ru/post/114797/
22-
public static int[][] singleThreadMultiply(int[][] matrixA, int[][] matrixB) {
36+
public static int[][] concurrentMultiply(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException, ExecutionException {
2337
final int matrixSize = matrixA.length;
24-
final int[][] matrixC = new int[matrixSize][matrixSize];
38+
final int[][] matrixC = new int[matrixSize][];
2539

40+
final int[][] matrixBT = new int[matrixSize][matrixSize];
2641
for (int i = 0; i < matrixSize; i++) {
2742
for (int j = 0; j < matrixSize; j++) {
43+
matrixBT[i][j] = matrixB[j][i];
44+
}
45+
}
46+
47+
List<Callable<Void>> tasks = new ArrayList<>(matrixSize);
48+
for (int j = 0; j < matrixSize; j++) {
49+
final int row = j;
50+
tasks.add(() -> {
51+
final int[] rowC = new int[matrixSize];
52+
for (int col = 0; col < matrixSize; col++) {
53+
final int[] rowA = matrixA[row];
54+
final int[] columnB = matrixBT[col];
55+
int sum = 0;
56+
for (int k = 0; k < matrixSize; k++) {
57+
sum += rowA[k] * columnB[k];
58+
}
59+
rowC[col] = sum;
60+
}
61+
matrixC[row] = rowC;
62+
return null;
63+
});
64+
}
65+
executor.invokeAll(tasks);
66+
return matrixC;
67+
}
68+
69+
public static int[][] concurrentMultiply2(int[][] matrixA, int[][] matrixB, ExecutorService executor) throws InterruptedException {
70+
final int matrixSize = matrixA.length;
71+
final int[][] matrixC = new int[matrixSize][matrixSize];
72+
final CountDownLatch latch = new CountDownLatch(matrixSize);
73+
74+
for (int row = 0; row < matrixSize; row++) {
75+
final int[] rowA = matrixA[row];
76+
final int[] rowC = matrixC[row];
77+
78+
executor.submit(() -> {
79+
for (int idx = 0; idx < matrixSize; idx++) {
80+
final int elA = rowA[idx];
81+
final int[] rowB = matrixB[idx];
82+
for (int col = 0; col < matrixSize; col++) {
83+
rowC[col] += elA * rowB[col];
84+
}
85+
}
86+
latch.countDown();
87+
});
88+
}
89+
latch.await();
90+
return matrixC;
91+
}
92+
93+
public static int[][] singleThreadMultiplyOpt(int[][] matrixA, int[][] matrixB) {
94+
final int matrixSize = matrixA.length;
95+
final int[][] matrixC = new int[matrixSize][matrixSize];
96+
97+
for (int col = 0; col < matrixSize; col++) {
98+
final int[] columnB = new int[matrixSize];
99+
for (int k = 0; k < matrixSize; k++) {
100+
columnB[k] = matrixB[k][col];
101+
}
102+
103+
for (int row = 0; row < matrixSize; row++) {
28104
int sum = 0;
105+
final int[] rowA = matrixA[row];
29106
for (int k = 0; k < matrixSize; k++) {
30-
sum += matrixA[i][k] * matrixB[k][j];
107+
sum += rowA[k] * columnB[k];
108+
}
109+
matrixC[row][col] = sum;
110+
}
111+
}
112+
return matrixC;
113+
}
114+
115+
public static int[][] singleThreadMultiplyOpt2(int[][] matrixA, int[][] matrixB) {
116+
final int matrixSize = matrixA.length;
117+
final int[][] matrixC = new int[matrixSize][matrixSize];
118+
119+
for (int row = 0; row < matrixSize; row++) {
120+
final int[] rowA = matrixA[row];
121+
final int[] rowC = matrixC[row];
122+
123+
for (int idx = 0; idx < matrixSize; idx++) {
124+
final int elA = rowA[idx];
125+
final int[] rowB = matrixB[idx];
126+
for (int col = 0; col < matrixSize; col++) {
127+
rowC[col] += elA * rowB[col];
31128
}
32-
matrixC[i][j] = sum;
33129
}
34130
}
35131
return matrixC;
@@ -58,4 +154,4 @@ public static boolean compare(int[][] matrixA, int[][] matrixB) {
58154
}
59155
return true;
60156
}
61-
}
157+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.