как распараллелить этот код в hpc? - PullRequest
0 голосов
/ 17 марта 2011
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.

1 Ответ

0 голосов
/ 17 марта 2011

Возможно, вам не нужно распараллеливать это;Вы можете ускорить это примерно в 10000 раз, перейдя на скомпилированный язык.(Серьезно; см. Ниже.) Октава или даже матлаб будут медленными, так как патока запускает это.Они отлично подходят для больших матричных операций, но тонны вложенных циклов с операторами if будут выполняться slow slow slow.Обычно я бы рекомендовал перенести код Octave / Matlab в FORTRAN, но, поскольку вы уже получили файловый ввод / вывод, по существу написанный с помощью операторов C, эквивалент C этого кода почти сам записывается:* Выполнение кода октавы выше и этого кода C (скомпилированного с -O3) в течение одной минуты каждый, код октавы прошел около 2163 элементов в последовательности, а скомпилированный код C - 23,299,068.Так что это хорошо.

С точки зрения распараллеливания, разбить это на независимые части легко, но они не будут особенно хорошо сбалансированы по нагрузке.Если вы запустите (скажем) 26 процессов и дадите им (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, но, возможно, этого достаточно для запуска.

...