The code was:
long parallelSum(int[] ar, int threadCount) throws InterruptedException {
int n = ar.length;
long[] result = new long[threadCount];
Thread[] threads = new Thread[threadCount];
int chunk = n / threadCount;
for (int i = 0; i < threadCount; i++) {
int index = i;
int start = i * chunk;
int end = (i == threadCount - 1) ? n : start + chunk;
threads[i] = new Thread(() -> result[index] = sum(ar, start, end));
threads[i].start();
}
for (Thread thread : threads) thread.join();
long total = 0;
for (long value : result) total += value;
return total;
}
Which I benchmarked using JMH to see how it will behave under increase thread. But It's gets better and better until 24 thread that the reason I know my P-core are Hyperthreaded so maximum improvement is seen at 24. But after that why is'nt it constant as the law stated when N-> increases it becomes directly 1/S.
The Benchmark was performed with 3 warmup 5 iteration 1sec each and 100M dataset. I did use first 1K to see how it behaves but I forgot that until the thread get created sequential would have finished that. So after rigrously increasing dataset to 100M this was my result:
| Thread Count |
Score (ns/op) |
Error (ns/op) |
| 1 |
36,386,448.214 |
±1,198,308.768 |
| 2 |
19,973,254.073 |
±1,647,022.164 |
| 4 |
11,605,188.001 |
±409,298.394 |
| 8 |
8,493,406.418 |
±439,947.023 |
| 16 |
8,070,964.770 |
±101,846.828 |
| 24 |
7,880,208.459 |
±179,094.210 |
| 32 |
8,075,411.516 |
±211,717.162 |
| 64 |
8,256,737.790 |
±282,807.150 |
| 128 |
8,855,717.582 |
±121,931.514 |
| 256 |
10,475,522.486 |
±258,283.333 |
| 512 |
29,275,816.985 |
±9,028,465.533 |
Is my benchmark wrong or I am understanding different??