¿Podría alguien dar algunas sugerencias sobre cómo puedo disminuir lo siguiente para el tiempo de ejecución del ciclo mediante multihilo? Supongamos que también tengo dos vectores llamados 'a' y 'b'.Suma paralela para vectores
for (int j = 0; j < 8000; j++){
// Perform an operation and store in the vector 'a'
// Add 'a' to 'b' coefficient wise
}
Este bucle for se ejecuta muchas veces en mi programa. Las dos operaciones en el ciclo de arriba para arriba ya están optimizadas, pero solo se ejecutan en un núcleo. Sin embargo, tengo 16 núcleos disponibles y me gustaría utilizarlos.
He intentado modificar el ciclo de la siguiente manera. En lugar de tener el vector 'a', tengo 16 vectores, y supongo que el i-ésimo se llama un [i]. Mi bucle ahora se ve como
for (int j = 0; j < 500; j++){
for (int i = 0; i < 16; i++){
// Perform an operation and store in the vector 'a[i]'
}
for (int i = 0; i < 16; i++){
// Add 'a[i]' to 'b' coefficient wise
}
}
utilizo el OpenMP en cada uno de los bucles en el interior mediante la adición de 'omp paralelo para #pragma' antes de cada uno de los bucles internos. Todos mis procesadores están en uso, pero mi tiempo de ejecución solo aumenta significativamente. ¿Alguien tiene alguna sugerencia sobre cómo puedo disminuir el tiempo de ejecución de este ciclo? Gracias de antemano.
¿Ha perfilado su código para ver dónde están los cuellos de botella? – GWW
puede ser porque quizás después de optimizar tu código no se puede dividir en fragmentos más pequeños, si tu original solo estaba haciendo algo como 'a [i] + = b [i]' entonces puedes agregar esa etiqueta pragma justo antes de eso para. aumentará tu rendimiento como quisieras. – Ali1S232
Si el cuerpo de su bucle es realmente tan trivial, entonces probablemente esté limitado por el ancho de banda de su memoria, y más núcleos no ayudarán (porque el ancho de banda de la memoria ya está saturado). Vuelva a organizar a un nivel más alto para encontrar más trabajo que hacer dentro del bucle, o consiga una máquina con RAM más rápida. – Nemo