<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.0.11" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
	<title>Comments on: The X=X+1 Issue</title>
	<link>http://www.linux-mag.com/id/6121/</link>
	<description>Open Source, Open Standards</description>
	<pubDate>Fri, 21 Nov 2008 23:07:49 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.11</generator>

	<item>
		<title>by: kavadias</title>
		<link>http://www.linux-mag.com/id/6121/#comment-1164</link>
		<pubDate>Sat, 07 Jun 2008 20:23:44 +0000</pubDate>
		<guid>http://www.linux-mag.com/id/6121/#comment-1164</guid>
					<description>Interesting!! Your definition of  SUM(1) and SUM(I) is close to the definition
SUM(I,J) if (I==J) THEN RETURN J
   ELSE RETURN { SUM( I, (I+J)/2 ) + SUM( ((I+J)/2)+1, J ) }

that is easier to parallelize. In this sense it might make easier for programmers to learn how to write parallelizable code. But this can be done all the same in imperative programming, although it may take some (more?) training, and is only because of the more abstract approach to "what" instead of "how" ...
    Other than that I'm very curious what you can make out of not using multiple assignment. My SUM(I,J) (implicitely) introduces a tree of intermediate variables that would help parallelization. This is because of recursion that is closer to parallelization of the devide-and-conquer style...</description>
		<content:encoded><![CDATA[<p>Interesting!! Your definition of  SUM(1) and SUM(I) is close to the definition<br />
SUM(I,J) if (I==J) THEN RETURN J<br />
   ELSE RETURN { SUM( I, (I+J)/2 ) + SUM( ((I+J)/2)+1, J ) }</p>
<p>that is easier to parallelize. In this sense it might make easier for programmers to learn how to write parallelizable code. But this can be done all the same in imperative programming, although it may take some (more?) training, and is only because of the more abstract approach to &#8220;what&#8221; instead of &#8220;how&#8221; &#8230;<br />
    Other than that I&#8217;m very curious what you can make out of not using multiple assignment. My SUM(I,J) (implicitely) introduces a tree of intermediate variables that would help parallelization. This is because of recursion that is closer to parallelization of the devide-and-conquer style&#8230;
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: Christopher Moore</title>
		<link>http://www.linux-mag.com/id/6121/#comment-1162</link>
		<pubDate>Fri, 06 Jun 2008 10:32:18 +0000</pubDate>
		<guid>http://www.linux-mag.com/id/6121/#comment-1162</guid>
					<description>300 baud ???

Boy, your ASR33 was _fast_ ;-)

Mine was 110 baud :(</description>
		<content:encoded><![CDATA[<p>300 baud ???</p>
<p>Boy, your ASR33 was _fast_ ;-)</p>
<p>Mine was 110 baud :(
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: avagothen</title>
		<link>http://www.linux-mag.com/id/6121/#comment-1161</link>
		<pubDate>Fri, 06 Jun 2008 09:49:01 +0000</pubDate>
		<guid>http://www.linux-mag.com/id/6121/#comment-1161</guid>
					<description>Very nice idea on a very real problem.
Unfortunately, your recursive solution will not run any faster on a parallel machine as each iteration depends on, and so has to wait for, the result of the next before completing.  Likewise, each iteration can only be spawned by the one before.  

Any code inserted between "NEW_I=I-1" and "RETURN..." could be run in parallel, but only if NEW_I isn't (or can't be) changed within that block.  It would take some dandy compiler or interpreter to work out if/how to parallelise that.

Could such a piece of software be the solution to this whole problem?  If so, the procedural/declarative distinction would become largely irrelevant.  More likely, the programmer has to be smart, not the software.

On the plus side, it does abstract the problem by a level and gets people thinking about it.  Hmmm...</description>
		<content:encoded><![CDATA[<p>Very nice idea on a very real problem.<br />
Unfortunately, your recursive solution will not run any faster on a parallel machine as each iteration depends on, and so has to wait for, the result of the next before completing.  Likewise, each iteration can only be spawned by the one before.  </p>
<p>Any code inserted between &#8220;NEW_I=I-1&#8243; and &#8220;RETURN&#8230;&#8221; could be run in parallel, but only if NEW_I isn&#8217;t (or can&#8217;t be) changed within that block.  It would take some dandy compiler or interpreter to work out if/how to parallelise that.</p>
<p>Could such a piece of software be the solution to this whole problem?  If so, the procedural/declarative distinction would become largely irrelevant.  More likely, the programmer has to be smart, not the software.</p>
<p>On the plus side, it does abstract the problem by a level and gets people thinking about it.  Hmmm&#8230;
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: gsmyth</title>
		<link>http://www.linux-mag.com/id/6121/#comment-1157</link>
		<pubDate>Fri, 06 Jun 2008 01:04:24 +0000</pubDate>
		<guid>http://www.linux-mag.com/id/6121/#comment-1157</guid>
					<description>Is multiple assignment bad in parallel computing? In parallel programming we would essentially  look at what level of granularity we want to break down the data to be processed over the number of recursive loops to process and assign the computations to threads over various cores. The issue would be synchronising the partial results into a shared location and the synchronisation overhead in this case although necessary would slow the computation down. (assuming thread-safe libraries).
Or perhaps say a high level of granularity would be better and increase the time period between synchronisation points. This discussion may be useful to mention and further comment in the article.
Checking on metrics via sar or clock execution times will determine how well the granularity is performing.</description>
		<content:encoded><![CDATA[<p>Is multiple assignment bad in parallel computing? In parallel programming we would essentially  look at what level of granularity we want to break down the data to be processed over the number of recursive loops to process and assign the computations to threads over various cores. The issue would be synchronising the partial results into a shared location and the synchronisation overhead in this case although necessary would slow the computation down. (assuming thread-safe libraries).<br />
Or perhaps say a high level of granularity would be better and increase the time period between synchronisation points. This discussion may be useful to mention and further comment in the article.<br />
Checking on metrics via sar or clock execution times will determine how well the granularity is performing.
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: mike miller</title>
		<link>http://www.linux-mag.com/id/6121/#comment-1151</link>
		<pubDate>Thu, 05 Jun 2008 20:11:44 +0000</pubDate>
		<guid>http://www.linux-mag.com/id/6121/#comment-1151</guid>
					<description>This seems fitting.

Hey Hey 16k.

http://www2.b3ta.com/heyhey16k/

Enjoy the video.</description>
		<content:encoded><![CDATA[<p>This seems fitting.</p>
<p>Hey Hey 16k.</p>
<p><a href="http://www2.b3ta.com/heyhey16k/" rel="nofollow">http://www2.b3ta.com/heyhey16k/</a></p>
<p>Enjoy the video.
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: ruzam</title>
		<link>http://www.linux-mag.com/id/6121/#comment-1142</link>
		<pubDate>Thu, 05 Jun 2008 16:05:49 +0000</pubDate>
		<guid>http://www.linux-mag.com/id/6121/#comment-1142</guid>
					<description>I'm sure there will be more of a point to this later, but all you've demonstrated is recursive style vs non-recursive style which doesn't have much of anything to do with imperative vs declarative style.

You're SUM() example could be just as easily coded as a 'single assignment' recursive function in any procedural language that support s recursion (in as few lines with as much programmer efficiency).  But as you say "how the rules are executed is up the declarative language".  How the rules are executed is also up to the imperative language.  Each coding method can be equally tuned (or broken) for parallel execution.</description>
		<content:encoded><![CDATA[<p>I&#8217;m sure there will be more of a point to this later, but all you&#8217;ve demonstrated is recursive style vs non-recursive style which doesn&#8217;t have much of anything to do with imperative vs declarative style.</p>
<p>You&#8217;re SUM() example could be just as easily coded as a &#8217;single assignment&#8217; recursive function in any procedural language that support s recursion (in as few lines with as much programmer efficiency).  But as you say &#8220;how the rules are executed is up the declarative language&#8221;.  How the rules are executed is also up to the imperative language.  Each coding method can be equally tuned (or broken) for parallel execution.
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: Tommy Phillips</title>
		<link>http://www.linux-mag.com/id/6121/#comment-1140</link>
		<pubDate>Thu, 05 Jun 2008 15:41:37 +0000</pubDate>
		<guid>http://www.linux-mag.com/id/6121/#comment-1140</guid>
					<description>Maybe it's just me, or maybe it's just a clumsy example, but it looks to me as if you &lt;em&gt;are&lt;/em&gt; telling the computer how to do the sum.  You are just telling it how using recursion rather than looping.

I'm not saying it's completely equivalent, but it doesn't seem to be clearly superior.

Not in this case, anyway.</description>
		<content:encoded><![CDATA[<p>Maybe it&#8217;s just me, or maybe it&#8217;s just a clumsy example, but it looks to me as if you <em>are</em> telling the computer how to do the sum.  You are just telling it how using recursion rather than looping.</p>
<p>I&#8217;m not saying it&#8217;s completely equivalent, but it doesn&#8217;t seem to be clearly superior.</p>
<p>Not in this case, anyway.
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: fernandoaren</title>
		<link>http://www.linux-mag.com/id/6121/#comment-1135</link>
		<pubDate>Wed, 04 Jun 2008 13:55:41 +0000</pubDate>
		<guid>http://www.linux-mag.com/id/6121/#comment-1135</guid>
					<description>10 Neat. 
20 And now you tell me there's something else than BASIC 
30 Geez.
40 GOTO 10</description>
		<content:encoded><![CDATA[<p>10 Neat.<br />
20 And now you tell me there&#8217;s something else than BASIC<br />
30 Geez.<br />
40 GOTO 10
</p>
]]></content:encoded>
				</item>
</channel>
</rss>
