У меня большой l oop, который мне нужно много раз вычислять в моем коде, и я подумал, что можно было бы ускорить его с помощью MATLABcoder. Однако версия моего кода в mex-файле (код функции прилагается ниже) оказывается медленнее, чем в m-файле. Я скомпилировал код с помощью компилятора MINGW64.
Я пробовал разные настройки компилятора (играется с coder.config) и другие спецификации памяти, но безуспешно.
function v_d = test_code(q,v_exp,wealth,b_grid_choice,k_grid_choice,nz,nk,nb)
%#codegen
% Inputs
% q is an array of dimension [nz nk nb]
% v_exp is an array of dimension [nz nk nb]
% wealth is an array of dimension [nz nk nb]
% b_grid_choice is an array of dimension [nk nb]
% k_grid_choice is an array of dimension [nk nb]
% Typically, nz/nk/nb is an integer (currently up to 200)
v_d = coder.nullcopy(zeros(nz,nk,nb));
parfor ii = 1:nz
q_ini_ii = reshape(q(ii,:,:),[],nz);
v_ini_exp_ii = reshape(v_exp(ii,:,:),[],nz);
choice = q_ini_ii.*b_grid_choice - k_grid_choice;
for jj = 1:nk
for kk = 1:nb
% dividends at time t
d = wealth(ii,jj,kk) + choice;
% choosing optimal consumption
vec_d = d + v_ini_exp_ii.*(d>0);
v_d(ii,jj,kk) = max(vec_d,[],'all');
end
end
end
Когда я запускаю этот код, когда nz
= nk
= nb
= 100
, m-файл занимает 2,5 с, а сгенерированный мекс-файл - 7,5 с. Я пытался использовать как приложение MATLABcoder, так и команду codegen
codegen -O enable:OpenMP test_code -args {q,v_exp,wealth,b_grid_choice,k_grid_choice,nz,nk,nb}
Я также играл с codegen.config('mex')
, но с небольшим влиянием на производительность.
При тестировании По скорости приведенного выше кода я просто генерирую эти матрицы с помощью команды randn
, а затем передаю их в код. Интересно, что когда я генерирую эти матрицы внутри функции, то это не влияет на скорость m-файла, но ускоряет mex-файл почти в 10 раз (то есть в три раза быстрее, чем m-файл) ! Это говорит мне о том, что есть способ ускорить этот код, но, несмотря на все мои усилия, я не смог понять это. Я думал, что выделение памяти может быть за этим, но мои попытки поиграть с динамическими c спецификациями памяти также не привели к какому-либо увеличению ...