2015-05-06 1 views
0

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

Код выглядит так:

Atoms(1:nOfAtomsInTwoDim,:)=TwoDimAtoms; 
odd_type=TwoDimAtoms; 
even_type=TwoDimAtoms; 
even_type(:,1)=TwoDimAtoms(:,1)+LatticeSpacing/2; 
even_type(:,2)=TwoDimAtoms(:,2)+LatticeSpacing/2; 
parfor i=2:1:nOflayers+1 
    temp_type=TwoDimAtoms; 
    if mod(i,2) 
     temp_type=odd_type; 
     temp_type(:,3)=TwoDimAtoms(:,3)+(i-1)*LatticeSpacing/2; 
    else 
     temp_type=even_type; 
     temp_type(:,3)=TwoDimAtoms(:,3)+(i-1)*LatticeSpacing/2; 
    end 
    iBegin=(i-1)*nOfAtomsInTwoDim+1; 
    iEnd=i*nOfAtomsInTwoDim; 
    Atoms(iBegin,iEnd,:)=temp_type; 
end 
+0

На последней строке есть опечатка, это проблема? 'Atoms (iBegin, iEnd, :)' должно быть 'Atoms (iBegin: iEnd, :)' (первый ',' должен быть ':') – PetrH

+0

Какая из них ваша глобальная переменная? Трудно понять, какова ваша проблема без кода, который мы можем запустить. – David

+0

PetrH вы правы, я не очень хорошо знаком с Matlab на самом деле ... Но я думаю, что это все еще не работает после того, как я его изменил :( –

ответ

1

Ваш код не является исполняемым, что делает его немного сложно разобраться, что происходит, и, как @PetrH указывает, я полагаю, ваше выражение индексации в конце концов, должен быть Atoms(iBegin:iEnd,:).

Чтобы сделать эту работу в parfor, вам нужно организовать Atoms быть sliced (транслируют переменными являются входами parfor петли, которые являются постоянными и одинаковыми для каждой итерации). Другими словами, ваше выражение индексации должно быть что-то больше похоже на

parfor i = ... 
    ... 
    Atoms(i, :) = ...; 
end 

Сказав все это, если это весь ваш parfor цикл, я бы вместо того, чтобы сосредоточиться на vectorising вещи, а не применяя parfor. Похоже, что объем работы внутри цикла parfor довольно мал, и вряд ли это принесет вам большую пользу, тогда как я предполагаю, что векторизация должна дать вам гораздо лучшее ускорение.

+0

Thanks Edric Я ошибаюсь в отношении Atoms (iBegin: iEnd, :), как вы сказали, если Atoms является широковещательной переменной, тогда мне не разрешено присваивать ей значение в parfor правильно? Если я действительно хочу присвоить значение глобальной переменной что я должен делать? И вы можете объяснить, каким образом я могу использовать вектор для ускорения? –

+0

Прошу прощения * vectorisation. –

 Смежные вопросы

  • Нет связанных вопросов^_^