Kodowanie symulacji C, w której, biorąc pod uwagę sekwencję reguł do zweryfikowania, dzielimy ją na "plasterki" i weryfikujemy każdy plaster. (Podstawową ideą jest to, że kolejność jest ważna, a na faktyczne znaczenie reguły mają wpływ niektóre reguły powyżej, możemy utworzyć "plaster" z każdą regułą i tylko powyższe zasady, które ją pokrywają. plasterki, które są zwykle znacznie mniejsze niż cała sekwencja.)Rozwiązanie w postaci sterty przewyższa stos?
Mój problem wygląda następująco.
Mam struct (policy), która zawiera tablicę struktur (reguł) i int (długość). Moja oryginalna implementacja używane malloc i realloc liberalnie:
struct{
struct rule *rules;
int length;
}policy;
...
struct policy makePolicy(int length)
{
struct policy newPolicy;
newPolicy.rules = malloc(length * sizeof(struct rule));
newPolicy.length = length;
return newPolicy;
}
...
struct policy makeSlice(struct policy inPol, int rulePos)
{
if(rulePos > inPol.length - 1){
printf("Slice base outside policy \n");
exit(1);
}
struct slice = makePolicy(inPol.length);
//create slice, loop counter gets stored in sliceLength
slice.rules = realloc(slice.rules, sliceLength * sizeof(struct rule));
slice.length = sliceLength;
return slice;
}
Ponieważ wykorzystuje pamięć malloc'ed, jestem zakładając, że znaczący sposób korzysta z hałdy. Teraz próbuję przenieść się na eksperymentalną maszynę równoległą, która nie ma malloc.
I smutno poszedł i przyznane wszystko z tablic o ustalonym rozmiarze.
Teraz jest szok.
Nowy kod działa wolniej. Znacznie wolniej.
(Oryginalny kod używany do czekania na minuty na końcu, gdy długość plasterka miała wynosić 200, a może na godzinę na ponad 300 ... teraz robi to, gdy długość plastra wynosi 70, 80 ... i ma trwały godziny, powiedzmy 120. Wciąż nie 200.)
Jedyną rzeczą jest to, że teraz plasterki mają taką samą pamięć jak pełna polityka (MAXBUFLEN to 10000), ale całość nie wydaje się być wyczerpana pamięci w ogóle. "top" pokazuje, że całkowita ilość zużywanej pamięci jest dość skromna i wynosi kilkadziesiąt megabajtów, jak wcześniej. (I oczywiście, kiedy przechowuję długość, nie przejmuję się całą tą kwestią, tylko częścią z prawdziwymi regułami).
Czy ktoś mógłby pomóc ci wyjaśnić, dlaczego nagle stało się tak wolniej?
czy próbowałeś użyć profilera? Czy działa wolniej na nowej maszynie lub na tym samym komputerze? –
Czy masz na myśli, że teraz działa wolniej na tym samym komputerze? Lub, że działa wolniej na twoim "eksperymentalnym równoległym" komputerze? – jalf
Do tej pory znajduje się na tym samym komputerze. Nie uruchomiłem go jeszcze na równoległym. Powinienem dodać, weryfikacja to order pow (n, 5), gdzie n to liczba reguł. Myślę więc, że czas poświęcony jest na weryfikację. Staram się teraz uczyć gprof, więc mogę profilować i odpowiadać na to lepiej. – user2431187