Puedo escribir un código que se vea así:
if (make_parallel) { #pragma omp parallel for for (int i=0; i<n; i++) { //For loop stuff } } else { //Identical for loop, minus the parallelisation for (int i=0; i<n; i++) { //For loop stuff } }¿Hay una forma más ordenada de hacer esto, de modo que el bucle for no tenga que duplicarse?
[Editar] - Entonces esta solución funciona en el nivel de preprocesamiento
#define USE_OPENMP //... #ifdef USE_OPENMP #pragma omp parallel for #endif for(int i=0;i<n;i++)Pero eso no es ideal. Pero cuanto más lo pienso, dado que definir la región paralela también es preprocesarlo, ¿probablemente no se pueda condicionar de manera ordenada?
Simplemente puede usar una cláusula if como esta:
int enabled = 1; #pragma omp parallel if(enabled) #pragma omp for nowait for(int i=0;i<n;i++)Tenga en cuenta que esta condición podría ser evaluada por el tiempo de ejecución y no por el compilador (GCC lo hace, por ejemplo). Como resultado, la sobrecarga puede ser significativamente mayor que su solución if-else para bucles muy pequeños o en los que cada iteración es muy económica. La razón es que los compiladores a menudo no propagan constantes a la función informática de devolución de llamada de OpenMP y, por lo tanto, el código puede realizar operaciones innecesarias. Esta solución tiene la ventaja de ser más limpia, ayudando a los compiladores a producir binarios más pequeños y también ayuda a reducir el tiempo de compilación (ya que el ciclo se compila una vez).