Ускорение mex файлов в Matlab - PullRequest
       3

Ускорение mex файлов в Matlab

1 голос
/ 13 апреля 2020

У меня большой 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 спецификациями памяти также не привели к какому-либо увеличению ...

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