Нижеприведенный код выполняет операцию с той же операцией на gpuArrays a
и b
двумя разными способами. Первая часть вычисляет (a'*(a*b)')'
, а вторая часть вычисляет a*b*a
. Затем результаты проверяются одинаковыми.
%function test
clear
rng('default');rng(1);
a=sprand(3000,3000,0.1);
b=rand(3000,3000);
a=gpuArray(a);
b=gpuArray(b);
tic;
c1=gather(transpose(transpose(a)*transpose(a*b)));
disp(['time for (a''*(a*b)'')'': ' , num2str(toc),'s'])
clearvars -except c1
rng('default');
rng(1)
a=sprand(3000,3000,0.1);
b=rand(3000,3000);
a=gpuArray(a);
b=gpuArray(b);
tic;
c2=gather(a*b*a);
disp(['time for a*b*a: ' , num2str(toc),'s'])
disp(['error = ',num2str(max(max(abs(c1-c2))))])
%end
Однако вычисления (a'*(a*b)')'
примерно в 4 раза быстрее, чем вычисление a*b*a
. Вот результат приведенного выше сценария в R2018a на Nvidia K20 (я пробовал разные версии и разные графические процессоры с аналогичным поведением).
>> test
time for (a'*(a*b)')': 0.43234s
time for a*b*a: 1.7175s
error = 2.0009e-11
Еще более странно, если первая и последняя строки вышеупомянутого скрипта раскоментированы (чтобы превратить его в функцию), то оба они занимают более длительное время (~ 1,7 с вместо ~ 0,4 с). Ниже приведен вывод для этого случая:
>> test
time for (a'*(a*b)')': 1.717s
time for a*b*a: 1.7153s
error = 1.0914e-11
Я хотел бы знать, что вызывает это поведение, и как выполнить a*b*a
или (a'*(a*b)')'
или оба за более короткий промежуток времени (т.е. ~ 0,4 с, а не ~ 1.7s) внутри функции matlab, а не внутри скрипта.