Почему неявное расширение не всегда быстрее на GPU? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь вычесть две матрицы «разных» размеров в Matlab на моем GPU.

a = randn(87,1,10,'single','gpuArray');
b = randn(87,100000,1,'single','gpuArray');

dev = gpuDevice;
tic
out1 = a-b;
wait(dev)
toc

tic
a = repmat(a,[1 size(b,2) 1]);
b = repmat(b,[1 1 size(a,3)]);
out2 = a-b;
wait(dev)
toc

Как видите, существует неявное расширение по второму и третьему измерениям. Как правило, неявное расширение намного быстрее, чем репликация матриц. Однако в этом случае это дает результат:

Elapsed time is 0.033324 seconds.
Elapsed time is 0.018052 seconds.

Это вызывает недоумение, потому что репликация матриц намного быстрее, чем просто неявное расширение обрабатывает разницу. Я проверил это на процессоре и получил:

Elapsed time is 0.078726 seconds.
Elapsed time is 0.356435 seconds.

Что именно здесь происходит? Почему неявное расширение намного медленнее?

Я проверил это на пререлизе Matlab 2018b и 2019a и получил этот результат на обоих.

Редактировать: Из-за широкого спроса я использовал функции timeit и gputimeit для обоих, и это только подтвердило мои результаты

clear
close all
a = randn(87,1,10,'single','gpuArray');
b = randn(87,100000,1,'single','gpuArray');

dev = gpuDevice;
disp(gputimeit(@() a-b))

disp(gputimeit(@() a>b))

t1 = gputimeit(@() repmat(a,[1 size(b,2) 1]))+gputimeit(@() repmat(b,[1 1 size(a,3)]));
a = repmat(a,[1 size(b,2) 1]);
b = repmat(b,[1 1 size(a,3)]);

disp(t1+gputimeit(@() a-b))

disp(gputimeit(@() a>b))

clear
close all
a = randn(87,1,10,'single');
b = randn(87,100000,1,'single');

disp(timeit(@() a-b))

disp(timeit(@() a>b))

t1 = timeit(@() repmat(a,[1 size(b,2) 1]))+timeit(@() repmat(b,[1 1 size(a,3)]));
a = repmat(a,[1 size(b,2) 1]);
b = repmat(b,[1 1 size(a,3)]);

disp(t1+timeit(@() a-b))

disp(timeit(@() a>b))

И время:

    0.0249880485773384

    0.0191386963821538

    0.0159509649972431

   0.00518230250048866

    0.0980248506300088

    0.0545817410501994

     0.283484452903233

    0.0540456719899175
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...