Если не векторизовать matlab?

Запустите свою программу с-Dlog4j.debug так, чтобы стандарт получил информацию о том, как log4j настроен - я подозревал, что это не настроено способ, которым Вы думаете, что это.

6
задан Donnie 22 November 2009 в 01:13
поделиться

3 ответа

Векторизация в Matlab часто означает выделение намного большего объема памяти (создание гораздо большего массива, чтобы избежать цикла, например, с помощью трюка Тони ). Благодаря улучшенной JIT-компиляции циклов в последних версиях - вполне возможно, что выделение памяти, необходимое для вашего векторизованного решения, означает отсутствие преимущества, но, не видя кода, трудно сказать. В Matlab есть отличный построчный профилировщик, который поможет вам увидеть, какие именно части векторизованной версии требуют времени.

10
ответ дан 8 December 2019 в 05:55
поделиться

Пробовали ли вы построить график времени выполнения как функцию размера проблемы (либо количество элементов на вектор [в настоящее время 784], либо количество векторов [в настоящее время 10 000])? Я столкнулся с подобной аномалией при векторизации алгоритма ортогонализации Грама-Шмидта; Оказалось, что векторизованная версия была быстрее, пока проблема не выросла до определенного размера, после чего итеративная версия действительно работала быстрее, как видно на этом графике: Execution time comparison between vectorized and unvectorized implementations of the Gram-Schmidt orthogonalization algorithm

Вот две реализации и сценарий тестирования:

clgs.m

function [Q,R] = clgs(A)
% QR factorization by unvectorized classical Gram-Schmidt orthogonalization

[m,n] = size(A);

R = zeros(n,n);     % pre-allocate upper-triangular matrix

% iterate over columns
for j = 1:n
    v = A(:,j);

    % iterate over remaining columns
    for i = 1:j-1
        R(i,j) = A(:,i)' * A(:,j);
        v = v - R(i,j) * A(:,i);
    end

    R(j,j) = norm(v);
    A(:,j) = v / norm(v);   % normalize
end
Q = A;

clgs2.m

function [Q,R] = clgs2(A)
% QR factorization by classical Gram-Schmidt orthogonalization with a
% vectorized inner loop

[m,n] = size(A);
R = zeros(n,n);     % pre-allocate upper-triangular matrix

for k=1:n
    R(1:k-1,k) = A(:,1:k-1)' * A(:,k);
    A(:,k) = A(:,k) - A(:,1:k-1) * R(1:k-1,k);
    R(k,k) = norm(A(:,k));
    A(:,k) = A(:,k) / R(k,k);
end

Q = A;

benchgs.m

n = [300,350,400,450,500];

clgs_time=zeros(length(n),1);
clgs2_time=clgs_time;

for i = 1:length(n)
    A = rand(n(i));
    tic;
    [Q,R] = clgs(A);
    clgs_time(i) = toc;

    tic;
    [Q,R] = clgs2(A);
    clgs2_time(i) = toc;
end

semilogy(n,clgs_time,'b',n,clgs2_time,'r')
xlabel 'n', ylabel 'Time [seconds]'
legend('unvectorized CGS','vectorized CGS')
9
ответ дан 8 December 2019 в 05:55
поделиться

Чтобы ответить на вопрос «Когда не векторизовать код MATLAB» в более общем виде:

Не векторизуйте код, если векторизация не прямолинейна и делает код очень трудным для чтения. Это сделано при предположении, что

  1. Другие люди, кроме вас, возможно, должны прочитать и понять это.
  2. Невекторизованный код достаточно быстр для того, что вам нужно.
2
ответ дан 8 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: