C++ och dess framtid att programmera minnessäkert - Hur går utvecklingen?

Permalänk
Skrivet av klk:

Förstår inte varför du fastnat i lopen om att Go skulle vara så snabbt. Go använder vad jag kan se en GC och har programmet en GC så är det förpassat till ålderdomshemmet. Språk med GC är inte snabba. Bli inte förvånad om optimerad kod i C++ kan bli 10 gånger snabbare (eller mer) än språk med GC om det är lite luriga saker som skall göras.
Språk med GC använder mer minne (mycket mer), drar inte alls lika mycket nytta av prefetchers, har större fragmentering förutom att de inte kan trixa med bytsen.

Nu tror jag det är dags att du kollar lite på hur en modern GC fungerar. Det är inte stop-and-copy längre. Om vi tar fallet Go, så är GC:n inkrementell och concurrent. Den är designad för low latency och använder lediga kärnor för att köra GC samtidigt som ditt program kör i full fart. Ja, programmet kommer att dra mer minne eftersom onåbart minne inte upptäcks i samband med att sista referensen släpps och det går åt minne till bookkeeping i samband med GC, men att saker och ting automatiskt skulle bli 10X snabbare bara du skrev det i C++ kan du fetglömma.

Nu skriver du prefetch igen. Pratar du om software prefetch eller hardware prefetch? Software är helt och hållet en fråga för kompilatorn så där tror jag inte att GC blockar användandet av prefetch-instruktioner. Hardware prefetch är baserat på att CPUn hittar någon form av regularitet i accessmönstren, dvs loopar över arrayer. På vilket sätt skulle loopen bli annorlunda för att språket har GC? GC kommer typiskt gå i samband med att man allokerar nytt minne, och gör du det förstör du för prefetchern även om du gör det i C++. Kan du utveckla på vilket sätt GC är skadligt för hardware prefetching?

Stavfel: CG -> GC
Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Nu tror jag det är dags att du kollar lite på hur en modern GC fungerar. Det är inte stop-and-copy längre. Om vi tar fallet Go, så är GC:n inkrementell och concurrent. Den är designad för low latency och använder lediga kärnor för att köra GC samtidigt som ditt program kör i full fart. Ja, programmet kommer att dra mer minne eftersom onåbart minne inte upptäcks i samband med att sista referensen släpps och det går åt minne till bookkeeping i samband med GC, men att saker och ting automatiskt skulle bli 10X snabbare bara du skrev det i C++ kan du fetglömma.

Minns när java kom på 90 talet. Då "skröt" de om att det skulle vara lika snabbt som C++ men så mycket enklare. En del påstod till och med att det skulle vara snabbare. Orsaken var att GC inte gjorde lika mycket jobb för att hitta ledigt minne, istället körde GC'n på till minnet tog slut och först då rensade på minne. Det var inte rätt då heller men det var mer rätt än vad det är idag. På den tiden hängde minnet med bättre i processorns hastighet att processa data. Det var inte prestanda mässigt lika "dyrt" att hämta data i arbetsminne. Cachen på processorer var inte i närheten av vad de är idag. Då var det bara att skruva upp frekvensen för att få upp hastigheten.

Idag handlar nästan allt om cache om man vill ha upp prestandan. Utvecklingen av hårdvara har utvecklats från java till C++ om man tänker på att man måste kontrollera minne för att få hastighet och det har med cachen att göra.

Orsaken till varför C++ (att kontrollerat minnet) är så mycket snabbare är:
Mindre minne används för samma mängd information, med trixande kan man få in mycket mer på liten yta (Många C och C++ utvecklare jobbar med bitar för att få in flera olika saker i exempelvis ett 32 bitars tal).
Kod anpassas till hur en cache fungerar, exempelvis att hantera data i multiplar av 4. Ett objekt som har en sizeof = 64 är mycket snabbare än ett objekt som har en sizeof = 72 och det beror på att en "cache lane" ofta är 64 byte (eller 128).
Prefetchers är väldigt viktiga för att få in data i snabbare delare av cache för idag har processorer cache i flera nivåer.

Lägg på SIMD, ligger data i arbetsminne fungerar de inte, data måste in i cache för att dra nytta av SIMD instruktioner.

