Min applikation använde bara 25% av min CPU, fast den behöver mer!

Permalänk
Medlem

Min applikation använde bara 25% av min CPU, fast den behöver mer!

Hej, jag har gjort en applikation i Visual basic som tar fram alla Prim-nummer från 1 till önskat antal.
Det borde ju vara mer CPU krävande än 25% om man t.ex kör från 1 - 100.000.
Fast den står fast helt på 25%
Någon som vet hur man kan fixa detta? har redan googlat som en galning så vet inte alls

God jul

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk

Nu har jag egentligen inget svar på din fråga, men jag tror nog inte du behöver mer kraft eftersom detta är en relativt enkel beräkning?

Mvh Terra

Permalänk
Medlem

Din applikation använder bara en CPU-tråd, men du har 4 CPU:er. Bara en CPU kan alltså utföra arbetet i din applikation.

Permalänk
Medlem

Och sedan är väl knappast 1-100 000 något som är svårt för att en CPU år 2012 att räkna ut..

Visa signatur

CPU: Intel Core i5-2500K GPU: 2x MSI GeForce GTX 560Ti 2048MB TWIN FROZR II OC RAM: Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP HDD: Corsair Force 3 + WD Green 5400 2x 2TB(Raid) Case: Fractal Design R3 PSU: Corsair TX 750W 80+ Bronze MB: MSI P67A-GD55 REV B3 OS: Windows 7 Ultimate 64-bit

Permalänk
Medlem

Som någon redan påpekat, det är för att din applikation inte utnyttjar flera trådar. Föreslår att du kollar upp hur man programmerar för flera trådar i Visual Basic,

För övrigt, tar mig cirka 3 sec att räkna fram primtalen mellan 1-100 000 i C++ på min bärbara (singeltrådad app). Undrar bara hur lång tid det tar för dig i VB, ungefär.

Visa signatur

Desktop: i5 2500K, 32GB RAM, Intel 330 60GB SSD, 1TB HDD, GTX 670, Fractal Design Arc, Arch Linux
Laptop: Asus U32u, Intel 330 60GB SSD, 8GB RAM, Arch Linux

Permalänk
Medlem
Skrivet av Kleiner:

Som någon redan påpekat, det är för att din applikation inte utnyttjar flera trådar. Föreslår att du kollar upp hur man programmerar för flera trådar i Visual Basic,

För övrigt, tar mig cirka 3 sec att räkna fram primtalen mellan 1-100 000 i C++ på min bärbara (singeltrådad app). Undrar bara hur lång tid det tar för dig i VB, ungefär.

Jo det går snabbt att räkna från 1-100.000. men vill ju gärna köra mycket mer än det, och snabbare.

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Hedersmedlem
Skrivet av reflect:

Jo det går snabbt att räkna från 1-100.000. men vill ju gärna köra mycket mer än det, och snabbare.

Dela upp det i trådar då. En tråd kan räkna 1-25 000 och en tar 25 001 - 50 000 osv.. men du får såklart göra det generellt beroende på vilket spann av siffror du vill kolla.

Permalänk
Medlem
Skrivet av Shimonu:

Dela upp det i trådar då. En tråd kan räkna 1-25 000 och en tar 25 001 - 50 000 osv.. men du får såklart göra det generellt beroende på vilket spann av siffror du vill kolla.

Smart tänkt!
Tack tack!

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Medlem

För alla er som undrar gjorde jag 4st trådar, som kör samma kod, fast olika delar utav talet jag vill räkna till. Det fungerar mycket mycket snabbare!

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Hedersmedlem

Du ser
Det var ju bra då.

Nu var det ju ett relativt enkelt problem. När man gör större program så börjar det uppstå synkroniseringsproblem mellan trådar och man får en del att tänka på.

Permalänk
Medlem
Skrivet av Shimonu:

Du ser
Det var ju bra då.

Nu var det ju ett relativt enkelt problem. När man gör större program så börjar det uppstå synkroniseringsproblem mellan trådar och man får en del att tänka på.

Ojdå, ja det får man väl passa sig för

Får dock problem med att trådarna alltid blir klara med sina kalkyleringar i ordningen 1,2,3,4.
Är väl kanske för att t.ex tråd 3,4 får de största talen att kalkylera.
Tänkte dock att det hade varit ganska smart och göra så att när t.ex tråd nr1 är klar så delas det tal som tråd 4 är på, vi säger att tråd 4 räknar talet 10000, då skulle programmet dela det talet och låtit tråd 1 göra lite av jobbet, istället för att tråd nr 4 skulle göra allt.
If that makes sense

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Skrivet av reflect:

Ojdå, ja det får man väl passa sig för

Får dock problem med att trådarna alltid blir klara med sina kalkyleringar i ordningen 1,2,3,4.
Är väl kanske för att t.ex tråd 3,4 får de största talen att kalkylera.
Tänkte dock att det hade varit ganska smart och göra så att när t.ex tråd nr1 är klar så delas det tal som tråd 4 är på, vi säger att tråd 4 räknar talet 10000, då skulle programmet dela det talet och låtit tråd 1 göra lite av jobbet, istället för att tråd nr 4 skulle göra allt.
If that makes sense

Det är nog enklare att dela upp uppgiften i flera delar redan från början, i stället för att försöka dela upp uppgiften i efterhand. Ett exempel på en möjlig lösning, med 2 trådar, där du delar upp uppgiften i 10 delar, skulle se ut...

  • Lägg till en global räknar-variabel i ditt program, sätt värdet till 1

  • Tråd 1 hämtar värdet på räknaren, sparar värdet på räknaren i en lokal variabel, uppdaterar den globala räknar-variabeln med 10 000, samt anropar den funktion du har för att hitta primtalen mellan (värdet_på_den_lokala_variabeln) och (värdet_på_den_lokala_variabeln plus 10 000 minus 1)

  • Tråd 2 härmar Tråd 1

  • ...

  • Tråd 1 blir färdig, hämtar värdet på räknaren, sparar i en lokal variabel, uppdaterar räknaren med 10 000, anropar funktionen, repeterar

  • Tråd 2 härmar Tråd 1

  • ...

  • Tråd 1 blir färdig, hämtar värdet på räknaren, ser att värdet har nått > 100 000, avslutar

  • Tråd 2 härmar Tråd 1

(Även om exemplet visar 2 trådar och 10 000 siffror skulle du kunna anpassa hur du vill, med t.ex. 4 trådar och 5 000 nummer i taget)

Nu kan man inte hämta/uppdatera värdet på en variabel från flera trådar samtidigt hur som helst, för det behöver du använda dig utav VB.Net-kommandot SyncLock (Google vet mer).