Sto lavorando a un programma con multithreading in cui tutti i thread condividono un vettore (di sola lettura). L'obiettivo di ogni thread è di percorrere l'intero vettore. Tuttavia, tutti i thread devono visitare questo vettore in un modo diverso.C++ iterate vector in modo casuale
Dal momento che il vettore è const e condiviso tra tutti i thread, non posso usare random_shuffle e semplicemente scorrere su di esso. Per ora la mia soluzione è quella di costruire un vettore crossref che conterrà gli indici sopra il vettore condivisa e quindi mischiare questo vettore, cioè
std::vector<int> crossref(SIZE) ; // SIZE is the size of the shared vector
std::iota (std::begin(crossref), std::end(crossref), 0); // Fill with indices ref
std::mt19937 g(SEED); // each thread has it own seed.
std::shuffle (crossref_.begin(), crossref_.end(), g); // Shuffle it
Tuttavia, facendo questo rivelano alcuni problemi (1) non è molto efficiente, in quanto ogni thread deve accedere al suo vettore crossref prima di accedere a quello condiviso, (2) ho qualche problema di prestazioni a causa della quantità di memoria richiesta: il vettore condiviso è molto grande e ho un sacco di thread e processori.
Qualcuno ha qualche idea di miglioramento che eviterà la necessità di memoria aggiuntiva?
L'accesso a 'std :: vector' è fatto in O (1), poiché è un accesso casuale. Inoltre non è garantito che tutti i thread abbiano 'crossref'' std :: vector' diverso, quindi può accadere che due thread eseguano iterazioni su un vettore nello stesso modo. – Zereges
Vorrei utilizzare un singolo stack di indice mescolato condiviso da tutti i thread che è protetto da accessi concorrenti. –
@Zereges - Certo, ma il problema è che il vettore condiviso si adatta quasi alla cache, quindi ogni volta che un thread accede al vettore crossref invalida le cache e questo non è efficiente .. – Esus