Permalänk
Medlem

Dataflow programming

Har hört många klaga på att det är svårt att skapa program för flera processorer men varför inte skippa sekvensiella program och istället börja koda på samma sätt som man kodar hårdvara vilket gör att du kan dra nytta av flera processorer automatiskt.

Finns visst många såna språk om man kollar på wikipedia:

http://en.wikipedia.org/wiki/Dataflow_programming

Har själv kodat i VHDL, som jag personligen gillade lite grann, men jag har bara använt det för att designa hårdvara (FPGA:er) hittills. Skulle vara kul att börja designa mjukvara på det sättet också.

Har iofs inte kodat speciellt mycket mjukvara alls förutom små program, skript (avisynth och matlab är kul) och lite assembler (motorola 68000 var riktigt rolig). Försökte mig på ett lite större projekt i C (samtidigt som jag lärde mig lite OpenGL) men det gick inte så bra. Verkar som hårdvara är det jag kan bäst.

En fördel tycker jag är att man, precis som i hårdvaran, delar upp allt i små moduler med lite I/O mellan sig. Alla moduler (de som är aktiverade iaf) kan köras samtidigt istället som i sekvensiella program där bara en specifik del är aktiv samtidigt.

Visa signatur

AMD Ryzen 5 3600 | 4x8GiB 18-20-16-36-52-2T DDR4-3400 | MSI B450-A Pro Max AGESA 1.2.0.7 | Sapphire RX 480 Nitro+ OC 8GiB | Crucial MX500 500GB | PNY CS900 2TB | Samsung 850 EVO 500GB | Samsung PM961 512GB | Scythe Kamariki 4 450W

Permalänk
Medlem

Med .NET (C#)är det ganska enkelt att koda flera trådar

I ett av mina senaste projekt använde jag det för att fråga frågor mot i 7 databaser (kan bli fler) utspridda i hela landet

Med .Net framework 4.0 blir det även lättare att koda för fler kärnor/processorer.

Visa signatur

Har varit på detta forum på tok för länge...

Permalänk
Hedersmedlem

Det svåra är vanligtvis att hitta på algoritmer som löser komplexa problem utan att parallelliseringshämmande beroenden och liknande uppstår och detta är svårt till och med även om man bortser från detaljer som programmeringsspråk. Ibland har man dock tur; om de problem man försöker lösa till sin natur lätt kan delas upp i många små delproblem (till exempel databastransaktioner eller matrisberäkningar) är det lätt att fördela dessa på godtyckligt många processorer.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Elgot
Det svåra är vanligtvis att hitta på algoritmer som löser komplexa problem utan att parallelliseringshämmande beroenden och liknande uppstår och detta är svårt till och med även om man bortser från detaljer som programmeringsspråk. Ibland har man dock tur; om de problem man försöker lösa till sin natur lätt kan delas upp i många små delproblem (till exempel databastransaktioner eller matrisberäkningar) är det lätt att fördela dessa på godtyckligt många processorer.

Det beror väl på hur man kodar. Om man skulle koda mjukvara likt LabView dvs med olika objekt/moduler med signaler mellan sig så får man parallella beräkningar automatiskt. Eftersom vi troligen går mot allt fler kärnor så måste vi nog överge algoritmer (sekvensiell kod) och koda på ett annat sätt för att överhuvudtaget få ut prestandan. Sen beror det iofs på mängden minnesbandbredd som är ett annat mycket kritiskt problem.

Visa signatur

AMD Ryzen 5 3600 | 4x8GiB 18-20-16-36-52-2T DDR4-3400 | MSI B450-A Pro Max AGESA 1.2.0.7 | Sapphire RX 480 Nitro+ OC 8GiB | Crucial MX500 500GB | PNY CS900 2TB | Samsung 850 EVO 500GB | Samsung PM961 512GB | Scythe Kamariki 4 450W

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av m3tr0
Det beror väl på hur man kodar. Om man skulle koda mjukvara likt LabView dvs med olika objekt/moduler med signaler mellan sig så får man parallella beräkningar automatiskt. Eftersom vi troligen går mot allt fler kärnor så måste vi nog överge algoritmer (sekvensiell kod) och koda på ett annat sätt för att överhuvudtaget få ut prestandan. Sen beror det iofs på mängden minnesbandbredd som är ett annat mycket kritiskt problem.

Frågan är ju om det du vill göra kan delas upp i flera små delproblem, vilket du måste göra om du vill paralellisera. Sen skulle jag nog inte påstå att vi måste lämna algoritmer, eller att algoritmer är uteslutande sekvensiell kod. Det går att skapa paralelliserbara algoritmer också, om problemet tillåter det.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av You
Frågan är ju om det du vill göra kan delas upp i flera små delproblem, vilket du måste göra om du vill paralellisera. Sen skulle jag nog inte påstå att vi måste lämna algoritmer, eller att algoritmer är uteslutande sekvensiell kod. Det går att skapa paralelliserbara algoritmer också, om problemet tillåter det.

Kanske blir så att vi får lära oss att göra vektor algoritmer eller två/tre-dimensionella algoritmer, det kommer nog lösas med tiden då vi får fler och fler kärnor som standard. Eller så kanske det blir att man börjar göra "modulära algoritmer" som kan lösas oberoende av varandra för att sen lösa en helhet?

Visa signatur

"Riktig fakta? kolla ut genom fönstret på snön och all jävlighet där har du riktig fakta, eller de som går där i kylan, idioter, det är riktig fakta" -- Ett fyllo på bussen, ganska trevlig ändå :)

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av shenjin
Kanske blir så att vi får lära oss att göra vektor algoritmer eller två/tre-dimensionella algoritmer, det kommer nog lösas med tiden då vi får fler och fler kärnor som standard. Eller så kanske det blir att man börjar göra "modulära algoritmer" som kan lösas oberoende av varandra för att sen lösa en helhet?