Allt detta gör att en utvecklare som optimerar något viktigt i ett program kan få dramatiskt förbättrad prestanda.

10x är inte så konstigt som det låter när man lägger på de här lagren med olika optimeringar. Men det är en okänd värld för de som vägrar att ta i pekare (adresser).

Permalänk
Medlem
Skrivet av Yoshman:

"Kärnan" är maskinkod när man faktiskt kör programmet, i.e. det är rätt irrelevant att det finns vissa delar som är skrivna i X, Y eller Z.

Allt som körs i en processor är maskinkod ja, en processor förstår inget annat än maskinkod.

Skrivet av Yoshman:

Det relevanta är att domänen "skriva spel" allt mer går mot andra språk, där C# är det som ökar mest här.

Programmering handlar om att abstrahera funktionalitet, gör den så enkel som möjligt så vem som helst kan dra nytta av en dators hastighet och exakthet. Detta är vad programmering är, alltid varit.
Vanlig teknik då är att abstrahera så mycket att man inte ens behöver kunna programmera för att göra saker med en dator eller till enklare språk.
C# och LUA är vanligt. C# är vanligt för det backas av Microsoft, då finns det gott om utvecklare. LUA för dess kombination av enkelhet och snabbhet.

Skrivet av Yoshman:

Och specifika poängen här är: DOTS/ECS ger spelprogrammeraren en C# miljö som är väsentligt bättre på att utnyttja flera CPU-kärnor samt SIMD. Detta får man rent tekniskt genom att göra en rad optimeringar relaterade till access-patterns mot minne, men det trevliga är att det görs på ett sätt som är hyfsat automatiskt. Det man måste "offra" är att logiken skrivs på ett rätt annorlunda sätt mot "normala" mono-behavior klasser.

Kan garantera att dessa detaljer inte är skrivna i C# om det är som du påstår, en bra spelmotor.

Skrivet av Yoshman:

Bara som ett lackmustest av fokus här: det gick faktiskt inte att skriva ett multitrådat program i standard C eller C++ innan 2011, något som var möjligt i Java sedan första release 1996 och första release av C# 2002.

C har aldrig och kommer aldrig levereras med ett gigantiskt runtime bibliotek. Det skall väldigt mycket till för man lägger till delar i C standarden och det är inget dåligt, det är bra. C väljs inte för att få saker "gratis"

Skrivet av Yoshman:

Sedan är det helt klart så att en GC har en viss overhead, men om man jobbar med multitrådade program på multi-core plattform finns ett gäng fördelar med GC rent effektivitetsmässigt. Ett populärt sätt i C, t.ex. i Linux-kärnan, är att skapa tillräckligt mycket av en GC för att få lock-free algoritmer som sequence-locks, korrekta.

Det finns inga fördelar med en GC och trådar, du är ute och cyklar.
Enda fördelen är för de som inte kan programmera trådat vilket är de allra flesta för det är bl.a det svåraste man kan göra.

Om man skall anställa utvecklare och får trådad exempelkod av någon av de man funderar på att anställa och vet att personen gjort den. Då borde kandidatens aktier öka dramatiskt till anställning om de är ute efter kompetenta utvecklare.

Hantera minne räknas som bekant som svårt (denna tråden bevisar det om inte annat). Minne är mycket viktigare i trådade lösningar. Där måste man oavsett om man använder pekare eller inte veta exakt hur data bearbetas.
Vet inte utvecklare det så kan de få mardrömsbuggar som kan bränna ut vem som helst.

Hade lätt tagit 20 vanliga buggar mot en knepig bugg i trådad kod.

Ett bevis för hur svårt det är att titta på webservrar och hur många lösningar det finns med web servrar som är stateless. De är detta för att det är för svårt att hantera en trådad server som har koll på användare.
Fördelarna med att utveckla en webserverlösning där servern vet om användare är mycket stora men ändå görs det inte och det beror just på svårigheten att hantera data kopplat till massa användare i trådad miljö.

Permalänk
Skrivet av klk:

