mboost-dp1

SXC - clix

Funktionel programmering er velegnet til multicore-systemer

- Via Version2 - , redigeret af Avenger- , indsendt af arne_v

Blandt de mere udbredte programmeringssprog, som f.eks. C#, C++ og Java, har man en fælles udfordring; at udnytte antallet af kerner i moderne processorer, som blot vokser og vokser.

Hos Datalogisk Institut på Københavns Universitet (DIKU) mener den nyudnævnte professor i programmeringssprog og -systemer, Fritz Henglein, at en af løsningerne er en gammel måde at tænke på inden for datalogi, nemlig funktionsorienteret programmering. Det skriver Version 2.

Ved denne programmeringsmetode, der har rødder tilbage til 1930, er der mere fokus på problemet, der skal løses, end hvordan det bliver løst. Blandt funktionsorienterede programmeringssprog finder man Erlang og Haskell, men også F# og Scala fungerer efter den metode.

Ifølge Henglein vil det gøre det nemmere for programmøren på sigt at anvende sådanne sprog, når der skal laves kode, som kan udnytte mange kerner. Han er dog godt klar over, at det ikke er et skifte, som sker lige med det samme, men vil tage mange år.





Gå til bund
Gravatar #1 - hyænen
7. mar. 2011 13:54
In before Windcape og zin med deres "DET HAR JEG DA VIDST MEGA LÆNGE!!!"
Gravatar #2 - Mamad (moveax1ret)
7. mar. 2011 13:58
Jeg har aldrigt helt forstået hvorfor folk mener det er så svært at lave multicore udvikling?

Altså...det er da ikke nemt, men det er der da så mange ting der ikke er?

Har i andre kodere meget svært ved det?

Gravatar #3 - ty
7. mar. 2011 13:59
hyænen (1) skrev:
In before Windcape og zin med deres "DET HAR JEG DA VIDST MEGA LÆNGE!!!"


Hvem tror du da, han har fået ideen fra?
Gravatar #4 - Windcape
7. mar. 2011 14:00
Skiftet er blevet betydeligt mindre eftersom at LINQ tilbyder funktionel programming og funktionelle tankegange direkte i C#, på en naturlig måde, som hurtig højner ens produktivitet, og sikre bedre kode, som er nemmere at vedligeholde.

Det er specielt higher-order functions som f.eks. map og reduce som gør arbejdet nemt i alm. programmeringsituationer.

Dertil kommer så at programmøren begynder at tænke i mere funktionelle baner, og prøver at opnå immutability hvor det er muligt (også selvom sprogene ikke understøtter det)
Gravatar #5 - Windcape
7. mar. 2011 14:02
moveax1ret (2) skrev:
Har i andre kodere meget svært ved det?
Paradigme skift er altid svære. Skiftet fra procedural programmering til OOP var svært.

Ligeledes er tankegangen om at du ikke må have et mutable state, fordi det derfor ikke (umiddelbart) kan paralleliseres, ikke helt nem for den alm. programmør, som er vant til at have både public og private fields, som alle er mutable.

Gravatar #6 - Lobais
7. mar. 2011 14:02
#2 Chipproducenterne vil gerne leve videre på Moore's bølge. Det kan de kun, hvis udviklerne skriver programmer, der rent faktisk udnytter multiprocessing.
Om det er nemt eller ej er sekundært til det problem, at få programmer i dag skrives, så de udnytter mere en halvdelen af computerens kraft.
Gravatar #7 - Mamad (moveax1ret)
7. mar. 2011 14:05
#5

Jeg mente nu om i har svært ved f.eks. at lave en multithreaded web server der deler noget data mellem processer/threads og så lave noget synkronisering?

I whatever sprog i bruger nu.
Gravatar #8 - Windcape
7. mar. 2011 14:06
#6

