Un problema molto comune in un problema con N-body è l'uso di un doppio ciclo per calcolare le interazioni tra le particelle. Considerando un problema corpo N con n particelle, il ciclo può essere scritta troviProblema di N-Body: Parallelizzazione efficiente del ciclo double per
for (i = 0, i < n; i++)
for (j = i+1, j < n; j++)
// calculate interaction
mia domanda riguarda come può essere ciclo parallelizzata utilizzando fili differenti. L'obiettivo è che ogni thread "idealmente" debba calcolare lo stesso numero di interazioni.
La mia idea era di separare il ciclo esterno, il ciclo i, su intervalli diversi, diciamo a_k = a (k), dove k = 1,2, ..., p dove p è il numero di fili che voglio dividere il problema in
Così, il ciclo potrebbe essere scritta come
for (k = 1, k < p; k++)
for (i = a(k), i < a(k+1); i++)
for (j = i+1, j < n; j++)
// calculate interaction
Dove il ciclo più esterno, il k-ciclo, è quello di essere parallelizzati.
Poiché il numero di interazioni del ciclo più interno, il j-ciclo, è N- (i + 1), il numero di interazioni calcolati da ciascun filo è
\ sum_ {i = a (k)}^{a (k + 1)} n - (i + 1)
Ciò significa che si vorrebbe trovare la funzione a_k discreta tale che il funzionale
f [a_k] = \ sum_ {i = a (k)}^{a (k + 1)} n - (i + 1)
con le condizioni al contorno a (1) = 0 e a (p) = n è una costante funzionale, forzando così t il numero di interazioni su ogni thread è lo stesso.
Ho provato a utilizzare "euristica" diversa (ad esempio a_k polinomiale, esponenziale, log), e finora nessuno mi ha dato una risposta soddisfacente. Una soluzione diretta di questo problema non è evidente per me.
Per piccolo p, questo problema può essere messo sul "problemi di minimizzazione del sacco" in cui sostanzialmente ogni a_k è una variabile per minimizzare la funzione
f (a_1, a_2, A_3, ...) = somma (| f [a_k] - n/p |^2)
Ma è possibile indovinare, questo non è efficiente (o addirittura converge) per valori più elevati di p.
Qualcuno ha idea di come potrebbe essere affrontato questo problema?
Avete considerato l'utilizzo di una distribuzione meno esplicita del carico, utilizzando le code? In questo modo è possibile modificare l'insieme di interazioni considerate (eliminando quelle insignificanti, forse) e il meccanismo di distribuzione del carico può rimanere lo stesso. –