intendo usare tamponi std::vector<size_t> buffer(100)
, uno per ogni filo in una parallelizzazione di un ciclo, come suggerito da questo codice:preassegnati std privato :: vector in OpenMP parallelized ciclo for C++
std::vector<size_t> buffer(100);
#pragma omp parallel for private(buffer)
for(size_t j = 0; j < 10000; ++j) {
// ... code using the buffer ...
}
Questo il codice non funziona. Sebbene sia presente un buffer per ogni thread, questi possono avere la dimensione 0.
Come posso allocare il buffer all'inizio di ogni thread? Posso ancora usare #pragma omp parallel for
? E posso farlo più elegante di questo:
std::vector<size_t> buffer;
#pragma omp parallel for private(buffer)
for(size_t j = 0; j < 10000; ++j) {
if(buffer.size() != 100) {
#pragma omp critical
buffer.resize(100);
}
// ... code using the buffer ...
}
Penso di vedere il problema ora. Il vettore non viene correttamente copiato nella regione OpenMP. Non sono sicuro di quello che dice lo standard OpenMP sulla costruzione di copia delle variabili 'private' nei thread. – Mysticial
Se si desidera che siano separati, basta dichiarare il vettore all'interno della regione OpenMP. – Mysticial
Grazie per il chiarimento.So come delcare il vettore all'interno della regione OpenMP se parallelizzo il loop manualmente. Ma funziona anche con '#pragma omp parallel for'? –