2015-12-06 4 views
0

У меня есть файл функций, который имитирует матрицу A (размер 100 * 100) для 1000 шагов времени и генерирует конечный результат как A_t1000 (матрица размером 100 * 100).parfor multi core processing matlab

E.g. если A = 100 * 100 при t0, то A_t1 = 100 * 100; A_t2 = 100 * 100; ...... .. A_t1000 = 100 * 100 матрица. Каждый с разными значениями. Поэтому я могу иметь несколько фрагментов A от A_t1 до A_t1000.

Мой файл сценария выполняет итерацию этого процесса на 100 итераций. Файл сценария вызывает эту функцию и генерирует конечную матрицу вывода B_t1000 = A_t1000 * 100. B_t1000 является окончательной матрицей вывода, которая содержит 100 As. Размеры B_t1000 100 * 100 * 100. Начальные входные параметры для файла функций представлены в начале файла сценария.

Я пытаюсь запустить этот код, используя 'parfor'. Цель состоит в том, чтобы запустить каждую итерацию независимо в отдельном ядре, а затем собрать их в конце, чтобы генерировать B. текущий код выглядит примерно так ---

iter=100; 
p=0.8;N=1200; 
maxgen=1000; 
d=0.01; 
evalues=(d/2):d:(1-d/2); 
cvalues=(d/2):d:(1-d/2); %% p, N are starting parameters 
[C,E]=meshgrid(cvalues,evalues); %% Starting 10,000 combinations 

B_t1000 = []; %% initializing B_t1000 
B_t200= []; %% initializing B_t200 

parfor k=1:iter 

A_t1000= zeros(length(evalues),length(cvalues)); %%initializing A_t1000 
A_t200 = zeros(length(evalues),length(cvalues)); %%initializing A_t200 
for i=1:length(evalues) 
for j=1:length(cvalues) 
    e=evalues(i); % starting point input for e for function file 
    c=cvalues(j); % starting point input for c for function file 
    [A_t1000, A_t200] = function (e,c,p,N,maxgen); %% calling a function to generate A_t1000 and A_t200   
end 
end 

B_t1000 (1:length(evalues),1:length(cvalues),k) = A_t1000; 
B_t200 (1:length(evalues),1:length(cvalues),k) = A_t1000; 
end 

Я получаю сообщение об ошибке message-- «Переменная B_t1000 в parfor нельзя классифицировать ». Я думаю, что это связано с проблемами независимости и индексирования.

Может ли кто-нибудь помочь мне запустить этот код с помощью parfor?

Увеличьте параметры «Ne» и «maxgen» дольше времени, затрачиваемого на запуск кода только циклом «для». В настоящее время более крупный параметр занимает> 30 часов для запуска без пар. Я хочу уменьшить это время, используя parfor.

Любые предложения, пожалуйста? Благодаря!

ответ

0

Измените тип данных вашего результата на массив ячеек.

Для инициализации использования:

B_t1000 = cell(1,iter); %% initializing B_t1000 
B_t200= cell(1,iter); %% initializing B_t200 

А затем в цикле parfor сделать

B_t1000{k} = A_t1000; 
B_t200{k} = A_t1000; 

Если вам действительно нужны результаты, чтобы быть 3D-матрицу, а затем преобразовать их после parfor.

+0

спасибо. Попробуй это и сообщишь, как это работает. В настоящее время я запускаю его, преобразовывая Bs как массивы ячеек. Надеюсь, это значительно сократит время работы. – Aditya

0

B_t1000 и B_t200 в вашем коде разрезанные переменные в парфоре. Проблема с вашим кодом заключается в том, что переменная цикла (k в вашем случае) parfor может использоваться только как индекс первого уровня, где вы используете его как третий уровень индексирование.

Пожалуйста, смотрите официальный MATLAB документ: http://nl.mathworks.com/help/distcomp/sliced-variables.html

Быстрое исправление для вашего кода, изменить код инициализации:

B_t1000 = zeros(iter,length(evalues),length(cvalues)); %% initializing B_t1000 
B_t200= zeros(iter,length(evalues),length(cvalues)); %% initializing B_t200 

и изменять задания в цикле parfor для:

B_t1000 (k,:,:) = A_t1000; 
B_t200 (k,:,:) = A_t1000; 

Теперь переменная цикла parfor k используется в качестве индексации первого уровня B_t1000 и B_t200. Вы также можете определить B_t1000 и B_t200 как массивы ячеек. Иногда это облегчает понимание.

+0

Спасибо. Попробуй это и сообщишь, как это работает. В настоящее время я запускаю его, преобразовывая Bs как массивы ячеек. Надеюсь, это значительно сократит время работы. – Aditya

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