La domanda ha due risposte, in realtà.
La ricorsione può essere eseguita in parallelo? Avrebbe senso?
Sì, certo. Nella maggior parte dei casi (tutti?), Un algoritmo ricorsivo può essere riscritto in un modo senza ricorsione, portando ad un algoritmo che è abbastanza spesso facilmente parallelizzabile. Non sempre, ma spesso.
Pensa Quicksort, o iterando attraverso un albero delle directory. In entrambi i casi è possibile utilizzare una coda per contenere tutti i risultati intermedi. sottodirectory trovate. La coda può essere elaborata in parallelo, creando eventualmente più voci fino a quando l'attività è stata completata con successo.
Che dire dell'esempio di fib()
?
Sfortunatamente, la funzione Fibonacci è una cattiva scelta, perché i valori di input completati dipendono da risultati precedentemente calcolati. Questa dipendenza rende difficile farlo in parallelo se inizi ogni volta con 1
e 1
.
Tuttavia, se è necessario eseguire calcoli di Fibonacci più spesso, potrebbe essere una buona idea memorizzare (o memorizzare) i risultati precalcolati per evitare tutti i calcoli fino a quel momento. Il concetto alla base è abbastanza simile ai tavoli arcobaleno.
Diciamo che memorizzi nella cache ogni 10 coppie di numeri di Fibo fino a 10.000. Avvia questa routine di inizializzazione su un thread in background. Ora, se qualcuno chiede Fibo numero 5246, l'algoritmo preleva la coppia da 5240 e inizia il calcolo da quel punto in poi. Se la coppia 5240 non è ancora lì, aspettala.
In questo modo il calcolo di molti numeri di fibo scelti casualmente potrebbe essere fatto in modo molto efficiente e in parallelo, perché è molto improbabile che due thread debbano calcolare gli stessi numeri - e anche allora, non sarebbe un gran problema .