Auf meinem PC funktioniert es so geschehen. f ist ein Faktor zum Anhalten. Wenn ich es auf 0 setze, bekomme ich 100% Last, wenn es auf 0,25 gesetzt wird, bekomme ich 90% Last. So 0.5 50%
es ist nicht lineair, aber es gibt Steuer
A=rand(1000);
f=0.25;
for ct = 1:1000
tic
hess(A);
pause(toc*f)
end
Sie können natürlich mit ctrl-c
der Schleife ausbrechen.
Sie könnten auch direkt die CPU-Auslastung des Prozesses auslesen und diese als Feedback für die Zeit zum Pausieren verwenden, aber das könnte unnötig kompliziert für das sein, was Sie tun möchten.
CPUs=double(System.Environment.ProcessorCount);
P = System.Diagnostics.PerformanceCounter('Process', '% Processor Time', 'MATLAB'); %perforamce counter
A=rand(1000);N=1000;
p_goal = 50; %desired CPU usage in percentage
f=1;
p=nan([1,N]);
for ct = 1:N
tic
hess(A);
if f>0
p(ct)=P.NextValue/CPUs; %percentage of CPU used by matlab
if p(ct)<p_goal,f=f-0.01;end
if p(ct)>p_goal,f=f+0.01;end
pause(toc*f)
plot(p);ylabel('cpu usage');title(sprintf('f=%.2f',f));drawnow;
end
end
Funktioniert das nicht nur ein einzelner Kern? – Brick
Nein, es funktioniert auf allen Kernen auf meinem i5 Matlab 2017a. Die Berechnung des Hessischen ist bereits parallelisiert. – Gelliant