From 7545a6222c25658348dfa5ea4935fdb003f567cb Mon Sep 17 00:00:00 2001 From: Thomas Preud'homme Date: Tue, 21 Feb 2012 16:01:01 +0100 Subject: [PATCH] Same buffer size for BatchQueue and native algo Ensure buffer size for BatchQueue and the native communication algorithm is the same in case there is 1 producer and 1 consumer. In case of several producers or several consumers, the size of the buffer is multiplied by max(nb producers, nb consumers). --- gcc/omp-low.c | 98 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/gcc/omp-low.c b/gcc/omp-low.c index f6f4e3280..be8eb6e48 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -7867,29 +7867,38 @@ prepare_streaming_context (omp_region_p region) parallel region. */ for (i = 0; VEC_iterate (stream_p, sinfo->streams, i, stream); ++i) { -#ifdef BATCHQ_ENABLED - int nb_views = 0; + int nb_views = 0, nb_rviews = 0, nb_wviews = 0; +#ifdef BATCHQ_ENABLED stream->use_batchQ = 0; +#endif for (j = 0; VEC_iterate (view_p, stream->rviews, j, view); ++j) { if (INTEGER_CST_CHECK(view->sinfo->num_instances)) - nb_views += TREE_INT_CST_LOW(view->sinfo->num_instances); + { + nb_views += TREE_INT_CST_LOW(view->sinfo->num_instances); + nb_rviews += TREE_INT_CST_LOW(view->sinfo->num_instances); + } else { /* Ensure we use generic functions */ nb_views += 2; + nb_rviews += 2; break; } } for (j = 0; VEC_iterate (view_p, stream->wviews, j, view); ++j) { if (INTEGER_CST_CHECK(view->sinfo->num_instances)) - nb_views += TREE_INT_CST_LOW(view->sinfo->num_instances); + { + nb_views += TREE_INT_CST_LOW(view->sinfo->num_instances); + nb_wviews += TREE_INT_CST_LOW(view->sinfo->num_instances); + } else { /* Ensure we use generic functions */ nb_views += 2; + nb_wviews += 2; break; } } @@ -7903,55 +7912,76 @@ prepare_streaming_context (omp_region_p region) /* If there are firstprivate views, there should be no write views. */ gcc_assert (VEC_empty (view_p, stream->wviews)); nb_views ++; + nb_wviews ++; } +#ifdef BATCHQ_ENABLED if (nb_views == 2) stream->use_batchQ = 1; #endif tree type_size = TYPE_SIZE_UNIT (stream->element_type); tree horizon_size; -#ifdef BATCHQ_ENABLED tree read_burst_size, write_burst_size, burst_size; view_p rview, wview; -#endif - gsi = gsi_last_bb (sinfo->initialization_bb); + horizon_size = create_tmp_var (size_type_node, + "horizon_size"); + burst_size = create_tmp_var (size_type_node, + "burst_size"); + rview = VEC_index(view_p, stream->rviews, 0); + read_burst_size = get_view_burst_size (rview, &gsi); + if (VEC_empty (view_p, stream->wviews)) + wview = VEC_index(view_p, stream->fpviews, 0); + else + wview = VEC_index(view_p, stream->wviews, 0); + write_burst_size = get_view_burst_size (wview, &gsi); + stmt = gimple_build_assign_with_ops (MAX_EXPR, + burst_size, + read_burst_size, + write_burst_size); + gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); + /* MAX(read_burst_size, write_burst_size) / type_size */ + stmt = gimple_build_assign_with_ops (CEIL_DIV_EXPR, + horizon_size, + burst_size, + type_size); + gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); #ifdef BATCHQ_ENABLED if (stream->use_batchQ) - { - horizon_size = create_tmp_var (size_type_node, - "horizon_size"); - burst_size = create_tmp_var (size_type_node, - "burst_size"); - rview = VEC_index(view_p, stream->rviews, 0); - read_burst_size = get_view_burst_size (rview, &gsi); - if (VEC_empty (view_p, stream->wviews)) - wview = VEC_index(view_p, stream->fpviews, 0); - else - wview = VEC_index(view_p, stream->wviews, 0); - write_burst_size = get_view_burst_size (wview, &gsi); - stmt = gimple_build_assign_with_ops (MAX_EXPR, - burst_size, - read_burst_size, - write_burst_size); - gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); - /* MAX(read_burst_size, write_burst_size) / type_size */ - stmt = gimple_build_assign_with_ops (CEIL_DIV_EXPR, - horizon_size, - burst_size, - type_size); - gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); fn = built_in_decls[BUILT_IN_GOMP_BATCHQ_CREATE_STREAM]; - } else -#endif { - horizon_size = build_int_cst (size_type_node, - HORIZON); +#endif + tree aggregation_factor, nbwviewscst, nbrviewscst; + tree max_nbviews; + + aggregation_factor = build_int_cst (size_type_node, + AGGREGATION_FACTOR); + nbwviewscst = build_int_cst (size_type_node, nb_wviews); + nbrviewscst = build_int_cst (size_type_node, nb_rviews); + max_nbviews = create_tmp_var (size_type_node, + "max_nbviews"); + stmt = gimple_build_assign_with_ops (MAX_EXPR, + max_nbviews, + nbrviewscst, + nbrviewscst); + gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); + stmt = gimple_build_assign_with_ops (MULT_EXPR, + horizon_size, + horizon_size, + max_nbviews); + gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); + stmt = gimple_build_assign_with_ops (MULT_EXPR, + horizon_size, + horizon_size, + aggregation_factor); + gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); fn = built_in_decls[BUILT_IN_GOMP_STREAM_CREATE_STREAM]; +#ifdef BATCHQ_ENABLED } +#endif stmt = gimple_build_call (fn, 2, type_size, horizon_size); gimple_call_set_lhs (stmt, stream->stream); gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);