Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 19 kwi 2026, o 16:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 28 sie 2013, o 20:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

Wiadomo, że AVR nie radzi sobie zbyt dobrze ze zmiennymi innymi niż 8bitowe.
Ale.
Postanowiłem zrobić mały teścik:D
Generalnie program liczy i pokazuje liczby pierwsze.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Oczywiście funkcja USART_intZamiast z itoa, korzysta z ultoa();

Procek napędzany kwarcem 16Mhz
No i teraz podam wyniki.
jeśli te zmienne:
uint16_t zmienna=0,total=0; uint16_t i=1;
-są szesnasto bitowe to: http://nopaste.info/bb507c51b4_nl.html
-są trzydziestodwu bitowe to: http://nopaste.info/a95ab85572_nl.html

Jak widać do znalezienia 6057 liczb pierwszych przy użyciu 16bitowych zmienny potrzeba było tylko 38 minut, a przy użyciu 32bitowych zmiennych aż 107 minut.

Teraz się tak zastanawiam.
Czy da się do życia w jakiś prosty sposób powołać np. 25bitową zmienną (tak, aby można było więcej liczb znaleźć, ale również nie czekać na to wieki?)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2013, o 22:27 
Offline
Użytkownik

Dołączył(a): 12 mar 2013
Posty: 34
Pomógł: 0

Zmienna 25-bitowa (o ile da się taką zaimplementować) będzie się liczyć tak samo długo jak 32-bitowa do wartości 25 bitów.
AVR-y są 8 bitowe, więc optymalnie jest dawać im po 8 i wielokrotność bitów na raz.

Mogę się mylić, niech ktoś to zweryfikuje.

_________________
/*Animus aeger semper errat*/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2013, o 22:34 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27456
Lokalizacja: Szczecin
Pomógł: 1045

MrMeriones napisał(a):
Mogę się mylić, niech ktoś to zweryfikuje.


Nie mylisz się....

Zmienne mogą być takie jakie są dostępne typy danych w konkretnym języku (i od tego trzeba zacząć) .... a wszystko inne to już co najwyżej programowe twory/potwory ;) .... potwory dlatego, że nigdy i tak nie przyśpieszy się działań a co najwyżej spowolni.

Zresztą w żadnym języku programowania nie zetknąłem się z innym podejściem niż wielokrotność 8 bitów ;) tak aporp'os typów

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2013, o 22:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Mogła by np. być zmienna 24 bitowa... Były kiedyś nawet komputery o takiej długości słowa, a nawet jeszcze dziwniejsze.
np. 80286 używa liczb 24 bit do adresowania, ale rejestry oczywiście nadal 16.
Tylko w sumie do takich obliczeń to chyba będzie lepiej zastosować procesor 32 bitowy...
Zwłaszcza, że szukanie liczb pierwszych, jeśli ma być wydajne, wymaga sporo pamięci.

W sumie 38 minut dla 6507 licz pierwszych to bardzo fajny rezultat.
A tak całkowicie na marginesie, czy przy tej operacji liczenia proc robi się ciepły ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2013, o 07:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

sq8dsr napisał(a):
A tak całkowicie na marginesie, czy przy tej operacji liczenia proc robi się ciepły ?

Nie ;)
To pewnie tak samo dla niego jak zrobić
while(1){
;
}

Procesor chyba cały czas wykonuje jakieś operacje, więc dlaczego miałby stać się bardziej ciepły szukając liczb pierwszych niż robiąc w kółko pustą pętlę while

------------------------ [ Dodano po: 5 minutach ]

MrMeriones napisał(a):
Zmienna 25-bitowa (o ile da się taką zaimplementować) będzie się liczyć tak samo długo jak 32-bitowa do wartości 25 bitów.
AVR-y są 8 bitowe, więc optymalnie jest dawać im po 8 i wielokrotność bitów na raz.

Mogę się mylić, niech ktoś to zweryfikuje.


No ok.
Ale jeśli można użyć zmiennej 16 czy 32bitowej. TO dlaczego nie mogę sobie jakoś zainplementować zmiennej 24bitowej?
Powinna ona być szybsza niż 32bitowa ale wolniejsza niż 16bitowa?

Czy jest szansa na użycie uint_24t ?
W jaki sposób stworzyć zmienną, która zajmie w pamięci a 24bity?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2013, o 08:28 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27456
Lokalizacja: Szczecin
Pomógł: 1045

xamrex napisał(a):
Czy jest szansa na użycie uint_24t ?


Napisać sobie własny kompilator C i stworzyć nowe typy danych ....

sorki, że tak piszę no ale musisz zrozumieć co to są typy danych dla danego kompilatora i o co w tym chodzi ....

czyli reasumując musiałbyś stworzyć własny typ np 24 bit, ale nie myśl że tylko stworzyć, jeszcze napisać sobie jego całą obsługę. I gwarantuję ci że działałoby ci to wolniej niż uint_32t ;) albo i wolniej niż uint64_t.

Myślę że dużo więcej by ci się rozjaśniło w tym zakresie - tzn dlaczego nie tworzy się typów z kosmosu np 18bitowych albo 27 bitowych - gdybyś chociaż raz sam spróbował zająć się ale w asemblerze napisaniem nawet najprostszych operacji matematycznych jak mnożenie, dzielenie, dodawanie odejmowanie i wziął to pod uwagę.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2013, o 08:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

Ok, dzięki za odpowiedź ;)
Myślę, że temat wyczerpany ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2013, o 08:42 

Pomógł: 0

xamrex napisał(a):
Procesor chyba cały czas wykonuje jakieś operacje, więc dlaczego miałby stać się bardziej ciepły szukając liczb pierwszych niż robiąc w kółko pustą pętlę while


Nie do końca się z tobą zgodzę, jeżeli procesor nie robi "nic" to w sumie nie przerzuca danych między rejestrami, nie klapie tymi wszystkimi swoimi tranzystorami ;).
Dla 8bitowców co prawda to praktycznie żadna różnica, ale łatwo to sprawdzić mierząc prąd pobierany przez procesor w trakcie "liczenia" i porównać do pracy w trybie kręcenia się w pętli głównej.



Góra
  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO