Permalänk

Någon som använder Open MP?

Satisfy_openmp är ett logik-test som i orginalet använder 23 logiska enheter och resultatet blir 15 vägar.
Koden finns här:

https://people.sc.fsu.edu/~jburkardt/c_src/satisfy_openmp/sat...

För att se om det fungera för alla trådar kan man köra så här (upp till 16 trådar)

export OMP_NUM_THREADS=1
./a.out
export OMP_NUM_THREADS=2
./a.out
export OMP_NUM_THREADS=3
./a.out
export OMP_NUM_THREADS=4
./a.out
export OMP_NUM_THREADS=6
./a.out
export OMP_NUM_THREADS=8
./a.out
export OMP_NUM_THREADS=12
./a.out
export OMP_NUM_THREADS=16
./a.out

Nu har jag utökat till 29 trådar och då spårar det ur (1-3 trådar brukar fungera men sen spårar det ur).
Några tips?
Ändra Open MP- direktiven?

Permalänk

Ser ut att fungera bättre om man byter vissa variabler från integer till long. Men för 64-bitars C borde det inte behövas....

Permalänk
Hedersmedlem

Kan du ge lite mer kontext? Varför vill man labba med detta?

Visa signatur

Använd gilla för att markera nyttiga inlägg!

Permalänk
Skrivet av giplet:

Kan du ge lite mer kontext? Varför vill man labba med detta?

Open MP är ett sätt att använda mer än en kärna på processorn. Det finns andra metoder men de är inte lättare. Det finns alltid fallgropar.
I detta fall bytte jag från int till unsigned int på vissa variabler. Utskriften måste då vara formatterad %u i stället för %d för att slippa minustecken!

Permalänk
Medlem
Skrivet av Greyguy1948:

Open MP är ett sätt att använda mer än en kärna på processorn. Det finns andra metoder men de är inte lättare. Det finns alltid fallgropar.
I detta fall bytte jag från int till unsigned int på vissa variabler. Utskriften måste då vara formatterad %u i stället för %d för att slippa minustecken!

Vilket problem försöker du lösa?

Permalänk
Skrivet av pine-orange:

Vilket problem försöker du lösa?

Beskrivning här:
https://people.sc.fsu.edu/~jburkardt/c_src/satisfy_openmp/sat...

Permalänk
Medlem

Men vilket problem försöker du lösa? Vad försöker du få svar på mha det här programmet?

Permalänk
Skrivet av pine-orange:

Men vilket problem försöker du lösa? Vad försöker du få svar på mha det här programmet?

Som du kan se i länken är programmet ganska gammalt. Jag vill se om det går att skala upp till 30 steg.
Det går även på Raspberry Pi 5 med rimlig beräkningstid. Sen måste man gå över till int64 som inte finns på C/C++. Man får definiera int64 och print int64. Men då har vi lämnat Raspberry Pi och 4 trådar....

Permalänk
Hedersmedlem

@Greyguy1948 Spårar det ur redan vid 29 menar du? För mig fungerar det betydligt längre (200 ger samma resultat).

Permalänk
Skrivet av Elgot:

@Greyguy1948 Spårar det ur redan vid 29 menar du? För mig fungerar det betydligt längre (200 ger samma resultat).

Det gäller att inte få negativa tal. Int32 fungerar upp till 2147483647. Unsigned int32 till 4294967295 sen får man fixa int64.
Vad menar du med 200?

Permalänk
Hedersmedlem
Skrivet av Greyguy1948:

Det gäller att inte få negativa tal. Int32 fungerar upp till 2147483647. Unsigned int32 till 4294967295 sen får man fixa int64.
Vad menar du med 200?

OMP_NUM_THREADS=200

Jag ser inga negativa tal (tror jag) och tabellen blir samma som för en tråd. Vid ännu fler trådar får jag dock negativa siffror och andra antal lösningar.

Permalänk
Medlem
Skrivet av Greyguy1948:

Det gäller att inte få negativa tal. Int32 fungerar upp till 2147483647. Unsigned int32 till 4294967295 sen får man fixa int64.
Vad menar du med 200?

Var är det du får negativa tal?

Om jag förstår det där programmet rätt så borde det fungera med upp till 255 trådar.
Det är delresultat i beräkningen av ilo2 och ihi2 som kan bli större än 2^31 om man har fler trådar än så. Fixar man de beräkningarna så borde det fungera med nästan godtyckligt många trådar.

Permalänk
Skrivet av Erik_T:

Var är det du får negativa tal?

Om jag förstår det där programmet rätt så borde det fungera med upp till 255 trådar.
Det är delresultat i beräkningen av ilo2 och ihi2 som kan bli större än 2^31 om man har fler trådar än så. Fixar man de beräkningarna så borde det fungera med nästan godtyckligt många trådar.

Jag har bara 16 trådar och det fungerar utmärkt om man byter till long på vissa parametrar.
Problemet är snarare att det är lagom antal "solutions" man vill ha varken noll eller miljoner.

Permalänk
Hedersmedlem
Skrivet av Greyguy1948:

Jag har bara 16 trådar och det fungerar utmärkt om man byter till long på vissa parametrar.
Problemet är snarare att det är lagom antal "solutions" man vill ha varken noll eller miljoner.

Det vi främst säger är att programmet (omodifierat) borde fungera med hundratals trådar. Får du alltså problem redan med 29? Är det just där gränsen går för dig?

Permalänk
Skrivet av Elgot:

Det vi främst säger är att programmet (omodifierat) borde fungera med hundratals trådar. Får du alltså problem redan med 29? Är det just där gränsen går för dig?

Inte 29 trådar utan 29 steg. Originanet har ju 23 steg. Men utan att byta till long från int så spårar det ut.
Logiken vill ha 0 eller 1 men inte -1...

Permalänk
Hedersmedlem
Skrivet av Greyguy1948:

Inte 29 trådar utan 29 steg. Originanet har ju 23 steg. Men utan att byta till long från int så spårar det ut.
Logiken vill ha 0 eller 1 men inte -1...

Ah, du skrev trådar i det första inlägget.

Permalänk
Medlem
Skrivet av Greyguy1948:

Inte 29 trådar utan 29 steg. Originanet har ju 23 steg. Men utan att byta till long från int så spårar det ut.
Logiken vill ha 0 eller 1 men inte -1...

Om du ändrar den parametern så måste du ändra en del saker för att det skall fungera korrekt.
Bland annat uträkningen nere i funktionen circuit_value() som antar att det finns 23 relevanta värden i vektorn. Vill du ha vettiga svar måste du nog utöka den, annars kommer du i princip bara att få dubletter av lösningarna för N=23. (Så om du får x antal lösningar för N=23 kommer du att få x*2^6 lösningar för N=29)

Och ja, sedan måste du mycket riktigt justera diverse variabler så att de har tillräckligt många bitar för att kunna lagra tal av storleken
num_threads * 2^N. Så för N=29 så kan du ha max 4 trådar innan du måste gå över till 64-bitars variabler för att undvika overflow.

(Det är för övrigt inte 23 steg. Man antar en binär funktion med N=23 binära värden som input, och vill veta hur många inputs som ger 1 som resultat. Programmet itererar igenom alla 2^N kombinationerna och räknar hur många som returnerar en 1:a)