Minns när java kom på 90 talet. Då "skröt" de om att det skulle vara lika snabbt som C++ men så mycket enklare. En del påstod till och med att det skulle vara snabbare. Orsaken var att GC inte gjorde lika mycket jobb för att hitta ledigt minne, istället körde GC'n på till minnet tog slut och först då rensade på minne. Det var inte rätt då heller men det var mer rätt än vad det är idag. På den tiden hängde minnet med bättre i processorns hastighet att processa data. Det var inte prestanda mässigt lika "dyrt" att hämta data i arbetsminne. Cachen på processorer var inte i närheten av vad de är idag. Då var det bara att skruva upp frekvensen för att få upp hastigheten.

Idag handlar nästan allt om cache om man vill ha upp prestandan. Utvecklingen av hårdvara har utvecklats från java till C++ om man tänker på att man måste kontrollera minne för att få hastighet och det har med cachen att göra.

Orsaken till varför C++ (att kontrollerat minnet) är så mycket snabbare är:
Mindre minne används för samma mängd information, med trixande kan man få in mycket mer på liten yta (Många C och C++ utvecklare jobbar med bitar för att få in flera olika saker i exempelvis ett 32 bitars tal).
Kod anpassas till hur en cache fungerar, exempelvis att hantera data i multiplar av 4. Ett objekt som har en sizeof = 64 är mycket snabbare än ett objekt som har en sizeof = 72 och det beror på att en "cache lane" ofta är 64 byte (eller 128).
Prefetchers är väldigt viktiga för att få in data i snabbare delare av cache för idag har processorer cache i flera nivåer.

Lägg på SIMD, ligger data i arbetsminne fungerar de inte, data måste in i cache för att dra nytta av SIMD instruktioner.

Allt detta gör att en utvecklare som optimerar något viktigt i ett program kan få dramatiskt förbättrad prestanda.

10x är inte så konstigt som det låter när man lägger på de här lagren med olika optimeringar. Men det är en okänd värld för de som vägrar att ta i pekare (adresser).

Får se om jag fattat det hela korrekt? Dina argument här består av

  • För 30 år sedan var GC inte snabbt. Om du inte har uppdaterat dig sedan dess är det kanske du som hör hemma på ålderdomshemmet, inte språk som har GC.

  • Cache är viktigt. Detta är sant, både med och utan GC. Bookkeeping för GC:n kommer öka cache-trycket lite grann, men i het kod kommer dessa data snabbt ersättas av det data man jobbar med.

  • I C++ kan stoppa in flera olika saker i 32-bits element. Kan man inte det i andra språk? Go kanske inte har stöd för bitfields, men de är bara syntaktiskt socker för shiftar och maskningar.

  • Ett objekt som är 64 bytes stort passar i en cache line, medan ett 72 bytes stort objekt inte gör det. Vad har det med GC att göra?

  • Prefetchers är viktiga för att få in data snabbare i cachen. Ja visst! Låt mig återigen fråga om du tänker på software eller hardware prefetching? Och varför skulle ett språk utan GC utnyttja prefetchers bättre? Vänligen förklara detta i termer någon med lång erfarenhet som mjukvaruutvecklare (i C++!) förväntas förstå. Bara teknik, inga liknelser eller andra utvikningar. Vi förstår en teknisk förklaring.

  • SIMD. Vad har SIMD, med GC att göra? Är det bara C++-kompilatorer som kan generera SIMD-instruktioner?

  • Optimeringar. Om man bryr sig när man skriver sitt program kan det gå fortare. Helt korrekt. Kan man inte bry sig om man skriver i annat språk än C++?

Jag kan inte se att något av dessa argument innehåller något som är unikt för C++ och skulle motivera en 10X uppsnabbning jämfört med optimerade program skrivna i ett annat språk, bara för att detta språk kör en minnesmodell med GC. Men du får hemskt gärna förklara för mig varför prefetching inte fungerar när man har GC.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Jag kan inte se att något av dessa argument innehåller något som är unikt för C++ och skulle motivera en 10X uppsnabbning jämfört med optimerade program skrivna i ett annat språk, bara för att detta språk kör en minnesmodell med GC.

Unikt för C++ är det inte utan vad det handlar om är att kontrollera minnet.

Skrivet av Ingetledigtnamn:

Men du får hemskt gärna förklara för mig varför prefetching inte fungerar när man har GC.

