From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8309 invoked by alias); 9 Jul 2008 13:10:10 -0000 Received: (qmail 8289 invoked by uid 22791); 9 Jul 2008 13:10:08 -0000 X-Spam-Check-By: sourceware.org Received: from iramx2.ira.uni-karlsruhe.de (HELO iramx2.ira.uni-karlsruhe.de) (141.3.10.81) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 09 Jul 2008 13:09:37 +0000 Received: from irams1.ira.uni-karlsruhe.de ([141.3.10.5]) by iramx2.ira.uni-karlsruhe.de with esmtps id 1KGZQL-0003zU-AH; Wed, 09 Jul 2008 15:09:34 +0200 Received: from i10pc67.ilkd.uni-karlsruhe.de ([141.3.24.67]) by irams1.ira.uni-karlsruhe.de with esmtp id 1KGZQL-0003Li-4q; Wed, 09 Jul 2008 15:09:33 +0200 Message-ID: <4874B88C.50607@ira.uka.de> Date: Wed, 09 Jul 2008 13:33:00 -0000 From: Johannes Singler User-Agent: Thunderbird 2.0.0.14 (X11/20080421) MIME-Version: 1.0 To: Benjamin Kosnik , gcc-patches@gcc.gnu.org, libstdc++ Subject: Re: [PATCH][libstdc++-v3 parallel mode] References: <487387CF.80609@ira.uka.de> <20080708160343.5b7c75f0@balbo.artheist.org> In-Reply-To: <20080708160343.5b7c75f0@balbo.artheist.org> Content-Type: multipart/mixed; boundary="------------060808010004000406080303" X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2008-07/txt/msg00707.txt.bz2 This is a multi-part message in MIME format. --------------060808010004000406080303 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 539 Benjamin Kosnik wrote: >> 2008-07-08 Johannes Singler >> >> * include/parallel/random_shuffle.h: >> (sequential_random_shuffle) Copy data back. > > OK, but this seems like the kind of thing you should really add a > testcase for so that it doesn't regress. Okay, so here is the first functionality test case for random_shuffle (That's why I called it 1.cc, not after the PR). However, to trigger the bug, a quite long sequence must be permuted, which costs time and space. Okay? -- Johannes --------------060808010004000406080303 Content-Type: text/x-patch; name="random_shuffle_copy_back_PR36729.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="random_shuffle_copy_back_PR36729.patch" Content-length: 2743 Index: include/parallel/random_shuffle.h =================================================================== --- include/parallel/random_shuffle.h (revision 137616) +++ include/parallel/random_shuffle.h (working copy) @@ -491,6 +491,9 @@ rng); } + // Copy elements back. + std::copy(target, target + n, begin); + delete[] dist0; delete[] dist1; delete[] oracles; Index: testsuite/25_algorithms/random_shuffle/1.cc =================================================================== --- testsuite/25_algorithms/random_shuffle/1.cc (revision 0) +++ testsuite/25_algorithms/random_shuffle/1.cc (revision 0) @@ -0,0 +1,75 @@ +// Copyright (C) 2001 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 25.2.11 random_shuffle() + +#include +#include + +bool test __attribute__((unused)) = true; + +const int N = 200000; +int A[N], s1[N]; + +#if _GLIBCXX_PARALLEL +#define TAG , __gnu_parallel::sequential_tag() +#else +#define TAG +#endif + +void fill_ascending() +{ + for (int i = 0; i < N; ++i) + A[i] = i; +} + +void +test01() +{ + fill_ascending(); +#if _GLIBCXX_PARALLEL + for (int num_threads = 1; num_threads <= 2; ++num_threads) + { + omp_set_num_threads(num_threads); +#endif + std::copy(A, A + N, s1); + VERIFY(std::equal(s1, s1 + N, A TAG)); + + std::random_shuffle(s1, s1 + N); + // the chance that random_shuffle leaves the order as is by coincidence + // is negligible, so we expect it to be permuted + VERIFY(!std::equal(s1, s1 + N, A TAG)); + + std::sort(s1, s1 + N TAG); + VERIFY(std::equal(s1, s1 + N, A TAG)); +#if _GLIBCXX_PARALLEL + } +#endif +} + +int +main() +{ +#if _GLIBCXX_PARALLEL + __gnu_parallel::_Settings gpms = __gnu_parallel::_Settings::get(); + gpms.algorithm_strategy = __gnu_parallel::force_parallel; + __gnu_parallel::_Settings::set(gpms); +#endif + test01(); + return 0; +} --------------060808010004000406080303--