Du kan godt parallelisere et ikke-funktionelt program. Det er bare meget mere besværligt, og du risikere at skulle debugge side effects.
Gravatar #9 - Windcape
7. mar. 2011 14:07
#7

Hele ideen er jo at du ikke skal synkronisere, da du ikke arbejder med et mutable state.

Men eventuelt vil paralliseringen blive abstraheret væk, som f.eks. i Microsofts Task Parallel Library (TPL) til .NET.

(Som også virker i F#)
Gravatar #10 - Mamad (moveax1ret)
7. mar. 2011 14:09
jamen nu snakker jeg jo ikke om funktionelle sprog- mit spørgsmål er: har i svært ved at kode til multi processors lige nu i c#, java, c++ whatever?
Gravatar #11 - Windcape
7. mar. 2011 14:10
#10

Se mit wikipedia link on side-effects. Derudover kan du godt kode funktionelt i C# (Men ikke i Java og C++)
Gravatar #12 - Mamad (moveax1ret)
7. mar. 2011 14:12
ja, det ved jeg da udmærket godt- jeg sidder faktisk netop lige nu og koder en multithreaded/process applikation i c++.

jeg spørger- nu for tredje gang: HAR DU SVÆRT VED DET SOM DET ER NU????
Gravatar #13 - Windcape
7. mar. 2011 14:12
Derudover har funktionelle sprog jo forskellige features, som ikke nødvendigvis er et krav for at arbejde funktionelt, men giver fordele i typiske matematisk operationer, eller tunge algoritmer.

Det er f.eks. sådan at head::tail call i F# kan gøres simpelt på få linjers kode (3-4), som er let læsbart, hvor i C# kræver det mange (15-25), og er meget mindre læsbart.

Og så er der funktionalitet som pattern-matching og method pipiing, samt monads (Haskell)
Gravatar #14 - Windcape
7. mar. 2011 14:14
moveax1ret (12) skrev:
jeg spørger- nu for tredje gang: HAR DU SVÆRT VED DET SOM DET ER NU????
Det kan matematiks bevises at fejlraten er større når du arbejder med mutable state, pga. side-effects.

Derfor må svaret jo være "ja". Da flere fejl nødvendigvis gør udviklingsprocessen sværere.

Det er derudover meget nemmere at implementere en paralleliseret process i funktionelle sprog, end i alm. imperative sprog.

At det godt kan lade sig gøre, betyder jo ikke at det er optimalt! Hvis alle tænkte sådan, arbejde vi stadigvæk i ASM eller COBOL.
Gravatar #15 - Mamad (moveax1ret)
7. mar. 2011 14:17
nu har jeg ikke prøvet funktionelle sprog- men hvis jeg nu bruger const for at undgå sideeffects, og ikke bruger globale variabler opnår jeg ikke så ca. det samme?

(c++0x)
Gravatar #16 - Windcape
7. mar. 2011 14:20
#15

Hvis du programmere alle dine funktioner som higher-order functions, og ikke bruger mutable datatypes (pointers), og ligeledes kun bruger konstante værdier, og ingen class fields, opnår du cirka det samme.

Men hvis du forsøger at bilde mig ind du koder C++ uden pointers, så har jeg svært ved at tro på dig ;-)

Tænk på det som at *alting* *altid* skal "pass by value", og *alle* methoder har en værdi-type som return-type (altså ingen void!)
Gravatar #17 - Mamad (moveax1ret)
7. mar. 2011 14:22
det er ikke meget galt :) har du hørt om referencer?
Og hvis det så er at jeg skal interface til noget c bruger jeg shared_ptr eller auto_ptr