Gå till någon av alla AI sökmotorer istället och fråga, det här är så vanligt så jag tror inte det är speciellt svårt att lära sig. Jag tror inte du skulle lyssna på vad jag skriver om det.

Permalänk
Medlem
Skrivet av klk:

Gå till någon av alla AI sökmotorer istället och fråga, det här är så vanligt så jag tror inte det är speciellt svårt att lära sig. Jag tror inte du skulle lyssna på vad jag skriver om det.

Ingen vettig människa litar på svar från en AI. De kan vara korrekta, men de kan också vara fyllda med felaktigheter.

Permalänk
Medlem
Skrivet av Erik_T:

Ingen vettig människa litar på svar från en AI. De kan vara korrekta, men de kan också vara fyllda med felaktigheter.

Ok, men vederbörande litar inte på mig heller

Permalänk
Medlem
Skrivet av klk:

Gå till någon av alla AI sökmotorer istället och fråga, det här är så vanligt så jag tror inte det är speciellt svårt att lära sig. Jag tror inte du skulle lyssna på vad jag skriver om det.

Läser du något av svaren?

Det finns multipla prefetchers och han frågade dig vilken du syftar på. En AI-sökmotor kan inte läsa dina tankar så svara istället.

Permalänk
Medlem
Skrivet av orp:

Läser du något av svaren?

Det finns multipla prefetchers och han frågade dig vilken du syftar på. En AI-sökmotor kan inte läsa dina tankar så svara istället.

Klart jag läser svaren men jag orkar inte förklara tekniska detaljer, speciellt inte när ingen har för avsikt att lyssna.

Att läsa på om begreppet prefetching är inte svårt. Är AI ett dåligt förslag från mig så finns många andra sätt.
Har man lärt sig om prefetching vilket inte alls är svårt så förstår man också hardware preftching eller om programmeraren lägger in instruktioner i koden för att "prefetcha" data.

Det är inte hur data prefetchas som är det viktiga utan det är att skriva kod på ett sätt så att detta blir så smidigt som möjligt

Permalänk
Medlem
Skrivet av klk:

Ok, men vederbörande litar inte på mig heller

Så du ger ett missledande svar och trollar istället för att svara på frågorna...

Permalänk
Medlem

Börjar mer och mer tro att @klk lägger in hela tråden i chatgpt och instruerar den med ”skriv ett svar som är vagt relaterat till ämnet, men se till att det är motsägande till allt och mestadels består av anekdoter”

Permalänk
Medlem
Skrivet av martengooz:

Börjar mer och mer tro att @klk lägger in hela tråden i chatgpt och instruerar den med ”skriv ett svar som är vagt relaterat till ämnet, men se till att det är motsägande till allt och mestadels består av anekdoter”

Så kanske det eller så är det en del andra som läser för det jag skriver och för de som lyssnar är viktigt och bra och kunna om man skall få jobb. Inbillar mig att det är en del yngre här på sajten

Permalänk
Medlem
Skrivet av klk:

Så kanske det eller så är det en del andra som läser för det jag skriver och för de som lyssnar är viktigt och bra och kunna om man skall få jobb. Inbillar mig att det är en del yngre här på sajten

Yngre kommer garanterat inte få jobb om dom läser dina svar. Det kommer ta stopp för de yngre om dom ens anammar dina åsikter gällande kvalitetssäkring. Om yngres skulle plocka upp dina åsikter om att:
- envisas med uppfinna hjulet på nytt
- kodstil med 120 kolumners indentering på asserts
- envisades med att pilla på minne när det inte behövs
- åsikter om att kod inte ska vara läsbar utan scan-bar
- egna definitioner av deklarativ/imperativ, regressionstestning osv
- tro att man är någon övermänniska för att man kodar C++
- tro att andra utvecklare är mindre värdiga för att man inte kodar C++

... allt det kommer få yngre till att inte ens överleva en provanställning.

Permalänk
Medlem
Skrivet av orp:

Yngre kommer garanterat inte få jobb om dom läser dina svar.

Har faktiskt fixat (tipsat om personer) jobb åt en hel del och de har inga låga löner idag.

Permalänk
Medlem
Skrivet av klk:

Så kanske det eller så är det en del andra som läser för det jag skriver och för de som lyssnar är viktigt och bra och kunna om man skall få jobb. Inbillar mig att det är en del yngre här på sajten

Det får mig också att undra. Vad är det du vill att unga utvecklare ska ta med sig ifrån denna tråden som du har sagt? :S

Permalänk
Medlem
Skrivet av klk:

Har faktiskt fixat (tipsat om personer) jobb åt en hel del och de har inga låga löner idag.

Att sätt arbetsgivare och arbetstagare i kommunikation är inte samma som att vara mentor till blivande utvecklare och ge dom dina åsikter från denna tråden som "tips".

Du har ju själv medgivit att du skulle undanhålla dina åsikter på en arbetsintervju pga att dom går emot industristandarder.

Permalänk
Medlem
Skrivet av orp:

Det får mig också att undra. Vad är det du vill att unga utvecklare ska ta med sig ifrån denna tråden som du har sagt? :S

Fokus på att förstå vad en dator är, förstå tekniken och vad programmering handlar om. Varför det behövs programmerare för att få ut något vettigt av datorn.

Att bli duktig på olika bibliotek har varit bra under en hel del år med det tror jag är historia. Vad som kommer efterfrågas igen är duktiga programmerare.

Permalänk
Medlem
Skrivet av orp:

Du har ju själv medgivit att du skulle undanhålla dina åsikter på en arbetsintervju pga att dom går emot industristandarder.

Ja om man inte snabbt kan känna av vem man pratar med. Är intervjuaren tekniskt duktig kan det vara en fördel att gå emot industristandarder om man också kan motivera. Få som intervjuar är tekniskt duktiga

Att våga sticka ut skapar möjligheter för att visa att man kan

Permalänk
Skrivet av klk:

Gå till någon av alla AI sökmotorer istället och fråga, det här är så vanligt så jag tror inte det är speciellt svårt att lära sig. Jag tror inte du skulle lyssna på vad jag skriver om det.

Du missförstår mig. Visst är jag intresserad av att lära mig mer, men i detta fall vill jag veta vad du baserar ditt uttalande på. Jag hävdar att det är 100% nötboskapsexkrement att prefetch inte skulle fungera för att språket har GC.

Hela idén består i att programmeraren/kompilatorn/CPUn identifierar accessmönster där adresserna har ett linjärberoende: y = k*x + m (m = basadress + eventuellt offset, k = stride * accesstorlek). Det är typiskt tillämpbart i loopar med förutsägbara array-accesser, typ a[i] eller a[i * x]. I mjukvara kan man börja prefetcha redan i första iterationen av en loop. Görs prefetchingen av hårdvara tar det ett antal iterationer innan CPUn identifierar linjärberoendet och börjar prefetcha data till efterföljande iterationer. Är vi överens så långt?

Varför skulle detta sluta fungera för att språket har GC?

Om vi skulle råka köra GC mitt i en het loop där hardware prefetching är aktiv (vilket i sig är osannolikt), då kommer prefetchern tappa all kontext eftersom vi börja köra annan kod med andra accessmönster, men när GCn är klar och vi återvänder till loopen kommer hardware prefetchern återigen upptäcka accessmönstrens linjärberoende och prefetcha data från kommande iterationer. Låter detta rimligt? Detta kommer ske oavsett om GC har flyttat de använda arrayer eller inte. Du kommer få ett antal iterationer när HW prefetching inte är aktiv, men det är inte så att det slutar fungera.

Skrivet av klk:

Det är inte hur data prefetchas som är det viktiga utan det är att skriva kod på ett sätt så att detta blir så smidigt som möjligt

Precis. Nyckelordet här är "kod" och inte C++. Som du själv sagt så är det enda som körs maskinkodsinstruktioner. CPUn kan inte veta om koden kommer från ett språk med GC och stänga av prefetching.

Om du fortfarande hävdar att prefetching inte fungerar om språket har GC får du allt komma med ett par riktigt bra argument till varför det inte fungerar.

Permalänk
Datavetare

Bjarne har klargjort lite mer vad han anser är rätt väg framåt för att minska säkerhetsproblemen i C++
https://www.infoworld.com/article/3839386/c-plus-plus-founder...