Att göra algoritmer som behandlar vektorer istället för skalärer är ungefär det vi redan kan; det är därför det är så lätt att till exempel parallellisera matrisberäkningar. "Modulära" algoritmer är inte heller något nytt; matematiken har funnits i flera hundra år och folk har funderat på programmeringstillämpningar sedan parallellprogrammering introducerades. Problemet är att inte alla problem är lämpliga. För att återigen dra den gamla liknelsen är det ungefär som att två kvinnor inte kan skapa ett barn dubbelt så fort (inte ens lite fortare) än en; de kan däremot skapa två stycken parallellt.

Permalänk
Medlem

Jag menade mer att göra algoritmerna som vektorer, och de olika "lagrerna" har olika uppgifter, och kan utföras parallellt för att sen gå ihop till en helhet.
Och ja, jag vet att det beror på problemet, det är svårt att göra någonting snabbare som din liknelse med två kvinnor men det kan göras parallellt.
Aja, det ska bli intressant och se vad vi lyckas hitta på i framtiden.

Visa signatur

"Riktig fakta? kolla ut genom fönstret på snön och all jävlighet där har du riktig fakta, eller de som går där i kylan, idioter, det är riktig fakta" -- Ett fyllo på bussen, ganska trevlig ändå :)

Permalänk
Medlem

Visst går det att koda paralellt, finns många paradigmer så som PI calculus och reactive programming för att göra saker mer paralellt. Det stora problemet som det är nu är dock verktyg och "target". I stort sett alla procesorer är instruktionstuggare som utför en instruktions-sekvens relativt sekvensiellt.

Så om man kan ta fram en ny familj av processorer, eller alternativt skriva ett nytt språk liknande vhdl som kompilerar till nuvarande processorer, blir det enklare. Nakdelen med det är att man blir väldigt begränsad och att det inte blir så lätt att lösa "vanliga" programmeringsproblem, eftersom det ofta är olika former av beslutsträd man skriver.

När det gäller numeriska beräkningar på multicore arbetar man ofta med jobs/batches, främst för att det ger bäst kontroll över befintlig hårdvara.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem

Utvecklingskostnader och faktumet att man oftast inte behöver extra datakraft. Man kan oftast dela upp multitrådade program i två kategorier: GUI-baserade som använder multitrådat för att sänka GUI:ets responstid och "tunga" program som använder det för att öka prestandan.

Den första gruppen är mer eller mindre oinstressant medan den senare kan i sig delas upp i två andra delkategorier: Dem som trivialt kan multitrådas och dem som inte kan det.

