<!-- 
RSS generated by JIRA (4.4#649-r158309) at Wed Jun 19 03:25:58 CDT 2013

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
For example:
http://dev.clojure.org/jira/si/jira.issueviews:issue-xml/CLJ-862/CLJ-862.xml?field=key&field=summary
-->
<rss version="0.92" >
<channel>
    <title>Clojure JIRA</title>
    <link>http://dev.clojure.org/jira</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>4.4</version>
        <build-number>649</build-number>
        <build-date>25-07-2011</build-date>
    </build-info>

<item>
            <title>[CLJ-862] pmap level of parallelism inconsistent for chunked vs non-chunked input</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-862</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The code of pmap creates futures for the set of map operations it needs to perform with (map #(future %) coll), then acts on that sequence in a fashion obviously intended to keep only #CPUs+2 unfinished futures realized at any given time.  It works exactly this way for non-chunked input seqs, but when pmap is passed a chunked seq, the seq of futures also becomes chunked.  This causes an arbitrary number of futures to be realized as the #CPUs+2 window and chunk-size window interact.&lt;/p&gt;

&lt;p&gt;The doc-string for pmap doesn&apos;t promise any particular level of parallelism, but I think the inconsistent parallelism for chunked vs non-chunked input comprises a bug.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14805">CLJ-862</key>
            <summary>pmap level of parallelism inconsistent for chunked vs non-chunked input</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="jim.blomo">Jim Blomo</assignee>
                                <reporter username="llasram">Marshall T. Vandegrift</reporter>
                        <labels>
                    </labels>
                <created>Sun, 23 Oct 2011 09:50:38 -0500</created>
                <updated>Sat, 20 Oct 2012 00:45:48 -0500</updated>
                                    <version>Release 1.1</version>
                <version>Release 1.2</version>
                <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Reviewed Backlog</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="27093" author="stu" created="Tue, 25 Oct 2011 18:51:55 -0500"  >&lt;p&gt;Next person to take a deep look at pmap should probably also think through fork/join.&lt;/p&gt;</comment>
                    <comment id="28533" author="jim.blomo" created="Sat, 19 May 2012 00:31:23 -0500"  >&lt;p&gt;fork/join is a Java 7 feature. Would a proposed patch need to be able to fall back to Java 5 features?&lt;/p&gt;</comment>
                    <comment id="28535" author="jafingerhut" created="Sat, 19 May 2012 01:06:37 -0500"  >&lt;p&gt;Clojure/core folks can say more authoritatively, but I believe with the recent reduce enhancements that rely on jsr166 code, Clojure 1.5 will most likely require Java 6 or later, and Java 5 will no longer be supported.&lt;/p&gt;</comment>
                    <comment id="28630" author="jim.blomo" created="Mon, 28 May 2012 17:29:01 -0500"  >&lt;p&gt;Spinning up more threads than CPU cores is not a good idea when the work is CPU bound.  Currently (1.4) pmap uses an unbounded thread pool, so chunked sequences will create more threads than intended.  The least invasive change is to use a fixed sized thread pool (ForkJoinPool being one example).  pmap is differentiated from core.reducers by the fact that it is lazy.  This implies a one-at-a-time ThreadPool.submit model, instead of the recursive fork/join model.  Tradeoffs include:&lt;/p&gt;

&lt;p&gt;Enforce look-ahead even on chunked sequences:&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;+ no threadPool changes&lt;/li&gt;
	&lt;li&gt;- working against chunking, which is presumably being used for a reason&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Move to a fixed size thread pool:&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;+ reduce contention for cpu-bound functions on chunked sequences&lt;/li&gt;
	&lt;li&gt;- increase total realization time for io-bound functions&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Use ForkJoinPool for fixed thread pool (instead of newFixedThreadPool):&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;+ automatic and dynamic parallelism&lt;/li&gt;
	&lt;li&gt;- more complex setup (picking Java 6 vs 7 implementation, sharing pool with core.reducers)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I think using a traditional fixed size thread pool is the right option.  Most of the time all of pmap&apos;s results will be realized, so I don&apos;t think it&apos;s worth saving work by being strict about the look-ahead size.  This is also the decision map has made.  Since we&apos;re not using ForkJoin&apos;s main strength (recursive work queuing), I don&apos;t think it is worth setting it up in clojure.core.&lt;/p&gt;

&lt;p&gt;I&apos;ll use Agent/pooledExecutor as the fixed size thread.&lt;/p&gt;

&lt;p&gt;Let me know if I forgot or misunderstood anything.&lt;/p&gt;</comment>
                    <comment id="28637" author="jim.blomo" created="Mon, 28 May 2012 19:59:01 -0500"  >&lt;p&gt;2012-05-28 pmap-chunking-862.diff uses a fixed size thread pool for pmap functions.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11265" name="pmap-chunking-862.diff" size="2825" author="jim.blomo" created="Mon, 28 May 2012 19:59:01 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>
</channel>
</rss>