2015-04-22 470 views
1

我目前正嘗試使用MATLAB 2011b並行運行實驗,這非常耗時。 我想知道是否有人可以幫助我將下面的通用(非工作)parfor代碼塊轉化爲可以在spmd代碼中工作的東西。在Matlab中使用spmd或parfor

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的示例[link](http://www.mathworks.com/help/distcomp/examples/simple-benchmarking-of-parfor-using-blackjack.html)_italic_ ** bold **'code' –

+0

反正讓我知道我的解決方案是否適合你。如果是這樣,請將其標記爲已接受的答案:) – krisdestruction

回答

0

我一直在使用parfor而不是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,將接受所有的參數和工藝/再次輸出它們。它將具有以下定義/標題:

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

非常感謝。這就是我所需要的 –

+0

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

+0

downvoter可以在他們downvote之前注意評論嗎? – krisdestruction