I den första delgruppen ingår t.ex. videoredigering där varje frame kan skapas (mer eller mindre) oberoende av andra eller kompilering där varje källkodsfil kan kompileras oberoende av andra; ungefär optimala fall av parallellisering.

Det är den andra delgruppen som är problematisk och inga paradigmer i världen kan öppna för parallellisering då det är i algoritmerna/datastrukturerna per sig som är svåra att göra pararella. Okay, ett del-moment kan kanske räknas parallellt men om momentet i sig är "för litet" så händer det ofta att tråd-overheaden blir större än cyklerna man tjänar. Dessutom finns det massor av andra saker att tänka på: Hur stor press det är på minnesbussen/cacharna eller annat (t.ex. om det visar sig vara hårddisken eller nätverket som flaskar ändå)?

"Falsk" parallellisering är också ett typiskt problem. Ta en "light" databas server + client som endast strippar ner funktionaliteten till det enklaste: Mappa ord mot text (typ ordbok).

Spara datat i något klassiskt format som ett binärt träd på servern? Inga problem.

Men vad händer om man vill kunna lägga till fler ord i databasen? Behöver vi skriv-lås för strukturen? Ajdå... alla förfrågor kommer då bottlenecka vid låset och det hela blir de facto sekventiellt. Kanske är finare lås en bättre idé (d.v.s. lås på olika nivåer; kanske en per nod)? Vad blir overheaden? "Revisions"-baserade träd? Hash-table först och sedan träd i varje bucket för att inte allt ska flaska vid rot-noden? Hur ser prestandan ut för dem större mängder cache-missar som uppstår?

Att utveckla "riktiga" multitrådade "tunga" program är oftast mycket svårare än det ser ut.

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Glömsk

Många bra inlägg här. Kan passa på att tipsa om den här föreläsningen som är ganska bra: http://www.youtube.com/watch?v=KfgWmQpzD74

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Psionicist
Många bra inlägg här. Kan passa på att tipsa om den här föreläsningen som är ganska bra: http://www.youtube.com/watch?v=KfgWmQpzD74

Bra länk! Har bara kollat lite i början ännu men ska fortsätta sen.

Intressant ämne tycker jag faktiskt. Parallell programmering blir helt klart en ny utmaning får oss. Och hur ska vi lyckas med att få mer minnesbandbredd?

Visa signatur

AMD Ryzen 5 3600 | 4x8GiB 18-20-16-36-52-2T DDR4-3400 | MSI B450-A Pro Max AGESA 1.2.0.7 | Sapphire RX 480 Nitro+ OC 8GiB | Crucial MX500 500GB | PNY CS900 2TB | Samsung 850 EVO 500GB | Samsung PM961 512GB | Scythe Kamariki 4 450W

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Psionicist
Många bra inlägg här. Kan passa på att tipsa om den här föreläsningen som är ganska bra: http://www.youtube.com/watch?v=KfgWmQpzD74

Testar YouTube-taggen med den videon

Permalänk
Medlem

Dags att liva upp den här tråden igen. Hittade ett litet utvecklingsverktyg kallat Rhope men det är fortfarande i alpha-stadiet och programmen måste köras via Rhope. Intressant projekt iaf.

http://rhope.retrodev.com/

Visa signatur

AMD Ryzen 5 3600 | 4x8GiB 18-20-16-36-52-2T DDR4-3400 | MSI B450-A Pro Max AGESA 1.2.0.7 | Sapphire RX 480 Nitro+ OC 8GiB | Crucial MX500 500GB | PNY CS900 2TB | Samsung 850 EVO 500GB | Samsung PM961 512GB | Scythe Kamariki 4 450W

Permalänk
Medlem
Visa signatur

AMD Ryzen 5 3600 | 4x8GiB 18-20-16-36-52-2T DDR4-3400 | MSI B450-A Pro Max AGESA 1.2.0.7 | Sapphire RX 480 Nitro+ OC 8GiB | Crucial MX500 500GB | PNY CS900 2TB | Samsung 850 EVO 500GB | Samsung PM961 512GB | Scythe Kamariki 4 450W

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av m3tr0
Intressant föreläsning:

http://www.youtube.com/watch?v=F9kpsfQIMUU

Youtube-tagg igen: