Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-08-2013, 15:22   #1
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
[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, 15: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, 16:10   #3
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
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, 18: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, 19:17   #5
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
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, 21:52   #6
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12900
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 22:00.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 08-08-2013, 11:28   #7
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
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, 19: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, 15:33   #9
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
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, 16:37   #10
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12900
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, 21: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, 08: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


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Tory Bruno ha lasciato la società...
L'immagine di Natale del telescopio spaz...
STMicroelectronics e SpaceX proseguono l...
Numeri da record, Xiaomi distribuisce ol...
BitLocker accelerato via hardware: Micro...
Blue Origin prosegue lo sviluppo dei lan...
Moore Threads: nuove GPU 15 volte pi&ugr...
Steam diventa esclusivamente 64-bit: Val...
La Corte Suprema restituisce a Elon Musk...
X lancia Creator Studio su mobile: nuovi...
Dieci anni fa SpaceX fece atterrare per ...
POCO M8 e M8 Pro arriveranno nel 2026: e...
Caos Formula 1: il motore Mercedes &egra...
Tariffe nazionali per le chiamate e gli ...
Tassa chilometrica non solo per elettric...
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: 05:27.


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