men, referencer tillader jo også at man kan ændre dataen, så det er lidt ordkløveri, men så kommer const jo ind i billedet :)
Gravatar #18 - Windcape
7. mar. 2011 14:22
Svært er desuden et abstrakt begreb. Hvis vi definere Haskell som svært, så er alting let!
Gravatar #19 - Windcape
7. mar. 2011 14:22
moveax1ret (17) skrev:
har du hørt om referencer?
Referencer bruges ikke i higher-order functions!
Gravatar #20 - Windcape
7. mar. 2011 14:26
Nå, der er vist et par sure pingviner på spil i karma-systemet i dag :-)
Gravatar #21 - Bllets
7. mar. 2011 14:37
"Super karma bruger" to the rescue! Neutral og ok er ingenting ift. SUPER brugerne!

Gravatar #22 - Windcape
7. mar. 2011 14:40
Jeg har desuden en stående udfordring med en F# programmør om en implementation af dijkstra, ud fra en C# implementation skrevet af mig.

Ideen er at se hvilket sprog og paradigm der løser problematikken mest elegant og læsbart.
Gravatar #23 - BrianVinter
7. mar. 2011 15:47
@#7
Nu er der ret stor forskel på banal grovkornet parallelitet, som fx en webserver og så faktisk speedup hvor fx en ligningsløser skal paralleliseres over mange kerner samtidigt med at man tager hensyn til cache lokalitet:)
Gravatar #24 - jens426
7. mar. 2011 16:22
Jeg har studeret datalogi.
jeg har haft funktionel programmerings kurserne.

Dette er ikke en nyhed, alle der har haft disse kurser ved at det er en god måde for paralisering..

Kort forklaret hvad funktionel programmering er, tænk rekursiv, det er en meget god metode at anvende til f.eks. parser og andre ting der kræver rekursiv tænkning.

Hvis det ikke lige præsis er for disse problemer der hvor funktionel programmering er god, så er det noget være lort.

Glem alt om løkker (loop) while repeat. Det skal gøres rekrusivt.
god fornøjelse med at debugge en rekrusive funktion, hahaha eller for den sagts skyld at læse kode og forstå hvad der sker.

Gravatar #25 - Ildhesten
7. mar. 2011 16:41
#24 Hvis du tænker lidt nærmere over det, så giver det ikke særligt meget mening at debugge i traditionel forstand hvis man arbejder i et rent funktionelt sprog.

Hvad er det man laver når man debugger i et imperativt sprog? Man stepper igennem sin kode trin for trin, og ser hvornår programmet kommer i en ugyldig tilstand. Men da tilstand er fraværende i et rent funktionelt sprog, er alt hvad du har brug for at analysere, et trace af kaldet til den funktion som ikke opfører sig som forventet.
Gravatar #26 - jens426
7. mar. 2011 17:38
ildhesten skrev:
Hvad er det man laver når man debugger i et imperativt sprog? Man stepper igennem sin kode trin for trin, og ser hvornår programmet kommer i en ugyldig tilstand. Men da tilstand er fraværende i et rent funktionelt sprog, er alt hvad du har brug for at analysere, et trace af kaldet til den funktion som ikke opfører sig som forventet.


arrr jeg må indrømme når du nu skriver det så har du ret.

en småkage til dig.

Men jeg vil stadig påstå at finde fejl i et funktionel sprog ikke er sjov, ikke fordi det er sjoverede i et imprerativ sprog, men recrusive funktioner stinker når det kommer til at finde fejl i dem.




Gravatar #27 - Mamad (moveax1ret)
7. mar. 2011 17:42
for at forstå rekursivitet skal du først forstå rekursivitet
Gravatar #28 - Regus
7. mar. 2011 18:54
#moveax1ret

Hvis du ikke synes OOP udvikling til multicore er svært... then you ain't doing it right...

Jeg har arbejdet meget med det - og hvis du vil udnytte mere end bare et par kerner bare nogenlunde effektivt så skal man altså have gang i de små grå, og en meget stor procentdel af de apps der bliver lavet virker mere ved tilfælde end noget andet.

