2014-09-25 1 views
0

Я использую параллельные вычисления в первый раз (spmd).составная дата из параллельных вычислений

После запуска пула и выполнения параллельных вычислений у меня есть только составные переменные в моей рабочей области и они не могут их открыть. Или когда я открываю их двойным щелчком, они пусты. Как я могу использовать данные?

Вот мой код:

matlabpool open local 4 

spmd 
    if labindex==1 
    a = randn(300,1); 
    end 
    if labindex==2 
    b = randn(300,1); 
    end 
    if labindex==3 
    c = randn(300,1); 
    end 
    if labindex==4 
    d = randn(300,1); 
    end 
end 

matlabpool close 

ответ

1

Если вы хотите создать 4 массивов размера (300,1) на отдельном работнике каждого, это лучше сделать, как в следующем. Обратите внимание, что у меня 4 ядра на моем компьютере/в Matlab.

clc 
clear 

spmd  
    RandomArray = rand(300,1); % Matlab automatically creates a (300,1) array in each worker. 
end 

FinalArray = [RandomArray{:}]; % Concatenate everything outside of the spmd block. 

whos % Check the results 


Name    Size   Bytes Class  Attributes 

    FinalArray  300x4    9600 double     
    RandomArray  1x4    1145 Composite    

Как вы видите, FinalArray имеет размер (300,4), как вы хотите. С вашим кодом выше было бы очень больно собрать все вместе во втором блоке spmd, потому что каждый работник не знает, что находится в других рабочих, и каждая переменная будет неопределенной для рабочих, которые их не использовали. Я не знаю, правильной терминологии извините, но вы можете прочитать документ, чтобы получить лучшее объяснение :)

EDIT:

Чтобы ответить на комментарий, вот простой пример. Надеюсь, это то, что вы имели в виду :)

clc 
clear 

% Define different variables. 
w = ones(1,10); 
x = 1:10; 
y = x/2; 
z = rand(1,10); 

% Use different functions in each worker. Of course you could use the same function with different inputs. 
spmd 
    if labindex==1   
     a = w;   
    end 
    if labindex==2 
     b = sin(x); 
    end 
    if labindex==3 
     c = y.^2; 
    end 
    if labindex==4 
     d = 4*z; 
    end 
end 

% This is the important part 
FinalArray = [a{1} ;b{2}; c{3} ;d{4}]; 
whos 

И выход Whos является:

Name   Size   Bytes Class  Attributes 

    FinalArray  4x10    320 double     
    a    1x4    497 Composite    
    b    1x4    497 Composite    
    c    1x4    497 Composite    
    d    1x4    497 Composite    
    w    1x10    80 double     
    x    1x10    80 double     
    y    1x10    80 double     
    z    1x10    80 double  
+0

Спасибо! Я понимаю этот пример, но что, если я хочу, чтобы каждое ядро ​​выполняло другую работу, например. запускать функцию, которая вычисляет некоторые значения, но с другой переменной в качестве входных данных для каждого ядра? – holistic

+0

Хорошо, я вижу. См. Мой отредактированный ответ. Надеюсь, это то, что вы хотите! –

+0

Так это то, что вы хотели? –

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

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