"According to Stroustrup, profiles are essential to the language’s future, will not break existing code, and will not prevent a favorite new feature. They also are part of a long tradition of C++ evolution. He advised support for initial profiles in C++ 26, and warned against incompatible, ad hoc restrictions as the alternative."

Lite mer utbroderat vad profiler betyder
https://herbsutter.com/2024/03/11/safety-in-context/

Som jag förstår det kan man välja att följa en profil, det blir då lite som att sätta "treat warnings as errors" där en profil kan göras så att saker som normalt är tillåtet i standard C++, men som idag anses vara "bad practice" genererar kompileringsfel (men ska vara möjligt att opt-out vid behov).

Lite exempel från C++ Core Guidelies (som m.h.a. clang-tidy redan idag kan fungera som jag fattar profiler kommer göra framåt)

Några axpol på "do"

  • Use RAII for resource cleanup

  • Prefer std::vector, std::string over raw arrays

  • Avoid raw pointers, prefer std::unique_ptr or std::shared_ptr

och "don't"

  • Avoid goto

  • Avoid manual memory management (new / delete)

  • Avoid volatile for multithreading—use std::atomic instead (den här är lite mysko givet att det förra är en direkt bug, inte abra "bad practice")

Bjarne verkar väldigt emot något som skulle kräva att man pajar bakåt kompatibilitet

"Demands for memory safety are not unreasonable, he said. “Profiles provide a unifying framework that allows the C++ community to address safety challenges without compromising C++’s core strengths,” Stroustrup said."

Blir därför väldigt spännande att följa utvecklingen av TrapC som har en del "breaking changes" från C, men som tack vare dessa resulterar i kod som ser väldigt mycket ut som "vanlig C" och ändå innehåller de egenskaper Bjarne försöker uppnå med profiler (och som Safe C++ försöker uppnå med att begränsa språket till en säker delmängd + några extra nya features).

Bjarne är övertygad utfallet kommer bli att C++ blir allt mer övergivet om man INTE agerar

"“The sky isn’t falling, but unless we act now and get C++ onto a track supporting a flexible framework of profiles (supporting various forms of safety), we risk a painful decline,”"

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Datavetare
Skrivet av klk:

Allt som körs i en processor är maskinkod ja, en processor förstår inget annat än maskinkod.

Programmering handlar om att abstrahera funktionalitet, gör den så enkel som möjligt så vem som helst kan dra nytta av en dators hastighet och exakthet. Detta är vad programmering är, alltid varit.
Vanlig teknik då är att abstrahera så mycket att man inte ens behöver kunna programmera för att göra saker med en dator eller till enklare språk.
C# och LUA är vanligt. C# är vanligt för det backas av Microsoft, då finns det gott om utvecklare. LUA för dess kombination av enkelhet och snabbhet.

Kan garantera att dessa detaljer inte är skrivna i C# om det är som du påstår, en bra spelmotor.

C har aldrig och kommer aldrig levereras med ett gigantiskt runtime bibliotek. Det skall väldigt mycket till för man lägger till delar i C standarden och det är inget dåligt, det är bra. C väljs inte för att få saker "gratis"

Det finns inga fördelar med en GC och trådar, du är ute och cyklar.
Enda fördelen är för de som inte kan programmera trådat vilket är de allra flesta för det är bl.a det svåraste man kan göra.

Om man skall anställa utvecklare och får trådad exempelkod av någon av de man funderar på att anställa och vet att personen gjort den. Då borde kandidatens aktier öka dramatiskt till anställning om de är ute efter kompetenta utvecklare.

Hantera minne räknas som bekant som svårt (denna tråden bevisar det om inte annat). Minne är mycket viktigare i trådade lösningar. Där måste man oavsett om man använder pekare eller inte veta exakt hur data bearbetas.
Vet inte utvecklare det så kan de få mardrömsbuggar som kan bränna ut vem som helst.

Hade lätt tagit 20 vanliga buggar mot en knepig bugg i trådad kod.

Ett bevis för hur svårt det är att titta på webservrar och hur många lösningar det finns med web servrar som är stateless. De är detta för att det är för svårt att hantera en trådad server som har koll på användare.
Fördelarna med att utveckla en webserverlösning där servern vet om användare är mycket stora men ändå görs det inte och det beror just på svårigheten att hantera data kopplat till massa användare i trådad miljö.

