Desidero parallelamente il mio algoritmo di ricerca utilizzando openMP, vTree
è un albero di ricerca binario e voglio applicare il mio algoritmo di ricerca per ciascun set di punti. di seguito è riportato uno snippet del mio codice. la procedura di ricerca per due punti è totalmente irrilevante e quindi può essere parallela. anche se hanno bisogno di leggere uno stesso albero, ma una volta costruito, l'albero non verrà più modificato. quindi è di sola lettura.Perché questo metodo di ricerca non è scalabile?
Tuttavia, il codice riportato di seguito mostra una scalabilità terribile, sulla mia piattaforma a 32 core, viene raggiunta solo una velocità doppia. è perché quello vTree
viene letto da tutti i thread? se sì, come posso ottimizzare ulteriormente il codice?
auto results = vector<vector<Point>>(particleNum);
auto t3 = high_resolution_clock::now();
double radius = 1.6;
#pragma omp parallel for
for (decltype(points.size()) i = 0; i < points.size(); i++)
{
vTree.search(points[i], radius, results[i]);
}
auto t4 = high_resolution_clock::now();
double searchTime = duration_cast<duration<double>>(t4 - t3).count();
la firma tipo per search
è
void VPTree::search(const Point& p, double radius, vector<Point>& result) const
risultato di ricerca per essere messa in result
.
Non posso dirlo senza utilizzare un profiler, ma se dovessi indovinare i tuoi thread sono la cache che si scontrano l'un l'altro. – Mgetz
@Mgetz, penso su una macchina multi-core, ogni core ha una sua cache, quindi il codice multi-thread dovrebbe essere in grado di usare una cache più grande, giusto? – Alaya
Dipende dalla piattaforma. Potresti ragionevolmente aspettarti che ogni core abbia il proprio L1, ma L3 condiviso (a meno che tu non abbia attivato hyperthreading), e supponendo che questi siano core sullo stesso pacchetto, e e ... – Useless