Parfor Execution time variation

Hi,
I am using parfor for reading 600 .raw files.
c=zeros(1536,1536,600,'uint16');
parpool('threads',4);
parfor i=1:600
fileName=[folder,'/',fileList(i).name];
a=fopen(fileName,'r');
Z=fread(a,[1536 1536],'uint16');
fclose(a);
c(:,:,i)=Z;
end
However, I am observing significant variability in the execution time, which ranges from 14 seconds to 110 seconds across different runs.
Why is this discrepancy occurring? Is there a way to achieve more consistent execution times?

4 Commenti

Can I ask for a little more information for clarification:
  1. Are you timing the entire parfor block? e.g. tic, parfor ... end, toc
  2. What is the spread of timings? Is it usually 14 seconds, and occasionally up to 110 seconds?
  3. Machine information (operating system), and MATLAB Release.
Hi Christopher,
  1. Yes, I am timining the entire parfor block tic, parfor.....end, toc
  2. The timing is completely random ranging between 14 sec and 110 sec.
  3. I am using R2023a Matlab version on 64 bit operating system, Windows 10, Inter Xeon 32 GB RAM, NVIDIA GeForce RTX 3060 Ti GPU.
Do you observe the same variability when running with a standard for-loop, or a process-based pool parpool("Processes",4) ?
Also, are you reading from your local hard drive or a network location?
Anshika Goel
Anshika Goel il 13 Giu 2024
Modificato: Anshika Goel il 13 Giu 2024
In the standard for loop, I am not getting any variability it is taking 35-40 sec.
Whereas, in a process based pool, the variability is less (55-63 sec), but it is taking more time than the standard for loop.
And I am reading from a local hard drive,not from network location.
Is there any other solution, where I can reduce this execution time to less than 15 sec.

Accedi per commentare.

 Risposta accettata

I also have an Intel Xeon processor (4 cores) with 16GB RAM. I executed your code after generating 600 files as follows:
matrix = uint16(ones(1536));
folder = 'nums';
for i=1:600
fid = fopen([folder '/' num2str(i)], 'w');
mat = matrix .* i;
fwrite(fid, mat, 'uint16');
fclose(fid);
end
In my tests, the variability in execution time was not as significant as you mentioned; it ranged from 189 seconds to 200 seconds. the main bottleneck is likely due to file I/O operations.
To optimize execution time, consider performing file reads asynchronously. I developed the following code using parfeval to read 600 files asynchronously:
c = zeros(1536, 1536, 600, 'uint16');
folder = "nums";
pool = gcp('nocreate');
if isempty(pool)
pool = parpool('threads');
end
futures = parallel.FevalFuture.empty(600, 0);
for i = 1:600
fileName = fullfile(folder, num2str(i));
futures(i) = parfeval(@readFile, 1, fileName);
end
for i = 1:600
c(:, :, i) = fetchOutputs(futures(i));
end
function Z = readFile(fileName)
a = fopen(fileName, 'r');
Z = fread(a, [1536 1536], 'uint16');
fclose(a);
end
In my tests, this approach reduced the execution time to between 14-16 seconds.
You can learn more about “parfeval” from here:
I hope this helps.

Più risposte (0)

Categorie

Scopri di più su Loops and Conditional Statements in Centro assistenza e File Exchange

Prodotti

Release

R2023a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by