Я изменил интеграцию списка в список интеграций, чтобы можно было использовать ParallelTable
:
X1par=ParallelTable[Integrate[i, {x, -1, 1}], {i, Nw.Transpose[Nw]}];
X1par==X1
(* ===> True *)
Y1par = ParallelTable[Integrate[i,{x,-1,1}],{i,D[Nw,{x,2}].Transpose[D[Nw,{x,2}]]}]
Y1 == Y1par
(* ===> True *)
В моих таймингах с {j, 5, 30, 1}
вместо {j, 5, 200, 1}
для ограничения используемого времени это примерно в 3,4 раза быстрее на моем четырехъядерном процессоре. Но это можно сделать еще быстрее, если:
X2par = Parallelize[Integrate[#, {x, -1, 1}] & /@ (Nw.Transpose[Nw])]
X2par == X1par == X1
(* ===> True *)
Это примерно в 6,8 раза быстрее, в 2,3 раза больше из-за Parallelize
.
Timing
и AbsoluteTiming
не очень заслуживают доверия, когда речь идет о параллельном выполнении. Я использовал AbsoluteTime
до и после каждой строки и взял разницу.
ИЗМЕНИТЬ
Мы не должны забывать ParallelMap:
На самом грубом уровне списка (1):
ParallelMap[Integrate[#, {x, -1, 1}] &, Nw.Transpose[Nw], {1}]
На самом глубоком уровне списка (наиболее тонкое распараллеливание):
ParallelMap[Integrate[#, {x, -1, 1}] &, Nw.Transpose[Nw], {2}]
person
Sjoerd C. de Vries
schedule
05.11.2011