Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-08-2013, 14:22   #1
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
[C++] Raggruppare dati per evitare cache faults

Sono nuovamente dietro a leggere libri, implemetare alcune tecniche che sto studiando e sudare come un maiale .
Ora mi trovo a dover implementare dei semplici alberi binari. Nel libro che sto leggendo, a un certo punto dice:

"L'implementazione memorizza i nodi in un singolo blocco di memoria. Questo evita la possibilità che i nodi possano essere memorizzati in posti differenti causando problemi con la cache ed una esecuzione lenta".
(tradotto malamente dall'inglese ma il concetto è quello)

C'era già un riferimento a questo fatto all'inizio del capitolo dove parla dei problemi relativi allo swap tra cache e memoria quando capita un cache fault, mostrando quanto questo possa far degradare le prestazioni.

Io nè all'università nè dopo di essa ho mai considerato questo tipo di problematica e non sono abituato a ragionare sulla compattezza dei dati forse perchè non ne ho mai avuto il bisogno.
Ora vorrei sapere innanzitutto in quale modo in C++ posso creare una struttura dati che, quando richiesta dal programma, sia caricata in cache completamente senza quindi causare continui cache fault durante l'esecuzione dell'algoritmo. Mi viene da pensare se non ricordo male che se memorizzo i nodi dentro un array (un vector in c++) questo dovrebbe funzionare bene allo scopo mentre ovviamente una lista concatenata no. Ma esistono anche altri modi? Qualche struttura speciale?
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2013, 14:57   #2
pabloski
Senior Member
 
Iscritto dal: Jan 2008
Messaggi: 8406
Per le strutture dati, tutto quello che memorizza i dati in zone di memoria contigue, diminuisce il numero di cache miss.

Quindi array al posto di liste, ridurre l'uso di malloc, new e compagnia, loop unrolling, ecc...

Però, in generale, affrontare questi problemi è compito del compilatore e del sistema operativo. Aiutarli non fa male, ma è assai poco pratico e molto oneroso.
pabloski è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2013, 15:10   #3
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
Ok grazie, lo terrò a mente. Per ora penso che memorizzerò i nodi all'interno di un array.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2013, 17:32   #4
pabloski
Senior Member
 
Iscritto dal: Jan 2008
Messaggi: 8406
Quote:
Originariamente inviato da -Ivan- Guarda i messaggi
Ok grazie, lo terrò a mente. Per ora penso che memorizzerò i nodi all'interno di un array.
un'array di struct?
pabloski è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2013, 18:17   #5
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
No sarebbe un array di instanze di una classe, ho bisogno di modellare i nodi in un certo modo e mi servono anche dei metodi.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 07-08-2013, 20:52   #6
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12840
C'è da dire che anche se allochi i nodi in maniera "sparsa", dunque non avendo località spaziale (anche se non è necessariamente detto), hai comunque quella temporale nel caso degli alberi binari, perché spesso quando ricerchi un elemento all'interno di un albero binario accedi cmq ai nodi intermedi e quelli vengono tipicamente cachati.

Usare una struttura di dimensioni fissate è la soluzione migliore a patto che non sia troppo grande e che il pattern di accesso preveda un accesso simil-sequenziale.

Ad esempio una hash-table da questo punto di vista è la peggior struttura dal punto di vista del caching.

Nel caso degli array il vantaggio è dato dal fatto che viene fatto prefetch sui dati nelle locazioni vicine e quindi se lo scorri linearmente puoi avere dei vantaggi nel caso in cui l'array sia di piccole dimensioni.

Ovviamente c'è da considerare sempre il delay dovuto all'allocazione, per questo motivo tipicamente in software ad alte prestazioni si tende ad allocare memoria in batch, però queste cose sono solo da considerarsi nell'ambito di programmi realmente specifici o real-time per cui devono esistere limiti sul tempo di processamento e l'allocazione rappresenta effettivamente il collo di bottiglia.

Ultima modifica di WarDuck : 07-08-2013 alle 21:00.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2013, 10:28   #7
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
C'è da dire che anche se allochi i nodi in maniera "sparsa", dunque non avendo località spaziale (anche se non è necessariamente detto), hai comunque quella temporale nel caso degli alberi binari, perché spesso quando ricerchi un elemento all'interno di un albero binario accedi cmq ai nodi intermedi e quelli vengono tipicamente cachati.

Usare una struttura di dimensioni fissate è la soluzione migliore a patto che non sia troppo grande e che il pattern di accesso preveda un accesso simil-sequenziale.

Ad esempio una hash-table da questo punto di vista è la peggior struttura dal punto di vista del caching.

Nel caso degli array il vantaggio è dato dal fatto che viene fatto prefetch sui dati nelle locazioni vicine e quindi se lo scorri linearmente puoi avere dei vantaggi nel caso in cui l'array sia di piccole dimensioni.

Ovviamente c'è da considerare sempre il delay dovuto all'allocazione, per questo motivo tipicamente in software ad alte prestazioni si tende ad allocare memoria in batch, però queste cose sono solo da considerarsi nell'ambito di programmi realmente specifici o real-time per cui devono esistere limiti sul tempo di processamento e l'allocazione rappresenta effettivamente il collo di bottiglia.
Grazie della spiegazione, siccome sono gnurante ti chiedo...cosa intendi per allocare memoria in batch?

Io l'array che memorizza i nodi dell'albero a dire la verità lo utilizzo molto per avere accesso diretto ai vari elementi, non lo scorro in modo sequenziale. Comunque riguardo all'esercizio che sto facendo c'è un sorgente su internet che poi mi andrò a vedere, prima volevo scrivere la mia versione, poi le cose sbagliate me le studierò a posteriori.

L'ambito è quello delle intelligenze artificiali per videogiochi dunque effettivamente si tratta di algoritmi che vengono rieseguiti ad ogni frame in contesti real time. Penso sia questo il motivo per cui ci si pone in modo così forte il problema di avere una certa compattezza dei dati per migliorare le prestazioni, infatti nei lavori che ho fatto in precedenza difficilmente si arrivava a discutere questioni di questa natura.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2013, 18:12   #8
nico159
Senior Member
 
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
IMHO c'è solo un ottimo riferimento a questo:
http://www.akkadia.org/drepper/cpumemory.pdf
Scritto dal mantainer della glibc

Una buona introduzione al problema la si ha con questo talk:
http://channel9.msdn.com/Events/Build/2013/4-329
__________________
In a world without fences, who needs Gates?
Power by: Fedora 8 - Mac OS X 10.4.11
nico159 è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2013, 14:33   #9
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1843
Quote:
Originariamente inviato da nico159 Guarda i messaggi
IMHO c'è solo un ottimo riferimento a questo:
http://www.akkadia.org/drepper/cpumemory.pdf
Scritto dal mantainer della glibc

Una buona introduzione al problema la si ha con questo talk:
http://channel9.msdn.com/Events/Build/2013/4-329
Grazie, mi interessano tantissimo queste cose relative anche all'architettura dei computer.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2013, 15:37   #10
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12840
Quote:
Originariamente inviato da -Ivan- Guarda i messaggi
Grazie della spiegazione, siccome sono gnurante ti chiedo...cosa intendi per allocare memoria in batch?
Intendo dire che anziché fare N allocazioni piccole, ne puoi fare 1 di dimensioni molto grandi e gestire da te lo spazio per gli oggetti.

Tra l'altro in C++ è presente il così detto "placement new" che consente di creare oggetti in aree di memoria già allocate:

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

Ovviamente gli oggetti così allocati vanno gestiti a modo, non esiste un placement delete perché si presume che l'area di memoria per l'oggetto in questione venga gestita manualmente (ad esempio potrebbe essere deallocata tutta in una volta sola alla fine del programma).
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2013, 20:40   #11
||ElChE||88
Senior Member
 
Iscritto dal: Dec 2003
Messaggi: 4907
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Ovviamente gli oggetti così allocati vanno gestiti a modo, non esiste un placement delete perché si presume che l'area di memoria per l'oggetto in questione venga gestita manualmente (ad esempio potrebbe essere deallocata tutta in una volta sola alla fine del programma).
placement delete non serve perché al contrario del costruttore il distruttore lo si può gia chiamare esplicitamente.
||ElChE||88 è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2013, 07:26   #12
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da -Ivan- Guarda i messaggi
Ora vorrei sapere innanzitutto in quale modo in C++ posso creare una struttura dati che, quando richiesta dal programma, sia caricata in cache completamente senza quindi causare continui cache fault durante l'esecuzione dell'algoritmo. Mi viene da pensare se non ricordo male che se memorizzo i nodi dentro un array (un vector in c++) questo dovrebbe funzionare bene allo scopo mentre ovviamente una lista concatenata no. Ma esistono anche altri modi? Qualche struttura speciale?
Non occorre necessariamente utilizzare un array. La cosa piu' semplice e' allocare un "pezzo" di memoria grezza e poi utilizzarlo per tirarci fuori i singoli oggetti. Se sono tutti dello stesso tipo allora e' equivalente ad un array, ma in generale puoi utilizzare la tecnica per strutture dati eterogenee.
Non e' l'unica tecnica da usare; altre due regole molto semplici per aiutare la cache sono
* Accessi temporalmente vicini dovrebbero accedere memoria fisicamente vicina. Il caso migliore e' quando riesci ad accedere la memoria "linearmente" nel qual caso riesci a sfruttare anche il prefetch
* Utilizzare meno memoria. Sembra banale, ma e' importante da tenere in mente. Una lista concatenata consumera' molta piu' memoria di un array in quanto devi memorizzare anche i puntatori. Nel caso di interi vuol dire che meta' della memoria (e quindi della cache) va via per memorizzare puntatori.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
Nuovo test di accensione dei motori per ...
Novità dalle analisi dell'asteroi...
La PS6 sarà più potente del previsto: ec...
Sony svela Xperia 10 VII: è il nu...
Amazon Weekend da urlo: iPhone 16 a prez...
Spotify diffida ReVanced: chiesta la rim...
Spazzolini elettrici Oral-B iO in super ...
Samsung Galaxy Watch8 Classic e Watch7 a...
Blue Origin prosegue lo sviluppo di Blue...
Roborock Saros 10 e 10R dominano il merc...
Apple scatenata su Amazon: tutti gli sco...
Canon EOS C50 è la nuova videocam...
ASUS ProArt P16 arriva in Italia: la wor...
Fujifilm presenta l'obiettivo FUJINON GF...
Il grafene ha appena 'infranto' una legg...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:29.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v