Why is arrayfun for GPU slower than normal operations
Show older comments
Hi there,
Here goes a piece of testing code, yet arrayfun runs more slowly. Any thoughts? Many thanks.
function Test_GPU1()
EP = gpuArray(eps*ones(10000, 1, 'single'));
ONE = gpuArray(ones(10000, 1, 'single'));
ZERO = gpuArray(zeros(10000, 1, 'single'));
Cur_FF_Output = gpuArray(0.5*ones(10000, 1, 'single'));
Cur_Desired_Output = gpuArray(0.5*ones(10000, 1, 'single'));
for iter = 1:1000
% In output layer, Cur_Delta = Del(C)/Del(z) = Del(C)/Del(a) * Del(a)/Del(z)
% [~, Cur_Delta0] = Cost_Function_GPU(Cur_FF_Output, Cur_Desired_Output, Hyper_Para);
temp00 = Cur_FF_Output + eps;
temp11 = log(temp00);
temp22 = log(1-Cur_FF_Output+eps);
temp33 = Cur_Desired_Output.*temp11;
temp44 = 1-Cur_FF_Output.*temp22;
Cur_Delta = Cur_FF_Output-Cur_Desired_Output;
Cost = 0-sum(temp33+temp44);
temp00 = arrayfun(@plus, Cur_FF_Output, EP);
temp11 = arrayfun(@log, temp00);
temp22 = arrayfun(@log, arrayfun(@minus, ONE, arrayfun(@plus, Cur_FF_Output, EP)));
temp33 = arrayfun(@times, Cur_Desired_Output, temp11);
temp44 = arrayfun(@minus, ONE, arrayfun(@times, Cur_FF_Output, temp22));
Cur_Delta = arrayfun(@minus, Cur_FF_Output, Cur_Desired_Output);
Cost = arrayfun(@minus, ZERO, sum(temp33+temp44));
end
end

1 Comment
Jan
on 28 May 2019
Of course arrayfun has a certain overhead. It is expected to run slower than calling the operators directly.
Accepted Answer
More Answers (1)
Of course arrayfun has a certain overhead. It is expected to run slower than calling the operators directly with arrays as inputs. In addition, in
Cur_FF_Output + eps
the second operand is a scalar, while in
arrayfun(@plus, Cur_FF_Output, EP)
Matlab has to process a vector. Addressing the elements of an array needs to access memory using a loop. Accessing a scalar is much cheaper.
What is the purpose of:
arrayfun(@minus, ZERO, sum(temp33+temp44))
? This is faster:
-sum(temp33+temp44)
4 Comments
Theron FARRELL
on 29 May 2019
Joss Knight
on 29 May 2019
If that is true, it is a bug. Are you sure that sum(temp33+temp44) is a gpuArray? What happens if you use gpuArray(0) instead?
Theron FARRELL
on 30 May 2019
Jan
on 31 May 2019
Even arrayfun(@minus, 0, sum(temp33+temp44)) is too complicated compared to
-sum(temp33+temp44)
Categories
Find more on GPU Computing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!