]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Change the way copier can be ignored in WorkStream.
authorBruno Turcksin <bruno.turcksin@gmail.com>
Mon, 25 Nov 2013 18:05:23 +0000 (18:05 +0000)
committerBruno Turcksin <bruno.turcksin@gmail.com>
Mon, 25 Nov 2013 18:05:23 +0000 (18:05 +0000)
git-svn-id: https://svn.dealii.org/trunk@31799 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/include/deal.II/base/work_stream.h
deal.II/source/numerics/data_out.cc
deal.II/source/numerics/derivative_approximation.cc

index 41f8a32a9ebf4fecbd504c6eaef86d154fdc56c2..3ccf789b450168d32b26ee35e9af314456201a12 100644 (file)
@@ -1150,7 +1150,8 @@ namespace WorkStream
    *
    * This function that can be used for worker and copier objects that
    * are either pointers to non-member functions or objects that allow to be
-   * called with an operator(), for example objects created by std::bind.
+   * called with an operator(), for example objects created by std::bind. If
+   * the copier is an empty function, it is ignore in the pipeline. 
    *
    * The argument passed as @p end must be convertible to the same type as @p
    * begin, but doesn't have to be of the same type itself. This allows to
@@ -1169,9 +1170,6 @@ namespace WorkStream
    * the input stream that will be worked on by the worker and copier
    * functions one after the other on the same thread.
    *
-   * The last argument @p empty_copier can be set to true when the copier is
-   * empty. In this case, the copier is not used which can improve speed.
-   *
    * @note If your data objects are large, or their constructors are
    * expensive, it is helpful to keep in mind that <tt>queue_length</tt>
    * copies of the <tt>ScratchData</tt> object and
@@ -1191,8 +1189,7 @@ namespace WorkStream
        const ScratchData                       &sample_scratch_data,
        const CopyData                          &sample_copy_data,
        const unsigned int queue_length = 2*multithread_info.n_threads(),
-       const unsigned int                       chunk_size = 8,
-       const bool                               empty_copier = false)
+       const unsigned int                       chunk_size = 8)
   {
     Assert (queue_length > 0,
             ExcMessage ("The queue length must be at least one, and preferably "
@@ -1241,37 +1238,20 @@ namespace WorkStream
                                        sample_scratch_data,
                                        sample_copy_data);
 
+        internal::Implementation2::Worker<Iterator, ScratchData, CopyData> worker_filter (worker);
+        internal::Implementation2::Copier<Iterator, ScratchData, CopyData> copier_filter (copier);
 
-        if (empty_copier==false)
-          {
-            internal::Implementation2::Worker<Iterator, ScratchData, CopyData> worker_filter (worker);
-            internal::Implementation2::Copier<Iterator, ScratchData, CopyData> copier_filter (copier);
-
-            // 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);
+        // 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);
+        if (static_cast<const std_cxx1x::function<void (const CopyData &)>& >(copier))
+          assembly_line.add_filter (copier_filter);
 
-            assembly_line.clear ();
-          }
-        else
-          {
-            internal::Implementation2::Worker<Iterator, ScratchData, CopyData> worker_filter (worker);
-
-            // 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);
+        // and run it
+        assembly_line.run (queue_length);
 
-            // and run it
-            assembly_line.run (queue_length);
-
-            assembly_line.clear ();
-          }
+        assembly_line.clear ();
       }
 #endif
   }
@@ -1403,7 +1383,8 @@ namespace WorkStream
    * and Bangerth (see @ref workstream_paper).
    *
    * This is the function that can be used for worker and copier functions
-   * that are member functions of a class.
+   * that are member functions of a class. If the copier is an empty function, 
+   * it is ignore in the pipeline. 
    *
    * The argument passed as @p end must be convertible to the same type as @p
    * begin, but doesn't have to be of the same type itself. This allows to
@@ -1417,9 +1398,6 @@ namespace WorkStream
    * the input stream that will be worked on by the worker and copier
    * functions one after the other on the same thread.
    *
-   * The last argument @p empty_copier can be set to true when the copier is
-   * empty. In this case, the copier is not used which can improve speed.
-   *
    * @note If your data objects are large, or their constructors are
    * expensive, it is helpful to keep in mind that <tt>queue_length</tt>
    * copies of the <tt>ScratchData</tt> object and
@@ -1441,8 +1419,7 @@ namespace WorkStream
        const ScratchData                       &sample_scratch_data,
        const CopyData                          &sample_copy_data,
        const unsigned int queue_length =        2*multithread_info.n_threads(),
-       const unsigned int chunk_size =          8,
-       const bool                               empty_copier = false)
+       const unsigned int chunk_size =          8)
   {
     // forward to the other function
     run (begin, end,
@@ -1455,8 +1432,7 @@ namespace WorkStream
          sample_scratch_data,
          sample_copy_data,
          queue_length,
-         chunk_size,
-         empty_copier);
+         chunk_size);
   }
 
 }
index 00fb6c6df81835fdd11351e002333e0c92828cd8..d242eaa816d6fabc34da0dd66954936a5dab17fd 100644 (file)
@@ -462,8 +462,7 @@ void DataOut<dim,DH>::build_patches (const Mapping<DH::dimension,DH::space_dimen
                     // given time (another 5% on the testcase discussed in
                     // @ref workstream_paper, on 32 cores) and if
                     8*multithread_info.n_threads(),
-                    64,
-         true);
+                    64);
 }
 
 
index 66c644751fe0132dd3b1928375d54c3a4fb34e11..79884b4258981d563f3bf9f516c4a357da6dfd33 100644 (file)
@@ -79,8 +79,6 @@ namespace internal
     {
       CopyData() {}
     };
-
-    void copier(CopyData const &) {}
   }
 }
 
@@ -669,10 +667,8 @@ approximate_derivative (const Mapping<dim,spacedim>    &mapping,
                        std_cxx1x::cref(mapping),
                        std_cxx1x::cref(dof_handler),
                        std_cxx1x::cref(solution),component)),
-    static_cast<std_cxx1x::function<void (internal::Assembler::CopyData const &)> >
-      (internal::Assembler::copier),internal::Assembler::Scratch (),
-      internal::Assembler::CopyData (),
-      2*multithread_info.n_threads(),8,true);
+    std_cxx1x::function<void (internal::Assembler::CopyData const &)> (),
+    internal::Assembler::Scratch (),internal::Assembler::CopyData ());
 }
 
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.