Vi gör den här kort: läs "art of multiprocessor programming" och fundera om något du skrivit i just det ämnet i denna tråd är ens i närheten korrekt.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Om du fortfarande hävdar att prefetching inte fungerar om språket har GC får du allt komma med ett par riktigt bra argument till varför det inte fungerar.

Jag har inte hävdat det, vad jag hävdat är att det är viktigt att en programmerare känner till hur man få upp hastighet på en processor. Det vet inte programmerare som använder språk med GD, de litar på att språket gör jobbet åt dem.

Kompilatorer och språk kan göra mycket men förstår inte utvecklaren så kan de inte trolla.

Permalänk
Medlem
Skrivet av Yoshman:

Vi gör den här kort: läs "art of multiprocessor programming" och fundera om något du skrivit i just det ämnet i denna tråd är ens i närheten korrekt.

Det är bättre du går in i det här repot med jsonsimd, där hittar du mycket roligt sett till optimerad kod
https://github.com/simdjson/simdjson

Ta gärna en diskussion med programmerarna där och berätta för dem att de kan göra koden bättre i Rust så får du se vad som händer

Permalänk
Skrivet av klk:

Att bli duktig på olika bibliotek har varit bra under en hel del år med det tror jag är historia. Vad som kommer efterfrågas igen är duktiga programmerare.

Jag ser inget motsatsförhållande här.

Att kunna sina standardbibliotek tycker jag är en viktig del av att vara en duktig programmerare. Koden däri är typiskt vältestad och effektiv. Att själv sitta och skriva kod som gör samma sak är bara slöseri med tid. Inte nog med det, att använda standardbiblioteket signalerar även intent på ett helt annat sätt än din hemknåpade kod. Används funktionalitet ur standardbiblioteken är sannolikheten att folk direkt förstår vad koden gör mycket större än om man måste läsa implementationen av funktionen som anropas.

Jag förundras varje år över folk i Advent Of Code-tråden som skriver sida upp och sida ner med kod för att göra saker som finns färdiga i Pythons standardbibliotek.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Jag ser inget motsatsförhållande här.

Det behöver inte vara det men enligt mig bör utvecklare snarare fokusera på att bedöma bibliotek än att bli bra på dem, förstå vad de skall titta efter. Att lära sig bibliotek är kontraproduktivt på det viset att om man skriver smart kod mot ett icke standardiserad bibliotek måste andra programmerare också lära sig biblioteket för att förstå koden.

De programmerare som inte förstår sådant är livsfarliga. Exempelvis så odokumenterad python kod är bland det svåraste som finns att hantera just på grund av att allt finns i programmerarens huvud som skrev koden. Det går inte för andra utvecklare att hänga med.

Skrivs deklarativ kod som använder mycket bibliotek bör det vara mer dokumentation än kod eller så är koden väldigt enkel att förstå och då menar jag enkel.

Permalänk
Medlem
Skrivet av klk:

Exempelvis så odokumenterad python kod är bland det svåraste som finns att hantera just på grund av att allt finns i programmerarens huvud som skrev koden. Det går inte för andra utvecklare att hänga med.

Byt ut "python" mot "C++", så blir det mer korrekt.

Permalänk
Skrivet av klk:

Jag har inte hävdat det, vad jag hävdat är att det är viktigt att en programmerare känner till hur man få upp hastighet på en processor. Det vet inte programmerare som använder språk med GD, de litar på att språket gör jobbet åt dem.

Ok, då kanske jag misstolkat det hela, men...

När jag ifrågasatte att saker och ting skulle gå 10X snabbare om de skrevs i C++ istället för ett språk med GC:

Skrivet av Ingetledigtnamn:

Nu skriver du prefetch igen. Pratar du om software prefetch eller hardware prefetch? Software är helt och hållet en fråga för kompilatorn så där tror jag inte att GC blockar användandet av prefetch-instruktioner. Hardware prefetch är baserat på att CPUn hittar någon form av regularitet i accessmönstren, dvs loopar över arrayer. På vilket sätt skulle loopen bli annorlunda för att språket har GC? GC kommer typiskt gå i samband med att man allokerar nytt minne, och gör du det förstör du för prefetchern även om du gör det i C++. Kan du utveckla på vilket sätt GC är skadligt för hardware prefetching?

