From 064f046e5e7cb75d162d8644bdca56dedf6ab484 Mon Sep 17 00:00:00 2001 From: heister Date: Wed, 2 Oct 2013 17:30:01 +0000 Subject: [PATCH] only use TBB in workstream if we are allowed to use more than one thread git-svn-id: https://svn.dealii.org/trunk@31071 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/include/deal.II/base/work_stream.h | 246 +++++++++++---------- 1 file changed, 129 insertions(+), 117 deletions(-) diff --git a/deal.II/include/deal.II/base/work_stream.h b/deal.II/include/deal.II/base/work_stream.h index bccc4b8896..45b15fe197 100644 --- a/deal.II/include/deal.II/base/work_stream.h +++ b/deal.II/include/deal.II/base/work_stream.h @@ -832,48 +832,52 @@ namespace WorkStream if (!(begin != end)) return; + // we want to use TBB if we have support and if it is not disabled at + // runtime: #ifdef DEAL_II_WITH_THREADS - // create the three stages of the - // pipeline - internal::IteratorRangeToItemStream - iterator_range_to_item_stream (begin, end, - queue_length, - chunk_size, - sample_scratch_data, - sample_copy_data); - - - internal::Worker worker_filter (worker); - internal::Copier copier_filter (copier,true); + if (multithread_info.n_threads()==1) +#endif + { + // need to copy the sample since it is marked const + ScratchData scratch_data = sample_scratch_data; + CopyData copy_data = sample_copy_data; - // now create a pipeline from - // these stages - tbb::pipeline assembly_line; - assembly_line.add_filter (iterator_range_to_item_stream); - assembly_line.add_filter (worker_filter); - assembly_line.add_filter (copier_filter); + for (Iterator i=begin; i!=end; ++i) + { + if (static_cast >(worker)) + worker (i, scratch_data, copy_data); + if (static_cast > + (copier)) + copier (copy_data); + } + } +#ifdef DEAL_II_WITH_THREADS + else // have TBB and use more than one thread + { + // create the three stages of the pipeline + internal::IteratorRangeToItemStream + iterator_range_to_item_stream (begin, end, + queue_length, + chunk_size, + sample_scratch_data, + sample_copy_data); - // and run it - assembly_line.run (queue_length); - assembly_line.clear (); + internal::Worker worker_filter (worker); + internal::Copier copier_filter (copier,true); -#else + // now create a pipeline from these stages + tbb::pipeline assembly_line; + assembly_line.add_filter (iterator_range_to_item_stream); + assembly_line.add_filter (worker_filter); + assembly_line.add_filter (copier_filter); - // need to copy the sample since it is - // marked const - ScratchData scratch_data = sample_scratch_data; - CopyData copy_data = sample_copy_data; + // and run it + assembly_line.run (queue_length); - for (Iterator i=begin; i!=end; ++i) - { - if (static_cast >(worker)) - worker (i, scratch_data, copy_data); - if (static_cast > - (copier)) - copier (copy_data); + assembly_line.clear (); } #endif } @@ -974,89 +978,97 @@ namespace WorkStream if (!(begin != end)) return; + // we want to use TBB if we have support and if it is not disabled at + // runtime: + #ifdef DEAL_II_WITH_THREADS + if (multithread_info.n_threads()==1) + #endif + { + // need to copy the sample since it is + // marked const + ScratchData scratch_data = sample_scratch_data; + CopyData copy_data = sample_copy_data; + + for (Iterator i=begin; i!=end; ++i) + { + if (static_cast >(worker)) + worker (i, scratch_data, copy_data); + if (static_cast > + (copier)) + copier (copy_data); + } + } #ifdef DEAL_II_WITH_THREADS - // color the graph - std::vector > coloring = graph_coloring::make_graph_coloring( - begin,end,get_conflict_indices); - - // colors that do not have cells, i.e., less than chunk_size times - // multithread_info.n_default_threads, are gathered and the copier is - // called serially. - const unsigned int serial_limit(chunk_size*multithread_info.n_default_threads); - std::vector serial_copying; - - for (unsigned int color=0; color - iterator_range_to_item_stream (coloring[color].begin(), coloring[color].end(), - queue_length, - chunk_size, - sample_scratch_data, - sample_copy_data); - - internal::Worker worker_filter (worker); - internal::Copier copier_filter (copier,false); - - // now create a pipeline from - // these stages - tbb::pipeline assembly_line; - assembly_line.add_filter (iterator_range_to_item_stream); - assembly_line.add_filter (worker_filter); - assembly_line.add_filter (copier_filter); - - // and run it - assembly_line.run (queue_length); - - assembly_line.clear (); - } - } - - // use the serial copier for all the colors that do not have enough cells - if (serial_copying.size()!=0) - { - internal::IteratorRangeToItemStream - iterator_range_to_item_stream (serial_copying.begin(), serial_copying.end(), - queue_length, - chunk_size, - sample_scratch_data, - sample_copy_data); - - internal::Worker worker_filter (worker); - internal::Copier copier_filter (copier,true); - - tbb::pipeline assembly_line; - assembly_line.add_filter (iterator_range_to_item_stream); - assembly_line.add_filter (worker_filter); - assembly_line.add_filter (copier_filter); - - // and run it - assembly_line.run (queue_length); - - assembly_line.clear (); - } -#else - - // need to copy the sample since it is - // marked const - ScratchData scratch_data = sample_scratch_data; - CopyData copy_data = sample_copy_data; - - for (Iterator i=begin; i!=end; ++i) - { - if (static_cast >(worker)) - worker (i, scratch_data, copy_data); - if (static_cast > - (copier)) - copier (copy_data); - } + else + { + // color the graph + std::vector > coloring = graph_coloring::make_graph_coloring( + begin,end,get_conflict_indices); + + // colors that do not have cells, i.e., less than chunk_size times + // multithread_info.n_default_threads, are gathered and the copier is + // called serially. + const unsigned int serial_limit(chunk_size*multithread_info.n_default_threads); + std::vector serial_copying; + + for (unsigned int color=0; color + iterator_range_to_item_stream (coloring[color].begin(), coloring[color].end(), + queue_length, + chunk_size, + sample_scratch_data, + sample_copy_data); + + internal::Worker worker_filter (worker); + internal::Copier copier_filter (copier,false); + + // now create a pipeline from + // these stages + tbb::pipeline assembly_line; + assembly_line.add_filter (iterator_range_to_item_stream); + assembly_line.add_filter (worker_filter); + assembly_line.add_filter (copier_filter); + + // and run it + assembly_line.run (queue_length); + + assembly_line.clear (); + } + } + + // use the serial copier for all the colors that do not have enough cells + if (serial_copying.size()!=0) + { + internal::IteratorRangeToItemStream + iterator_range_to_item_stream (serial_copying.begin(), serial_copying.end(), + queue_length, + chunk_size, + sample_scratch_data, + sample_copy_data); + + internal::Worker worker_filter (worker); + internal::Copier copier_filter (copier,false); + + tbb::pipeline assembly_line; + assembly_line.add_filter (iterator_range_to_item_stream); + assembly_line.add_filter (worker_filter); + assembly_line.add_filter (copier_filter); + + // and run it + assembly_line.run (queue_length); + + assembly_line.clear (); + } + } #endif } -- 2.39.5