2016-12-06 8 views
0

У меня есть код, требующий много времени, так как он содержит несколько циклов for. Независимо от того, можно ли оптимизировать код с помощью векторизации, это еще одна тема. Проблема в том, что, поскольку для завершения требуется много времени (часов), я решил проверить загрузку процессора при запуске кода. К моему удивлению, я обнаружил, что он колеблется от 0 до 3%!Как повысить эффективность использования ЦП при запуске кода MATLAB с помощью циклов?

enter image description here

Почему процессор не использует по крайней мере, на 25%, так как мой процессор четырехъядерный (и я думаю, что каждое ядро ​​обрабатывает 1 поток в то время, не так ли?), По умолчанию, когда его ничего не делает? Как увеличить загрузку процессора при запуске кода, чтобы он выполнялся быстрее?

В случае необходимость, вот код (функция xyz на скриншоте) Я бег:

users(:,1)=unique(M(:,10)); 
categories(:,1)=unique(M(:,2)); 
N=size(users,1); 
for i=1:N 
    U=M(M(:,10)==users(i,1),:); 
    C(:,1)=unique(U(:,2)); 
    [~,~,subs] = unique(U(:,2)); 
    vals = U(:,9); 
    C(:,2) = accumarray(subs(:), vals(:), [], @(x) 1-mean(x)); 
    for j=1:size(categories,1) 
     for k=1:size(C,1) 
      if categories(j,1)==C(k,1) 
       categories(j,i)=C(k,2); 
      end 
     end 
    end 
    clear C; 
end 
+0

Возможно, из-за конфигурации вашей системы/ОС он не может использовать более 4 ГБ памяти и разгрузить свою задачу на жестком диске. – rahnema1

+0

Мой чисто умозрительный ответ заключается в том, что он использует 100% одного процессора для фактического расчета, но что использование _per second_ (фактически, я считаю, что график показывает загрузку процессора за 6 секунд) намного ниже, потому что ваш расчет выполняется в неоптимизированной тройной вложенной петле, и поэтому между каждым отдельным вычислением существует много времени простоя. – craigim

ответ

0

По программам MatLab по умолчанию является однопоточным, если вы хотите использовать большее количество потоков, которые можно использовать a parfor loop https://www.mathworks.com/help/distcomp/parfor.html (при условии, что у вас есть Parallel Toolbox). С быстрым взглядом ваш код выглядит параллелизуемым на любом из ваших циклов, но его немного сбалансировать, чтобы выбрать лучший выбор; он сильно зависит от количества итераций, которые каждый цикл будет иметь во время выполнения.

+0

Вы должны добавить здесь, что это доступно, только если у вас есть Parallel Toolbox. – craigim

+0

справедливая точка Я принял это как должное – Danny