I was trying to compute the time it takes for Eigensystem to evaluate while being inside a ParallelTable, as it is well-known LAPACK subroutine has an inbuilt Parallelization to it. And the difference in time for each individual in my i7 2 core(4 thread) laptop is not exactly doubled for parallelization as I would expect. In fact in some cases even after Parallelization the time taken is shown to be almost the same.
Sample codes below.
t1 = Table[AbsoluteTiming[Eigensystem[RandomComplex[1 + I, {m, m}]];], {m, 500,2000, 100}]
The output is as follows,
{{0.616350, Null}, {1.040216, Null}, {2.443462, Null}, {3.077764, Null}, {3.083748, Null}, {4.769239, Null}, {5.449419, Null}, {7.748267, Null}, {8.550121, Null}, {9.972316, Null}, {12.643169, Null}, {14.768483, Null}, {17.071321, Null}, {19.217578, Null}, {24.610150, Null}, {29.095810, Null}}
Then if I parallelize over two Kernels,
t1 = ParallelTable[{m, AbsoluteTiming[Eigensystem[RandomComplex[1 + I, {m, m}]];]}, {m,500, 2000, 100}]
The outputs
{{500, {1.218461, Null}}, {600, {2.030769, Null}}, {700, {2.952447, Null}}, {800, {3.999031, Null}}, {900, {5.233135, Null}}, {1000, {7.342015, Null}}, {1100, {9.122840, Null}}, {1200, {15.801766, Null}}, {1300, {15.064459, Null}}, {1400, {20.560733, Null}}, {1500, {19.901539, Null}}, {1600, {24.876738, Null}}, {1700, {28.118304, Null}}, {1800, {31.265851, Null}}, {1900, {25.806387, Null}}, {2000, {29.372562, Null}}}
It seems for larger system sizes the time difference is lower than expected.
This is important for me because I need to diagonalize about 20 13k x13k matrix, ignoring the constraint of RAM(which I have about 1TB), the machine is 64 core and since not Parallelizing was taking about 1.5 hrs for each diagonalization, I was wondering if I would parallelize it over 10 cores.
But this should not be efficient yet it seems it is, what is going on?
Edit:- Just to be clear, I expected ParallelTable to increase individual times of diagonalization for each system size since it doesn't have multicore available, while this is true for some system sizes, mostly smaller, for larger it does not seem to affect it much. This is the confusion.
Eigensystem
definitely uses multiple cores. PuttingParallelize
around it, as such, would not be expected to increase performance for large systems, because there just aren't more resources available. You can see performance increases in small scales if multiple small problems end up getting dispatched more efficiently though. $\endgroup$