2011-12-23 8 views
7

Questa domanda proviene da una discussione che è stata toccata da quest'altra domanda: Parallelize already linear-time algorithm. È non compiti.Quanto velocemente si può ottenere "la ricerca del massimo in un array"?

Viene fornita una serie di numeri N e una macchina con processori P e una memoria condivisa CREW (lettura simultanea, memoria scrittura esclusiva).

Qual è il più stretto limite superiore sull'algoritmo più veloce per trovare il numero più grande nella matrice? [Ovviamente, anche: qual è l'algoritmo stesso?]

Non mi riferisco alla quantità totale di lavoro svolto [che può mai essere inferiore a O (N)].

+0

Che cosa significa "più veloce" qui? Non dipenderebbe dai costi relativi dell'esecuzione del codice, della memoria di lettura, della memoria di scrittura, del confronto dei numeri e anche di come funziona la cache? –

+0

@aix: potresti avere ragione. Non mi importa se qualcuno lo segnala per una mossa lì. Fino ad allora, lo lascerò stare qui. Si tratta ancora di programmazione, dopo tutto. – ArjunShankar

+0

@PaulHankin: sto parlando di complessità qui. Rilasciamo tutte le costanti come "5ms" da leggere, "10ns" un ciclo, riscontri cache, ecc. Prendi solo in considerazione cose come "leggi", "scrivi", "confronta" come 1 operazione: http: //en.wikipedia.org/wiki/Analysis_of_algorithms – ArjunShankar

risposta

8

Penso che sia O(N/P') + O(Log2(P')), dove P'=min{N,P}. I processori P' cercano max di N/P' elementi, seguiti da Log2 accoppiamenti a coppie eseguiti in parallelo. Le prime unioni P'/2 vengono eseguite da processori pari, next 'P'/4 '- da processori in posizioni divisibili per 8, quindi per 16 e così via.

ModificaP' viene introdotto per coprire il caso quando si dispone di più nodi del processore rispetto agli elementi che è necessario cercare.

+1

Non sono sicuro che l'argomento Log2 (P) contenga: Presuppone P% 2 == 0, inoltre non considera il costo di distribuzione del lavoro ai processori P, che sospetto essere lineare –

+1

@EugenRieck Distributing can essere fatto in O (1) comunicando 'N' a tutti i processori e supponendo che già conoscono' P' e il loro numero: il primo processore ottiene la parte '0..N/P' dell'array, il secondo ottiene' N/P..2N/P ', e così via. L'idea principale è che la fusione dei risultati può essere fatta in parallelo: penso che sia indipendente dal numero effettivo di processori. – dasblinkenlight

+0

Comunicare N potrebbe essere semplice come scrivere N in una posizione predeterminata in memoria, dove tutte le CPU possono leggerlo contemporaneamente, quindi sì. Sono d'accordo che la comunicazione può essere fatta in O (1). – ArjunShankar

1

ho il sospetto che ciò è O (N/P) + O (P)

  • Condividere il lavoro tra i processori P ha un costo di O (P)
  • combinando il lavoro svolto da P processori ha anche i costi di O (P)
  • Un perfetto ricerca parallell di N elementi dai processori P ha costo di tempo di O (N/P)

mio algoritmo ingenuo sarebbe quello di

  • voce scrittura 0 in una cella CREW etichettato come "risultato"
  • inizio P ricerche completamente indipendenti, ciascuno attraverso 1/P esimo degli elementi N
  • al termine di ogni spinloop utilizzo di ricerca CAS per sostituire "risultato" con risultato della ricerca parziale, se è più grande. (A seconda della definizione di CREW potrebbe non essere necessario lo spinloop)
+0

Questa analisi è troppo pessimistica anche sull'hardware reale che effettivamente abbiamo. La riduzione di un valore dai processori 'P' può essere eseguita nel tempo' O (lg P) '. – Novelocrat

+0

La domanda ovvia è: se P >> N vuoi dire che i processori 2P faranno il compito più lentamente dei processori P? –

5

Cook, Dwork e Reischuk hanno dimostrato che qualsiasi algoritmo CREW per trovare il massimo di n elementi deve essere eseguito in Omega (lg n), anche con un numero illimitato di processori e memoria illimitata. Se ricordo bene, nel loro articolo appare un algoritmo con un limite superiore corrispondente:

Stephen Cook, Cynthia Dwork e Rüdiger Reischuk. Limiti di tempo superiore e inferiore per macchine ad accesso casuale parallele senza scritture simultanee. SIAM Journal on Computing, 15 (1): 87-97, 1986.

4

Quello che segue è ottimale legato:

Se p = < n/log n si può fare a O (n/p) di tempo; altrimenti è O (log n) vale a dire quando p> n/log n non guadagni nulla rispetto a p = n/log n.

Proof - limite inferiore:

rivendicazione 1: Non si può mai fare più veloce di Ω (n/p), in quanto i processori p può dare solo aumento di velocità di p

rivendicazione 2: Non si può mai fare più veloce di Ω (log n), a causa del modello di CREW (vedere la carta di non perdonata); se si desidera verificare se un array 0-1 ha almeno un 1, è necessario O (log n) tempo.

Proof - limite superiore:

rivendicazione 3: È possibile trovare il massimo utilizzando n/log n processori e in O (log n)

Dimostrazione: E 'facile trovare la massima utilizzando i processori n e log n time; ma in effetti, in questo algoritmo la maggior parte dei processori è inattivo per la maggior parte del tempo; mediante un adeguato incastro a coda di rondine, (vedi ad esempio il libro sulla complessità di Papadimitriou) il loro numero può essere ridotto a n/log n.


Ora, dato inferiore a n/log n processori si possono dare lavoro assegnato a K processori a 1 processore, questo divide requisito processore da K e si moltiplica il tempo richiesto da K.

Sia K = (n/log n)/p; l'algoritmo precedente viene eseguito nel tempo O (K log n) = O (n/p) e richiede n/(log n * K) = p processori.


Modificato: Ho appena realizzato che quando p < = n/log n, l'algoritmo di dasblinkenlight ha lo stesso tempo di esecuzione asintotico:

n/p log + p < = n/p + log (n/log n) < = n/p + log n < = n/p + n/p < = 2n/p = O (n/p)

in modo da poter usare tale algoritmo, che ha complessità O (n/p) quando p < = n/log n e O (log n) altrimenti.

+0

+1 per una ben pensata risposta, e per considerare le questioni sollevate da altre due risposte. – ArjunShankar

1

Per P = N^2 è O (1).

inizializzazione matrice booleana CannotBeMax [i] = FALSE

Proc (i, j) imposta CannotBeMax [i] = A [i] < A [j]

Max è A [CannotBeMax [i ] == FALSE]

Si noti che tutte le scritture simultanee tentano di scrivere informazioni identiche in modo che la risposta sia coerente, indipendentemente da quale operazione riesce.

+0

Giusto. +1. L'algoritmo che descrivi, mentre è corretto, è rilevante per [CRCW PRAM con lo schema di scrittura "comune"] (http://en.wikipedia.org/wiki/Parallel_Random_Access_Machine). La mia domanda era specifica per una macchina CREW (Concurrent Read, Exclusive Write), in cui non sono consentite scritture concorrenti. – ArjunShankar

Problemi correlati