• 1
  • 2
2020-01-03, 09:45
  #1
Medlem
Denna kod för nearest neighbour ger segmentatinon fault med g++ version 9.2.1 men fungerar bra med Raspberry Pi (32bit).

Några tips?
__________________
Senast redigerad av grabb1948 2020-01-03 kl. 09:47.
Citera
2020-01-03, 10:29
  #2
Medlem
Eftersom beteendet inte är definierat när du låter indexen gå utanför storleken för a i cal_sum, så går det inte att dra någon slutsats om huruvida en 32-bitars kompilator skulle vara bättre från detta exempel.
Citera
2020-01-03, 11:08
  #3
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av grabb1948
Denna kod för nearest neighbour ger segmentatinon fault med g++ version 9.2.1 men fungerar bra med Raspberry Pi (32bit).

Några tips?

Mitt tips är - skyll inte på kompilatorn. Om det inte bygger, inte beter sig rätt, eller om det kraschar, så utgå från att du har gjort fel. Att det "funkar" på 32-bit är bara ren och skär tur. Eller egentligen otur, för det hade hjälpt dig mer om det hade kraschat där också.
Citera
2020-01-04, 10:11
  #4
Medlem
Tack för svaren!
Ja det ser ut som om gcc för Raspberry Pi är ovanligt förlåtande.
En annan fråga:
Uppdateras gcc för 32 bitars x86 såsom 64 bitars x86_64 med alla nya c och c++ standarder?
Citera
2020-01-04, 20:13
  #5
Medlem
Citat:
Ursprungligen postat av grabb1948
Tack för svaren!
Ja det ser ut som om gcc för Raspberry Pi är ovanligt förlåtande.
En annan fråga:
Uppdateras gcc för 32 bitars x86 såsom 64 bitars x86_64 med alla nya c och c++ standarder?

gcc kan kompilera till både 32 och 64 bitars arkitektur oavsett platform gcc körs på. Finns en flagga du sätter vid kompileringen.

Kolla på raden:
cal_sum(a+1,n);

och försök förstå varför det inte fungerar att göra så.
Citera
2020-01-06, 15:29
  #6
Medlem
Jag har nu gjort olika tester med open mp av 32bit och 64bit gcc med core i7-8700.
Resultatet ser ganska lika ut men 64bit vinner vid mer an 4 tradar.
Citera
2020-01-06, 21:07
  #7
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Mitt tips är - skyll inte på kompilatorn. Om det inte bygger, inte beter sig rätt, eller om det kraschar, så utgå från att du har gjort fel. Att det "funkar" på 32-bit är bara ren och skär tur. Eller egentligen otur, för det hade hjälpt dig mer om det hade kraschat där också.

Nu har det hänt något med kompilatorn för Raspberry Pi.
Jag testar just RPi 4 med uppdaterad programvara:
pi@raspberrypi:~/New_dec2019 $ g++ permute3.cpp
pi@raspberrypi:~/New_dec2019 $ ./a.out
minimum cost:-1225247576
Här anar man felet!

pi@raspberrypi:~/New_dec2019 $ cp a.out permute3.out
pi@raspberrypi:~/New_dec2019 $ g++ permute33.cpp
pi@raspberrypi:~/New_dec2019 $ ./a.out
minimum cost:2
Med en större array
Citera
2020-01-08, 18:57
  #8
Avstängd
Svaret på topic är nej, på en 64-bit CPU är en 64-bits kompilator alltid bättre än en 32-bitars.
Citera
2020-01-09, 17:51
  #9
Medlem
Citat:
Ursprungligen postat av BWisser
Svaret på topic är nej, på en 64-bit CPU är en 64-bits kompilator alltid bättre än en 32-bitars.

Motivera gärna varför!
Jag kan tänka mej att antalet användare avgör. Många användare gör att buggar upptäcks fortare.
Så är det för X86_64 men hur är det för ARM?
Citera
2020-01-10, 21:40
  #10
Medlem
Citat:
Ursprungligen postat av grabb1948
Tack för svaren!
Ja det ser ut som om gcc för Raspberry Pi är ovanligt förlåtande.
En annan fråga:
Uppdateras gcc för 32 bitars x86 såsom 64 bitars x86_64 med alla nya c och c++ standarder?
Handlar inte om att kompilatorn är mer förlåtande utan hur minnet är ordnat. Segmentation fault innebär per definition att programmet försöker läsa eller skriva till en virtuell minnesadress som inte är mappad mot en fysisk adress. Använder du alls virtuellt minne på din raspberry pi? Vilken sidstorlek används? I vilken ordning länkas programmets datasegment ihop? Vad kommer efter det fält där du läser utanför gränsen?

Angående kompilatorer så utvecklas både gcc och clang efter principen "felaktig kod är odefinierad". I praktiken innebär det att kod som skulle läsa utanför gränsen markeras som "don't care" om kompilatorn upptäcker detta, med följd att kompilatorn kan generera precis vilken kod den vill. Orsaken är att man vill ge kompilatorn möjlighet att optimera bort exekveringsvägar som ändå inte är nåbara i ett korrekt program.
Citera
2020-02-22, 15:10
  #11
Medlem
Det egentliga problemet här har ingenting med 32 eller 64 bitar att göra, utan snarare att du inte förstår hur c++, temporära objekt och pekare fungerar.

cal_sum(a + 1, n);
Här blir det fel, du hoppar utanför minnet på a.

Vad är det din kod försöker göra?
Citera
2020-02-22, 16:48
  #12
Medlem
Citat:
Ursprungligen postat av TwoReflections
Det egentliga problemet här har ingenting med 32 eller 64 bitar att göra, utan snarare att du inte förstår hur c++, temporära objekt och pekare fungerar.

cal_sum(a + 1, n);
Här blir det fel, du hoppar utanför minnet på a.

Vad är det din kod försöker göra?
Ja jag vet att det är utanför. Men varje kompilator beter sig något olika.
Ett svårare problem är troligen division med noll.

https://people.sc.fsu.edu/~jburkardt...lbrot_ppm.html
Här är två varianter av Mandelbrot. Den seriella dumpar filen på bildskärmen...inte så vackert. OpenMP varianten lagrar PPM-en. Om jag ökar från 500x500 till 800x800 så går det bra med den seriella men blir segmentation fault med Open MP varianten.
Division med noll eller något annat?
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in