2015-04-22 3 views
1

В настоящее время я пытаюсь запустить эксперименты параллельно с использованием MATLAB 2011b, которые очень трудоемки. Мне интересно, может ли кто-нибудь помочь мне «перевести» следующий блок общего (нерабочего) кода parfor в то, что будет работать в коде spmd.Использование spmd или parfor в Matlab

amountOfOptions = 8; 
startStockPrice = 60 + 40 * rand(1,amountOfOptions);   
strike = 70 + 20 * rand(1,amountOfOptions);     
v = 0.35 + 0.3 * rand(1,amountOfOptions);     
IV = 0.25 + 0.1 * rand(1,amountOfOptions);     
sigma = 0.15 + 0.65 * rand(1,amountOfOptions);    
riskFreeRate = 0.05 + 0.1 * rand(1,amountOfOptions);   
tn = fix(1 + 3 * rand(1,amountOfOptions)); 
tic; 
for g=1:amountOfOptions 
     for i=1:10       
     N = i*5;    
     Cti = zeros(1,N);      
     Sti = zeros(1,N);      
     B = zeros(1,N);       
     d1_ti = zeros(1,N);  
     delta_t = zeros(1,N); 
     ctn = 0; 
     cmtn = 0; 
     result = 0; 
     t = (1:N)/N;   
     dt = 1/N;       
     c_mt0 = 0;          
     for j=1:10 
      B = sigma(g)*randn(1,N);  
       part1 = startStockPrice(g)*normcdf((log(startStockPrice(g)/strike(g))+(riskFreeRate(g)+(0.5*(IV(g))^2))*(tn))/(v(g)*sqrt(tn)),0,sigma(g)); 
       part2 = exp(-riskFreeRate(g)*tn)*strike(g)*normcdf((log(startStockPrice(g)/strike(g))+(riskFreeRate(g)-(0.5*(IV(g))^2))*(tn))/(IV(g)*sqrt(tn))); 
      c_mt0 = part1 - part2;   
      Sti(1) = startStockPrice(g);  
       for j = 2:N-1 
        Sti(j)=Sti(j-1)*exp((riskFreeRate(g)-dt*0.5*sigma(g)^2) * t(j)*dt + sigma(g)*B(j)); 
       end                
      Sti(N) = Sti(N-1)*exp((riskFreeRate(g)-dt*0.5*sigma(g)^2) * t(N)*dt + sigma(g)*B(N)); 

        parfor i = 1:N-1 
         d1ti(i) = (log(Sti(i)/strike(g)) + (riskFreeRate(g) + v(g).^2/2) * (tn - t(i)))/(v(g) * sqrt(tn - t(i))); 
        end 
        parfor i = 1:N-1 
         Cti(i) = Sti(i).*normcdf((d1ti(i)),0,sigma(g)) - exp(-riskFreeRate(g).*(tn(g) - t(i))).*strike(g).*normcdf(((d1ti(i) - v(g)*sqrt(tn(g) - t(i)))) , 0 ,sigma(g)); 
        end 
         if((Sti(N) - strike(g)) > 0) 
          ctn = Sti(N) - strike(g); 
         else 
          ctn = 0; 
         end 
        parfor i = 1:N-1 
         delta_t(i) = normcdf((d1ti(i)),0,sigma(g)); 
        end 
      cmtn = ctn - c_mt0*exp(riskFreeRate(g)*tn(g));             
      result= cmtn + result; 
     end 
     result= result/10;                
     end 
end 
time = toc; 
+0

Я всегда использовал 'parfor' над' spmd', потому что это более логично для меня. Поскольку 'parfor' требует, чтобы каждая итерация в цикле была независимой от всех других итераций, вам необходимо убедиться, что это так. Пожалуйста, создайте для меня минимальный пример. Вместо этого вы хотите использовать игрушечный пример? – krisdestruction

+0

Пример использования parfor на официальном сайте [ссылка] (http://www.mathworks.com/help/distcomp/examples/simple-benchmarking-of-parfor-using-blackjack.html) _italic_ ** bold ** 'code' –

+0

Anyways дайте мне знать, если мое решение сработало для вас. Если да, пожалуйста, отметьте его как принятый ответ :) – krisdestruction

ответ

0

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

% Initial Variables 
amountOfOptions = 8; 
startStockPrice = 60 + 40 * rand(1,amountOfOptions);   
strike = 70 + 20 * rand(1,amountOfOptions);     
v = 0.35 + 0.3 * rand(1,amountOfOptions);     
IV = 0.25 + 0.1 * rand(1,amountOfOptions);     
sigma = 0.15 + 0.65 * rand(1,amountOfOptions);    
riskFreeRate = 0.05 + 0.1 * rand(1,amountOfOptions);   
tn = fix(1 + 3 * rand(1,amountOfOptions)); 

% Open Parpool 
try 
    parpool; 
catch 
end 

% Use parfor 
parfor i = 1:amountOfOptions 
    [startStockPrice(i),strike(i),v(i),IV(i),sigma(i),riskFreeRate(i),tn(i)] = fun(startStockPrice(i),strike(i),v(i),IV(i),sigma(i),riskFreeRate(i),tn(i)); 
end 

Тогда вы можете создать функцию герметизирующего fun, который будет принимать все параметры и процесс/reoutput них. Он будет иметь следующее определение/заголовок:

function [startStockPrice,strike,v,IV,sigma,riskFreeRate,tn] = fun(startStockPrice,strike,v,IV,sigma,riskFreeRate,tn); 
+1

Большое вам спасибо. Это то, что мне нужно –

+0

@ СултанГашимов Anytime :) – krisdestruction

+0

Может ли downvoter ухаживать за комментарием перед тем, как они сбрасывают вниз? – krisdestruction