I svaret på det står det:

Skrivet av klk:

Orsaken till varför C++ (att kontrollerat minnet) är så mycket snabbare är:
...
Prefetchers är väldigt viktiga för att få in data i snabbare delare av cache för idag har processorer cache i flera nivåer.

Jag läser detta som att prefetch funkar i C++ och om C++ skall ha någon fördel av detta så implicerar det ju rimligen att det inte funkar för de språk vi jämförde med. Right?

När jag avfärdade dina argument skrev jag:

Skrivet av Ingetledigtnamn:
  • Prefetchers är viktiga för att få in data snabbare i cachen. Ja visst! Låt mig återigen fråga om du tänker på software eller hardware prefetching? Och varför skulle ett språk utan GC utnyttja prefetchers bättre?

...
Men du får hemskt gärna förklara för mig varför prefetching inte fungerar när man har GC.

kontrade du med:

Skrivet av klk:

Gå till någon av alla AI sökmotorer istället och fråga, det här är så vanligt så jag tror inte det är speciellt svårt att lära sig. Jag tror inte du skulle lyssna på vad jag skriver om det.

Hade det inte varit en bra idé att redan här påpeka att du inte hade sagt det jag trodde att du sagt? Det var väl ingen tvekan om att jag fått det runt bakfoten?

Permalänk
Medlem
Skrivet av Erik_T:

Byt ut "python" mot "C++", så blir det mer korrekt.

Det blir det inte Och det är en mycket enkel förklaring. Du kan inte debugga och granska bibliotek i python, det är en svart låda du måste lära dig hur den fungerar. Dessutom är möjligheterna till att förstå variabler inte alls så som normalt skrivs i språk som C++ eller C.

Det går för vem som helst att räkna ut ovanstående

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Jag läser detta som att prefetch funkar i C++ och om C++ skall ha någon fördel av detta så implicerar det ju rimligen att det inte funkar för de språk vi jämförde med. Right?

Aha ok, nej det var inte så jag menade. Självklart fungerar en CPU på samma sätt oavsett om koden är kompilerad från C++ eller om den är kompilerad C#.
Det jag menade med prefetchers är att om man vet hur tekniken fungerar så kan man skriva kod för att optimera för prefetchers. Vet man inte hur dessa fungerar så självklart kommer prefetchers jobba med kompilerad C# kod men koden är inte lika smidig.

Om jag tar följande exempel (tog hjälp av AI för att generera koden)

typedef struct { uint64_t m_uValue1; // 8 bytes uint64_t m_uValue2; // 8 bytes uint8_t m_pubuffer[16]; // 16 bytes // Total: 32 bytes (well-aligned for most cache lines) } CacheFriendlyStruct;

Om man inte vet hur en cache fungerar är ovanstående struct något kryptisk, men vet man så är den logisk.
Nu menar jag inte att ovanstående inte går att göra i C#, du kan göra samma sak där även om jag tror det är ovanligt att se denna typ av lösning i C#.

Så vad händer om man också måste klara av att lagra värden i buffern som är större än 16 bytes. Hade C# skrivits hade structen troligen fått anpassats efter värsta möjliga fall även om det skulle vara sällsynt.
i C däremot så bli inte förvånad över att se kluriga lösningar för för att lösa större värden utan att structen behöver mer minne.

Permalänk
Medlem
Skrivet av klk:

Det blir det inte Och det är en mycket enkel förklaring. Du kan inte debugga och granska bibliotek i python, det är en svart låda du måste lära dig hur den fungerar. Dessutom är möjligheterna till att förstå variabler inte alls så som normalt skrivs i språk som C++ eller C.

Du kan normalt inte debugga och granska bibliotek i C eller C++ eller [valfritt språk] heller. De är svarta lådor du måste lära dig hur de fungerar.
Men lyckligtvis behöver man oftast inte känna till hur bibliotek är skrivna - det finns dokumentation om hur de används, vilket är vad man behöver.

Variabler är variabler. De är inte svårare att förstå i Python än i andra språk.