<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Observations from Uppsala &#187; manycore</title>
	<atom:link href="http://jakob.engbloms.se/archives/tag/manycore/feed" rel="self" type="application/rss+xml" />
	<link>http://jakob.engbloms.se</link>
	<description>Computer Technology: Simulation, Virtualization, Virtual Platforms, Embedded, Multicore and Multiprocessing (by Jakob Engblom)</description>
	<lastBuildDate>Sun, 29 Jan 2012 19:45:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<image>
    <title>Observations from Uppsala</title>
    <url>http://jakob.engbloms.se/favicon.png</url>
    <link>http://jakob.engbloms.se</link>
    <width>32</width>
    <height>32</height>
    <description>Observations from Uppsala - http://jakob.engbloms.se</description>
    </image>		<item>
		<title>MCC 2009: 2D Stream Processing for Manycore</title>
		<link>http://jakob.engbloms.se/archives/1015?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/1015#comments</comments>
		<pubDate>Thu, 26 Nov 2009 15:03:40 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[multicore software]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[David Black-Schaffer]]></category>
		<category><![CDATA[efficiency]]></category>
		<category><![CDATA[manycore]]></category>
		<category><![CDATA[MCC]]></category>
		<category><![CDATA[Stanford]]></category>
		<category><![CDATA[Stream programming]]></category>
		<category><![CDATA[UpMarc]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=1015</guid>
		<description><![CDATA[Today here at the MCC 2009 workshop, I heard an interesting talk by David Black-Schaffer of Stanford university.  His work is on stream programming for image processing (&#8220;2D streams&#8221;). Pretty simple basic idea, to use 2D blobs of pixels as kernel inputs rather than single values or vectors. Makes eminent sense for image processing. What [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.it.uu.se/research/upmarc"><img class="alignleft size-full wp-image-1016" style="margin-top: 10px; margin-bottom: 10px;" title="UPMARC_700x150" src="http://jakob.engbloms.se/wp-content/uploads/2009/11/UPMARC_700x150.gif" alt="UPMARC_700x150" width="122" height="45" /></a>Today here at the <a href="http://www.it.uu.se/research/upmarc/MCC09/prog">MCC 2009 workshop</a>, I heard an interesting talk by <a href="http://cva.stanford.edu/people/davidbbs/">David Black-Schaffer </a>of Stanford university.  His work is on stream programming for image processing (&#8220;2D streams&#8221;). Pretty simple basic idea, to use 2D blobs of pixels as kernel inputs rather than single values or vectors. Makes eminent sense for image processing.</p>
<p><span id="more-1015"></span>What was striking was his basic attitude to the target machines: he assumed &#8220;manycore&#8221; like 100-way Tilera, 320-way ATI/AMD graphics processors, and similar devices. With these many cores, the goal is to implement an algorithm using a few cores as possible to save power. He assumes that there are always cores available, and wastes no time reducing the core count. One kernel on each core, including replicated kernels and synthesized buffering kernels.</p>
<p>This was the best example I have seen so far on an actual implementation of idea that <strong>cores are free</strong>. For previous writing on this topic, see &#8220;<a href="http://jakob.engbloms.se/archives/269">what is efficiency when cores are free</a>&#8221; and &#8220;<a href="http://jakob.engbloms.se/archives/123">real-time control when cores are free</a>&#8220;.</p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/1015"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/1015" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/1015" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/1015/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Nulticore Effect&#8221;</title>
		<link>http://jakob.engbloms.se/archives/447?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/447#comments</comments>
		<pubDate>Tue, 09 Dec 2008 19:50:08 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[embedded systeme]]></category>
		<category><![CDATA[multicore computer architecture]]></category>
		<category><![CDATA[multicore software]]></category>
		<category><![CDATA[Embarrassingly Parallel]]></category>
		<category><![CDATA[IEEE Spectrum]]></category>
		<category><![CDATA[Jack Ganssle]]></category>
		<category><![CDATA[manycore]]></category>
		<category><![CDATA[memory bandwidth]]></category>
		<category><![CDATA[Sandia Labs]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=447</guid>
		<description><![CDATA[Jack Ganssle wrote a column about the failure of multicore to scale, based on an article in IEEE Spectrum. He makes the following claim: Now a study in IEEE Spectrum shows that even for the classic embarrassingly parallel problems like weather simulations multicore offers little benefit. The curve in that article is priceless. As the [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-270" title="onoff" src="http://jakob.engbloms.se/wp-content/uploads/2008/09/onoff.png" alt="" width="72" height="70" />Jack Ganssle <a href="http://www.embedded.com/columns/breakpoint/212300032">wrote a column about the failure of multicore to scale</a>, based on an <a href="http://www.spectrum.ieee.org/nov08/6912">article in IEEE Spectrum</a>. He makes the following claim:</p>
<blockquote><p>Now a <a style="font-weight: bold;" href="http://www.spectrum.ieee.org/nov08/6912">study in IEEE Spectrum</a> shows that even for the classic embarrassingly parallel problems like weather simulations multicore offers little benefit. The curve in that article is priceless. As the number of cores grow from two to 64 performance plummets by a factor of five. Additional processors nullify each other.</p>
<p>Call it the <span style="font-weight: bold;">Nulticore Effect.</span></p>
<p><span id="more-447"></span></p></blockquote>
<p>I think that Jack misunderstood some of the article. What it really says, as far as I can tell, is that certain types of applications will have problems with the lower external memory bandwidth per core afforded by a 16-way or 32-way multicore based on traditional processor architectures.</p>
<p>As I read it, regular classic &#8220;embarrassingly parallel&#8221; (or as Grant Martin would say, &#8220;proudly parallel&#8221;) problems can be handled by managing data location and computation location carefully to colocate data and code, which lends itself to on-chip caching and probably also local-memory architectures.</p>
<p>When other problems that are less regular are going to run into the memory bandwidth wall:</p>
<blockquote><p>But an increasing number of important science and                 engineering problems—not to mention national security                 problems—are of a different sort. These fall under the                 general category of informatics and include calculating                 what happens to a transportation network during a                 natural disaster and searching for patterns that predict                 terrorist attacks or nuclear proliferation failures.                 These operations often require sifting through enormous                 databases of information.</p></blockquote>
<p>So while I think the Sandia people have a very good point to make, it is not the end of the usefulness of multicore. It is only the case for bandwidth-intense irregular algorithms, while many systems today make good use of hundreds of cores without a problem. Also, the research in IEEE Spectrum proposes a solution in the form of stacked memory &#8212; so what we really have is a bit of PR for a particular kind of architecture&#8230;</p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/447"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/447" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/447" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/447/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is Efficiency when Cores are Free?</title>
		<link>http://jakob.engbloms.se/archives/269?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/269#comments</comments>
		<pubDate>Sat, 13 Sep 2008 16:48:19 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[embedded software]]></category>
		<category><![CDATA[embedded systeme]]></category>
		<category><![CDATA[multicore computer architecture]]></category>
		<category><![CDATA[multicore software]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[efficiency]]></category>
		<category><![CDATA[manycore]]></category>
		<category><![CDATA[operating systems]]></category>
		<category><![CDATA[SiCS Multicore days]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=269</guid>
		<description><![CDATA[More from the SiCS multicore days 2008. There were some interesting comments on how to define efficiency in a world of plentiful cores. The theme from my previous blog post called &#8220;Real-Time Control when Cores Become Free&#8221; came up several times during the talks, panels, and discussions. It seems that this year, everybody agreed that [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-270" style="margin-left: 5px; margin-right: 5px;" title="onoff" src="http://jakob.engbloms.se/wp-content/uploads/2008/09/onoff.png" alt="" width="72" height="70" />More from the SiCS multicore days 2008.</p>
<p>There were some interesting comments on how to define efficiency in a world of plentiful cores. The theme from my previous blog post called &#8220;<a href="http://jakob.engbloms.se/archives/123">Real-Time Control when Cores Become Free</a>&#8221; came up several times during the talks, panels, and discussions. It seems that this year, everybody agreed that we are heading to 100s or 1000s of &#8220;self-respecting&#8221; cores on a single chip, and that with that kind of core count, it is not too important to keep them all busy at all times at any cost. As I stated earlier, cores and instructions are now free, while other aspects are limiting, turning the classic optimization imperatives of computing on its head. Operating systems will become more about space-sharing than time-sharing, and it might make sense to dedicate processing cores to the sole job of impersonating peripheral units or doing polling work. Operating systems can also be simplified when the job of time-sharing is taken away, even if communications and resource management might well bring in some new interesting issues.</p>
<p>So, what is efficiency in this kind of environment?</p>
<p><span id="more-269"></span></p>
<p>It was clear from both the panel discussion and discussions over lunch that programmer productivity and predictability are things that can be traded for absolute100% load on all cores. Just like making 100% use of main memory is not usually a design goal today, so making 100% use of all processor cores is not a reasonable the goal tomorrow. Some resources are so plentiful that it makes sense not to try to push usage to the limit.</p>
<p>With 100s of cores, it is quite likely that even for the most performance-demanding loads like doing LTE decoding, it is not worth the herculean effort to get all cores running at full speed all the time. Getting 80% to 90% of the cores working on a workload is probably a good tradeoff.</p>
<p>Another tradeoff you can make is to increase determinism and debuggability by assigning tasks and schedules in a more static and predictable way. Instead of trying to balance loads across the cores, tasks could be assigned in some static or semi-static manner, so that the execution of a system can be repeated with some chance of success. That should not be too hard if all cores run a static cyclic scheduler, for example, or even a single task on each core. Dynamic scheduling might well be a global suboptimization in a world with plenty of cores, as it just makes things more complex for a fairly small increase in actual efficiency. You could also imagine putting debug agents and code on certain cores just to help you get better insight into what the system is doing. A bit like <a href="http://jakob.engbloms.se/archives/17">I blogged about after last year&#8217;s Multicore Day</a>, asking designers to put more silicon into debug functionality. Maybe in a 100s of core device, we allocate cores to debug as well (I do not think we can do without dedicated debug circuitry, as that is needed to effect things like stopping cores quickly and similar).,</p>
<p>When I heard this, my gut reaction was that &#8220;hey, that is not particularly environmental&#8221; &#8212; any kind of waste of resources is really an anathema to the ecologically friendly society we need to build over the next 10-20 years. But then someone pointed out that a key part of the efficiency equation is that you turn off the unused cores and accelerators so they do not use any power. And since the cores are a resource that keeps increasing in count from basically the same use of resources  (manufacturing a chip will cost about the same amount of energy and materials for each chip, but with finer geometries you pack double the number of cores in it), it should be fine. It should also be noted that multicore computing by itself allows for more efficient processing units, for a variety of reasons.</p>
<p>Robustness also tends to increase if you have some slack in your system. For example, most hard real-time systems insist on not being more than 80% loaded or so (on a single CPU) even at the worst of tested times. To have some margin for the inevitable unexpected situations. For a 100s of cores device, you might also want to spare some cores for the case that hardware faults crop up in certain parts of the chip. Then you can shift loads to other cores (which obviously requires a pretty resilient interconnect to make any sense).</p>
<p>This final point bring me to my final thought on this was of building computing systems: in some way, we get closer to physical engineering habits when cores are free. We do not build bridges with the minimum amount of concrete and steel to handle the load we expect. Instead, there is a margin of error of a factor of three or five or so, to make sure that even in the most unexpected of unknown circumstances, that bridge will still stand. In a similar way, we might be able to use lots of free cores to engineer software systems that have far more resilience in them than todays systems that keep trying to make maximum use of the resource of clock cycles and instruction processing count. I do not quite know how that kind of system would look, but the analogy is very interesting.</p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/269"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/269" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/269" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/269/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Real-time control when cores become free</title>
		<link>http://jakob.engbloms.se/archives/123?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/123#comments</comments>
		<pubDate>Sun, 18 May 2008 20:00:20 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[embedded software]]></category>
		<category><![CDATA[embedded systeme]]></category>
		<category><![CDATA[multicore computer architecture]]></category>
		<category><![CDATA[multicore software]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[efficiency]]></category>
		<category><![CDATA[Integrated Modular Avionics]]></category>
		<category><![CDATA[manycore]]></category>
		<category><![CDATA[MERASA]]></category>
		<category><![CDATA[propeller chip]]></category>
		<category><![CDATA[Tensilica]]></category>
		<category><![CDATA[TimeSys]]></category>
		<category><![CDATA[wcet]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=123</guid>
		<description><![CDATA[A very interesting idea that has been bandied around for a while in manycore land is the notion that in the future, we will see a total inversion in today&#8217;s cost intuition for computers. Today, we are all versed in the idea that processor cores and processing times are quite precious, while memory is free. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="float: left; margin-left: 10px; margin-right: 10px;" title="shrinking core" src="http://jakob.engbloms.se/wp-content/uploads/2008/05/coreshrink.png" alt="Image" />A very interesting idea that has been bandied around for a while in manycore land is the notion that in the future, we will see a total inversion in today&#8217;s cost intuition for computers. Today, we are all versed in the idea that processor cores and processing times are quite precious, while memory is free. For best performance, you need to care about the cache system, but in the end, the goal is to keep those processor pipelines as busy as possible. Processors have traditionally been the most expensive part of a system, and ideas such as <a href="http://jakob.engbloms.se/archives/58">Integrated Modular Avionics</a> are invented to make the best use of a resource perceived as rare and expensive&#8230;</p>
<p>But is that really always going to be true? Is it reasonably to think of CPU cores are being free but other resources as expensive? And what happens to program and system design then?</p>
<p><span id="more-123"></span></p>
<p>This idea was brought up again in an interview in edition 33 of <a href="http://www.timesys.com/resources/podcast">TimeSys LinuxLink Radio podcast </a>with the creators of the <a href="http://www.parallax.com/Default.aspx?tabid=407">Propeller chip</a>, <a href="http://www.parallax.com/">Parallax</a>. In this chip, they abandon interrupts and instead dedicate entire processors to various IO tasks. The cores stay in very low power mode until something interesting happen on IO pins, and then wake up and process. No interrupts, no interrupt handler, almost zero latency. Very good for real-time systems. The intuition you have just screams &#8220;why not share the IO load on a single processor&#8221;? Which is old wisdom, processors are expensive. And having a bunch of them just waiting in deep sleep for something to happen seems absolutely nonsensical. Especially as the current propeller chip only has eight cores, it seems a bit limiting and just screaming for timesharing and/or virtualization to handle a few more tasks than eight&#8230;</p>
<p>But is it really?</p>
<p>Consider the alternative design. A much more powerful processor running an operating system with all its associated overhead. For hard real-time control, what you do there is either use a static time-driven scheduler or use event-driven programs with an analysis that makes sure that you can always meet all deadlines. And these solutions have a hard time reaching 100 percent CPU usage and usually involve a fairly high interrupt latency.  For really short real-time latencies, you end up vastly overprovisioning the processor in order to make sure that the cycles that an interrupt takes to process in overhead pass as quickly as possible. With caches, you either have to lock them or once again vastly overprovision the processor to make sure to meet guaranteed latencies.</p>
<p>The interesting question that I do not have really good numbers for is for a given problem of say ten critical real-time tasks, using ten simple cores doing one thing each or sharing ten critical tasks on a single core is the least expensive solution hardware-wise. Since it seems that in general, to make a processor ten times faster you need either ten times the clock frequency or a significantly larger die, it is not clear-cut. Especially not with a tough latency constraint.</p>
<p>If you factor in the cost of software development and validation of system functionality, I am pretty sure that the multiple simple cores approach is very competitive. Instead of analyzing a complex concurrent software system full of potential nasty shared resources and unknown software paths, you can handle ten small programs running on simple cores with simple timing, and with shared resources that are at least obvious from the hardware design.</p>
<p>There will be shared resources, be sure of that. If nothing else, <a href="http://jakob.engbloms.se/archives/83">the memory controller will be an issue</a>. The propeller chip solves this by strictly temporally sharing memory access between the cores in a fixed static schedule. Predictability before all!</p>
<p><img class="alignright" style="float: right; margin-left: 10px; margin-right: 10px;" src="http://www.merasa.org/img/logo-small.png" alt="" width="191" height="191" />Note that the EU STREP project called <a href="http://www.merasa.org/overview.html">MERASA </a>is looking into something that could be related to this idea, with 2 to 16 cores per chip with lots of predictability piled on.</p>
<p><strong>Marketing it</strong></p>
<p>Selling such a chip as a standard part would seem to make sense as well, as most control systems are fairly low-volume. The propeller chip is very small, eight cores only, but if you look at what Ambric and Picochip are doing, it is easy to envision a controller part with twenty or a hundred little cores on. That could be really cool <img src='http://jakob.engbloms.se/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>If you have a high-volume part, I guess you could build that control ASIC yourself today, around something like a <a href="http://www.tensilica.com">Tensilica </a>pile of cores, which have been proven to scale to hundreds of cores even today in custom ASICs.</p>
<p>A half-way design in this style is the Freescale 5514-15-16 parts which combine a compute core with a smaller core to handle all the interrupts. If nothing else, this validates the fundamental idea of interrupts being an issue. Putting all interrupts on a secondary core could be seen as a bandaid on a bandaid&#8230; but it sure makes sense if the cores are not considered free.</p>
<p>Will be interesting to see what the future brings.</p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/123"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/123" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/123" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/123/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