Det letteste du kan lave er en server hvor du har mindst lige så mange bruger-requests som du har kerner og hvor du bruger et datastore (f.eks. en database) hvor nogen med fedtede briller har løst problemerne for dig. Det svære i server apps ligger andre steder, f.eks. når man vil kunne håndtere 10.000 concurrent users uden at bruge 90% af sine ressourcer på tråd-schedulering...
Gravatar #29 - Mamad (moveax1ret)
7. mar. 2011 19:15
#28

nu foregår det heller ikke med OOP, men med pthreads/winapi og c, og jeg skulle mene jeg klarer mig ok.

og angående db backend har jeg prøvet at bruge inmem db i sqlite til det, men jeg kan klare det bedre selv.
Gravatar #30 - onetreehell
7. mar. 2011 20:15
Windcape (13) skrev:
Det er f.eks. sådan at head::tail call i F# kan gøres simpelt på få linjers kode (3-4), som er let læsbart, hvor i C# kræver det mange (15-25), og er meget mindre læsbart.


Jeg forstår ikke hvad du mener med head::tail call... Det lyder som noget værre nonsense. "::"-operatoren bruges til at putte 'head' på listen 'tail'. Her er noget OCaml (ikke OCalm ffs!).
[code}
# 1::[2; 3];;
- : int list = [1; 2; 3]
[/code]

Generelt lyder det som om du ikke har styr på noget/særligt meget af det du siger.

EDIT: btw du skrevet 13/30 posts. >.<

#2
Jeg synes ikke det er svært. Der er bare meget man skal holde styr på, nogle gange, og man skal tænke sig godt om.

Jeg har nogle gange haft problemer med koordinering når programmet får ekstern input to forskellige steder og de ikke skal behandle det på samme tid, men man kan ikke stoppe dem midt i behandlingen (da det skal være atomisk). Men det er nok mere fordi jeg prøver at parallelisere noget der egentlig ikke kan paralleliseres :)
Gravatar #31 - markjensen
7. mar. 2011 21:11
onetreehill: Jeg tror det windcape mener er at pattern matche en liste og dens hoved med x::xs, men det er muligt at jeg tager fejl.
Gravatar #32 - snemarch
8. mar. 2011 08:23
moveax1ret (2) skrev:
Jeg har aldrigt helt forstået hvorfor folk mener det er så svært at lave multicore udvikling?

Altså...det er da ikke nemt, men det er der da så mange ting der ikke er?

Har i andre kodere meget svært ved det?
Definér "svært"?

Svært ved at få koden til at køre fejlfrit?
Svært ved at debugge når koden IKKE kører fejlfrit?
Svært ved at skalere lineært (eller superlineært - det KAN gøres for visse problemer)?

Personligt vil jeg svare ja til punkt #2 og #3, når vi ser videre end trivielle problemer.

State kan ikke universelt undgås, og parallelisering er ikke kun interessant for ren talknusningskode... men der er bestemt en rigtigt god pointe i at undgå shared state som pesten, og dén lektie fra de funktionelle sprog kan direkte adopteres i såvel OOP som procedural kodning :)
Gravatar #33 - Mamad (moveax1ret)
8. mar. 2011 10:04
#32>>> Ja, alle de ting- og med simulering af kæmpe workload, og profilering af koden.
Det er da ikke nemt- men når man har forstået hvad tingene går ud på- er det blot endnu en af de besværlige ting.
Men så sandeligt ikke noget jeg umiddelbart vil lære en nyt programmerings paradigme for at slippe for at tænke på.
Faktisk gyser jeg lidt ved tanken om at abstrahere væk fra hvad der egenligt foregår.
Gravatar #34 - hyænen
13. mar. 2011 19:26
#22: En implementation af Dijkstra? Styr dig.
Gravatar #35 - arne_v
13. mar. 2011 20:01
#34

Det ville jo være en imponerende præstation indenfor AI. Oplagt Turing Award materiale.

Men vi ved jo nok alle sammen at der er faldet et "algoritme" ud af teksten.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login