2011-03-17 68 views
0
s=1 

r=m=n=o=p=q=u=t=19 

myfile = fopen ("sequence2.txt", "w", "ieee-le"); 

for a=0:1 

    if(a==1) 

     r=5 

    endif 

    for b=0:r 

    if(a==1 && b==5) 

    m=11 

    endif 

for c=0:m 

n=o=19 

    for d=0:1 

if(d==1) 

    n=5 

    endif 

for e=0:n 

    if(d==1 && e==5) 

    o=11 

     endif 

    for f=0:o 

    p=q=19 

    for g=0:1 

     if(g==1) 

    p=5 

     endif 

     for h=0:p 

    if(g==1 && h==5) 

     q=11 

     endif 

    for i=0:q 

     t=u=19 

     for j=0:1 

     if(j==1) 

      t=5 

     endif 

     for k=0:t 

      if(j==1 && k==5) 

     u=11 

       endif 

      for l=0:u 



     s=s+1 

     fputs(myfile,num2str(a)); 

     fputs(myfile,"."); 

     fputs(myfile,num2str(b)); 

     fputs(myfile,"."); 

     fputs(myfile,num2str(c)); 

     fputs(myfile,":"); 

     fflush(stdout); 

     fputs(myfile,num2str(d)); 

     fputs(myfile,"."); 

     fputs(myfile,num2str(e)); 

     fputs(myfile,"."); 

     fputs(myfile,num2str(f)); 

     fputs(myfile,":"); 

     fflush(stdout); 

     fputs(myfile,num2str(g)); 

     fputs(myfile,"."); 

     fputs(myfile,num2str(h)); 

     fputs(myfile,"."); 

     fputs(myfile,num2str(i)); 

     fputs(myfile,":"); 

     fflush(stdout); 

     fputs(myfile,num2str(j)); 

     fputs(myfile,"."); 

     fputs(myfile,num2str(k)); 

     fputs(myfile,"."); 

     fputs(myfile,num2str(l)); 

     fputs(myfile,"\n"); 

     fflush(stdout); 

     end 

      end 

     end 

     end 

     end 

     end 

    end 

     end 

end 

    end 

end 

    end 

以上八度碼是生成一個寫入文本文件的數字序列。由於它產生大約2^36個數字,因此需要數天時間才能完成執行。所以任何人都可以讓我們知道如何在hpc中並行化這些代碼。如何在hpc中並行化這段代碼?

回答

0

您可能不需要並行化;通過轉向編譯語言,您可以將其速度提高約10000倍。 (認真;見下文。)Octave甚至matlab將會像糖漿一樣慢。它們對於大型矩陣運算非常棒,但是其中嵌入循環的if語句將會運行緩慢慢。一般情況下我建議把八度/ Matlab代碼到FORTRAN,但既然你已經有了I/O基本上與C語句反正寫在文件中,C相當於該代碼的幾乎寫道本身:

#include <stdio.h> 

int main(int argc, char **argv) { 
    int a,b,c,d,e,f,g,h,i,j,k,l; 
    int s,r,m,n,o,p,q,u,t; 
    FILE *myfile; 

    s=1; 

    r=m=n=o=p=q=u=t=19; 

    myfile = fopen ("sequence2-c.txt", "w"); 
    for (a=0; a<=1; a++) { 

     if (a == 1) 
      r = 5; 

     for (b=0; b<=r; b++) { 
      if (a == 1 && b == 5) 
       m = 11; 

      for (c=0; c<=m; c++) { 
       n = o = 19; 

       for (d=0; d<=1; d++) { 
        if (d==1) 
         n = 5; 

        for (e=0; e<=n; e++) { 
         if (d==1 && e == 5) 
          o = 11; 


         for (f=0; f<=o; f++) { 
          p = q = 19; 

          for (g=0; g<=1; g++) { 
           if (g == 1) 
            p = 5; 


           for (h=0; h<=p; h++) { 
            if (g == 1 && h==5) 
             q = 11;           

            for (i = 0; i<=q; i++) { 
             t=u=19; 

             for (j=0; j<=1; j++) { 
              if (j==1) 
               t=5; 

              for (k=0; k<=t; k++) { 
               if (j==1 && k==5) 
                u=11;              

               for (l=0;l<=u;l++){ 
                s++;               
                fprintf(myfile,"%d.%d.%d:%d.%d.%d:%d.%d.%d:%d.%d.%d\n",a,b,c,d,e,f,g,h,i,j,k,l); 

               } 
              } 
             } 
            } 
           } 
          }        
         } 
        } 
       } 
      } 
     } 
    } 
    return 0; 
} 

運行上面的八度音代碼和這個C代碼(用-O3編譯)每個一分鐘,八度音代碼通過序列中的約2,163個條目,編譯的C代碼通過23,299,068。這很好。

在並行化方面,將其分解爲獨立片段很容易,但它們不會特別好地平衡負載。 (a = 0,b = 0),(a = 0,b = 1)...,(a = 0,b = 19),(a = 1, b = 0),(a = 1,b = 1),...(a = 1,b = 5),它們都可以獨立運行,並且可以在完成時連接結果。唯一不利的一面是a = 0職位的運行速度會比a = 1職位慢一些,但也許這足以啓動。

+0

tks for your reply sir ... v實際上是通過在各個機器上給出不同的限制來分割代碼來執行,但是現在vr期待着使用mpi..hp來運行它。以mpi運行簡單的prgms。你能幫我們做一下嗎? – athira 2011-03-19 16:30:10