http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47433

           Summary: libstdc++ parallel mode calls std::swap explicitely
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: critical
          Priority: P3
         Component: libstdc++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: manuel.holtgr...@fu-berlin.de


The parallel libstdc++ calls std::swap explicitely. To my knowledge, this
disables the user to specify his own, possibly more efficient swap routine.
This is especially severe in parallel sorting and partitioning.

 libstdc++-v3-parallel-trunk $ ack 'std::swap'
balanced_quicksort.h
135:    std::swap(*__pivot_pos, *(__end - 1));
147:      std::swap(*(__begin + __split_pos), *__pivot_pos);
287:            std::swap(*__pivot_pos, *(__end - 1));
306:            std::swap(*__split_pos1, *__pivot_pos);

losertree.h
237:        std::swap(_M_losers[__pos]._M_sup, __sup);
238:        std::swap(_M_losers[__pos]._M_source, __source);
239:        std::swap(_M_losers[__pos]._M_key, __key);
333:        std::swap(_M_losers[__pos]._M_sup, __sup);
334:        std::swap(_M_losers[__pos]._M_source, __source);
335:        std::swap(_M_losers[__pos]._M_key, __key);
464:        std::swap(_M_losers[__pos]._M_sup, __sup);
465:        std::swap(_M_losers[__pos]._M_source, __source);
466:        std::swap(_M_losers[__pos]._M_keyp, __keyp);
541:        std::swap(_M_losers[__pos]._M_sup, __sup);
542:        std::swap(_M_losers[__pos]._M_source, __source);
543:        std::swap(_M_losers[__pos]._M_keyp, __keyp);
697:        std::swap(_M_losers[__pos]._M_source, __source);
698:        std::swap(_M_losers[__pos]._M_key, __key);
788:        std::swap(_M_losers[__pos]._M_source, __source);
789:        std::swap(_M_losers[__pos]._M_key, __key);
937:        std::swap(_M_losers[__pos]._M_source, __source);
938:        std::swap(_M_losers[__pos]._M_keyp, __keyp);
1027:        std::swap(_M_losers[__pos]._M_source, __source);
1028:        std::swap(_M_losers[__pos]._M_keyp, __keyp);

partition.h
181:              std::swap(__begin[__thread_left],
241:          std::swap_ranges(__begin + __thread_left_border
264:          std::swap_ranges(__begin + __thread_right_border,
304:        std::swap(__begin[__final_left], __begin[__final_right]);
357:            std::swap(*__pivot_pos, *(__end - 1));
379:            std::swap(*__split_pos1, *__pivot_pos);

Reply via email to