Costi delle ricerche rispetto ai calcoli


12

Sono interessato a impostare i calcoli per verificare se un criterio di distanza è soddisfatto: vale a dire, la distanza tra un vettore e un altro vettore dovrebbe essere inferiore a un valore . I miei dati sono partizionati secondo una griglia di coordinate ortogonale. Poiché il mio taglio è inferiore alla distanza tra i punti finali delle coordinate del vicino più vicino, vorrei aggiungere una variabile "ottante" per verificare se le cose sono impostate correttamente:x j r m a xxixjrmax

if octant[j] in allowed_list continue

come "cortocircuito" verso

if dist(x[i], x[j]) < r_max

La mia domanda è: quanto sono computazionalmente efficienti le ricerche e i confronti booleani rispetto alle operazioni in virgola mobile? Vale la pena farlo su architetture moderne?


3
Saresti disposto a ramificare il tuo codice e testarlo? Mi sento come la risposta standard alla maggior parte di questi "È meglio codificarlo (in un modo) o (in un altro modo)?" tipi di domande è "Provalo e confrontalo".
Geoff Oxberry,

1
Solo i miei 2 centesimi. Come scrisse Geoff, questo tipo di consiglio è quello che ho sempre ricevuto quando ho posto domande simili su StackOverflow, per quanto riguarda il codice C ++: codifica tutto prima, organizza il codice in modo che rimanga modulare e riutilizzabile, e solo dopo inizi il refactoring. Esiste una regola dell'80-20: il software impiega l'80% del tempo sul 20% del codice. Attendi fino a quando la struttura non è stata installata, quindi modifica, verifica, modifica, verifica ..
tmaric

@GeoffOxberry: La mia domanda non è così specifica: voglio solo sapere se c'è un vantaggio hardware o compilatore dato a fare un controllo booleano rispetto a fare un'operazione in virgola mobile.
aeismail

3
Ma la tua domanda è troppo generica. Nessuno può dirlo senza vedere un codice concreto. C'è una regola empirica che dice che anche i migliori programmatori non possono dire dove si trovano i colli di bottiglia del loro codice senza profilazione. Ho trascorso i miei ultimi 25 anni a programmare e so che è vero per me.
Wolfgang Bangerth,

Risposte:


15

La mia regola empirica è che se è possibile calcolare una certa quantità in modo efficiente (buon utilizzo della FPU) in meno di 50 flop per doppio valore di precisione, è meglio ricalcolare piuttosto che archiviare. La tendenza, che è stata costante per decenni, è per la capacità in virgola mobile di migliorare più velocemente delle prestazioni della memoria e non è probabile che ceda a causa di vincoli fisici e requisiti energetici della memoria veloce. Il valore di 50 è della giusta grandezza per tutte le piattaforme di elaborazione più diffuse (Intel / AMD, Blue Gene e GPU).

Stime approssimative dei costi per core

[linee guida per macchine basate su Intel e AMD 2011/2012]

  • 0.05
  • 0.2
  • 0.4
  • 0.40.8
  • 2
  • 35
  • 35
  • 5
  • 48
  • 12
  • 12
  • 3050
  • 100
  • 1031 μ
  • 10410 μ
  • 106
  • 2106MPI_Allreduce
  • 107
  • 5108
  • 1.81012

Ulteriori letture


Ho trovato queste informazioni davvero utili. A proposito, dove hai preso questi dati? Sto cercando riferimenti da citare.
Eldila,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.