Estoy intentando paralizar un programa que estoy usando y recibí la siguiente pregunta. ¿Obtendré una pérdida de rendimiento si múltiples hilos necesitan leer/escribir en el mismo vector pero diferentes elementos del vector? Tengo la sensación de que esa es la razón por la cual mi programa apenas se acelera al paralizarlo. Tome el siguiente código:Vectores compartidos en OpenMP
#include <vector>
int main(){
vector<double> numbers;
vector<double> results(10);
double x;
//write 10 values in vector numbers
for (int i =0; i<10; i++){
numbers.push_back(cos(i));
}
#pragma omp parallel for \
private(x) \
shared(numbers, results)
for(int j = 0; j < 10; j++){
x = 2 * numbers[j] + 5;
#pragma omp critical // do I need this ?
{
results[j] = x;
}
}
return 0;
}
Obviamente el programa real hace operaciones mucho más caros, pero este ejemplo se única explicar mi pregunta. Entonces, ¿el bucle for se puede hacer rápido y completamente en paralelo o los diferentes hilos tienen que esperar el uno al otro porque solo un hilo a la vez puede acceder al número del vector, por ejemplo, aunque todos leen diferentes elementos del vector?
La misma pregunta con la operación de escritura: ¿Necesito el pragma crítico o no hay problema ya que cada hilo escribe en un elemento diferente de los resultados del vector? Estoy contento con cada ayuda que puedo obtener y también sería bueno saber si hay una mejor manera de hacerlo (tal vez no use vectores en absoluto, sino matrices y punteros simples, etc.) También leo vectores aren 'th thread safe' en ciertos casos y se recomienda utilizar un puntero: OpenMP and STL vector
¡Muchas gracias por su ayuda!
Él no cambia el tamaño del vector en absoluto. – eudoxos
@eudoxos Me doy cuenta de que desde el fragmento de código, solo quería asegurarme de que se mencionara, especialmente desde que mencionó el hecho de que los vectores STL no son seguros para subprocesos bajo ciertas condiciones – SirGuy
+1: realmente no aparece aquí, pero hay que tener en cuenta que las operaciones específicas del vector como agregar, cambiar el tamaño, etc. no son enhebrables y probablemente se rompan.Pero solo operar en los elementos de un vector está bien siempre y cuando cada elemento esté siendo escrito por un solo hilo. –