2011-03-17 3 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 

Le code ci-dessus en octave consiste à générer une séquence numérique qui écrit dans un fichier texte. il faudra des jours pour terminer l'exécution puisqu'il génère environ 2^36 nombres. donc peut-on s'il vous plaît laissez-nous savoir comment paralléliser ce code dans hpc.comment paralléliser ce code dans hpc?

Répondre

0

Vous n'avez pas besoin de paralléliser cela; vous pouvez accélérer cela d'environ 10000x en passant à un langage compilé. (Sérieusement, voir ci-dessous.) L'octave ou même le matlab vont être lents comme de la mélasse. Ils sont parfaits pour les grandes opérations matricielles, mais des tonnes de boucles imbriquées avec des instructions if vont se produire lente lente lente. Normalement, je vous suggère de déplacer le code Octave/Matlab à FORTRAN, mais puisque vous avez déjà le fichier E/S écrit essentiellement des déclarations C de toute façon, le C équivalent de ce code presque lui-même écrit:

#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; 
} 

Course à pied votre code d'octave ci-dessus et ce code C (compilé avec -O3) pendant une minute chacun, le code d'octave a traversé environ 2 163 éléments dans la séquence, et le code C compilé est passé à 23 299 068. Donc c'est bien.

En termes de parallélisation, le découpage en pièces indépendantes est facile, mais elles ne seront pas particulièrement bien équilibrées. Si vous commencez (disons) 26 processus, et leur donnez (a = 0, b = 0), (a = 0, b = 1) ..., (a = 0, b = 19), (a = 1, b = 0), (a = 1, b = 1), .. (a = 1, b = 5), ils peuvent tous fonctionner indépendamment et vous pouvez concaténer les résultats quand ils sont tous faits. Le seul inconvénient est que les tâches a = 0 seront plus lentes que les tâches a = 1, mais peut-être que c'est assez bon pour commencer.

+0

tks pour votre réponse monsieur ... v effectivement fait l'exécution en divisant le code en donnant différentes limites dans les machines individuelles asu dit .. mais maintenant vr hâte de l'exécuter en hpc en utilisant mpi..même v échoué à exécuter des prgms simples en mpi. Pouvez-vous s'il vous plaît nous aider à le faire en MPI ?? – athira