Avatar billede karmapolice Nybegynder
12. marts 2003 - 21:28 Der er 7 kommentarer og
1 løsning

for-løkke unroll

Er der nogen som kender et utility som kan bruges til at lave loop-unrolling med?

Jeg har en for-løkke:
for (int i = 0; i<1000; i++)
{
  // bla bla bla
  zx[i] = et-eller-andet.
}

Som jeg gerne vil have skrevet som
zx[0] = et-eller-andet
zx[1] = et-eller-andet
zx[2] = et-eller-andet
...
zx[999] = et-eller-andet

Men jeg gider ikke at skrive det i hånden for koden er en smule omfattende at køre copy/paste+søg/erstat på!

Og det er ikke interessant for mig at få compileren til at lave loop unroll for koden skal compiles med en meget speciel compiler (synopsys compile_systemc for de interesserede).

Det ville virkelig spare mig for meget arbejde - derfor de mange point!
Avatar billede olennert Nybegynder
12. marts 2003 - 21:49 #1
Øh. Med mindre et-eller-andet er ret komplekst, hvad så med:

void unroll(std::ostream& os)
{
    for (int i = 0; i < 1000; ++i)
    {
        os << "z[" << i << "] = et-eller-andet;" << std::endl;
    }
    os << std::flush;
}
Avatar billede jpvj Nybegynder
12. marts 2003 - 21:49 #2
Hvis det ikke skal bruges "hele tiden", så foreligger muligheden for for, at lave et program på max 10 linier, der kan lave din kode som output til en tekst fil...

JP
Avatar billede olennert Nybegynder
12. marts 2003 - 21:50 #3
Så skal du bare åbne en ofstream, og kalde unroll med den som parameter.

Korrekt, det er ikke en generel løsning jeg har her. Men hvis din loop unrolling er enkel, så er dette da en hurtig løsning.
Avatar billede olennert Nybegynder
12. marts 2003 - 21:51 #4
Og det ser ud til at JP er enig med mig :-)
Avatar billede arne_v Ekspert
13. marts 2003 - 00:36 #5
Nu er det jo lidt svært at vide hvad den compiler tillader.

Men hvis følgende trick kan bruges, så vil jeg mene at det var
markant nemmere at vedligeholde:

#include <stdio.h>

#define ONE(base) a[base]=base;

#define TEN(base) ONE(base) \
                  ONE(base+1) \
                  ONE(base+2) \
                  ONE(base+3) \
                  ONE(base+4) \
                  ONE(base+5) \
                  ONE(base+6) \
                  ONE(base+7) \
                  ONE(base+8) \
                  ONE(base+9)

#define HUNDRED(base) TEN(base) \
                      TEN(base+10) \
                      TEN(base+20) \
                      TEN(base+30) \
                      TEN(base+40) \
                      TEN(base+50) \
                      TEN(base+60) \
                      TEN(base+70) \
                      TEN(base+80) \
                      TEN(base+90)

#define THOUSAND(base) HUNDRED(base) \
                      HUNDRED(base+100) \
                      HUNDRED(base+200) \
                      HUNDRED(base+300) \
                      HUNDRED(base+400) \
                      HUNDRED(base+500) \
                      HUNDRED(base+600) \
                      HUNDRED(base+700) \
                      HUNDRED(base+800) \
                      HUNDRED(base+900)

int main()
{
  int i,a[1000];
  THOUSAND(0);
  for(i=0;i<1000;i++) printf("%d\n",a[i]);
}
Avatar billede arne_v Ekspert
13. marts 2003 - 00:38 #6
Det bliver expanderet til 1000 assignments.

Og man kan rette i et-eller-andet expression et sted uden at
skulle genkøre en utility.

Til gengæld skal C compiler preprocessoren kunne accepetere
nogle rimelige lange udtryk.
Avatar billede jpk Nybegynder
13. marts 2003 - 09:02 #7
Hvilket udviklingsmiljø bruger du, understøtter det makroer?
I så fald kunne du lave en lille makro der ændrede koden direkte i dit miljø...
Avatar billede olennert Nybegynder
13. marts 2003 - 09:14 #8
Arnes løsning er bedre end den jeg har skitseret, for du kan holde det hele indenfor den samme kildetekstfil. Men det kræver altså at din oversætters præprocessor kan håndtere store makroer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester