Hi all We have been using OpenMPI for many years with Ubuntu on our 20-node cluster. Each node has 2 quad cores, so we usually run up to 8 processes on each node up to a maximum of 160 processes.
However, we just upgraded the cluster to Ubuntu 11.04 with Open MPI 1.4.3 and and have come across a strange behavior where mpi programs run perfectly well when confined to one node but hangs during communication across multiple nodes. We have no idea why and would like some help in debugging this. A small MPI test program is attached and typical output shown below. Hope someone can help us Cheers and thanks Ole Nielsen -------------------- Test output across two nodes (This one hangs) -------------------------- nielso@alamba:~/sandpit/pypar/source$ mpirun --hostfile /etc/mpihosts --host node17,node18 --npernode 2 a.out Number of processes = 4 Test repeated 3 times for reliability I am process 1 on node node17 P1: Waiting to receive from to P0 I am process 0 on node node17 Run 1 of 3 P0: Sending to P1 I am process 2 on node node18 P2: Waiting to receive from to P1 I am process 3 on node node18 P3: Waiting to receive from to P2 P1: Sending to to P2 -------------------- Test output within one node (This one is OK) -------------------------- nielso@alamba:~/sandpit/pypar/source$ mpirun --hostfile /etc/mpihosts --host node17 --npernode 4 a.out Number of processes = 4 Test repeated 3 times for reliability I am process 2 on node node17 P2: Waiting to receive from to P1 I am process 0 on node node17 Run 1 of 3 P0: Sending to P1 I am process 1 on node node17 P1: Waiting to receive from to P0 I am process 3 on node node17 P3: Waiting to receive from to P2 P1: Sending to to P2 P2: Sending to to P3 P1: Waiting to receive from to P0 P2: Waiting to receive from to P1 P3: Sending to to P0 P0: Received from to P3 Run 2 of 3 P0: Sending to P1 P3: Waiting to receive from to P2 P1: Sending to to P2 P2: Sending to to P3 P1: Waiting to receive from to P0 P3: Sending to to P0 P2: Waiting to receive from to P1 P0: Received from to P3 Run 3 of 3 P0: Sending to P1 P3: Waiting to receive from to P2 P1: Sending to to P2 P2: Sending to to P3 P1: Done P2: Done P3: Sending to to P0 P0: Received from to P3 P0: Done P3: Done
<!DOCTYPE html> <html> <head> <link rel="icon" type="image/vnd.microsoft.icon" href="http://www.gstatic.com/codesite/ph/images/phosting.ico"> <script type="text/javascript"> var codesite_token = "37184c5d629ad5b3864d886a93928b17"; var CS_env = {"profileUrl":["/u/@UhFXRVJWBRJGVwN8/"],"token":"37184c5d629ad5b3864d886a93928b17","assetHostPath":"http://www.gstatic.com/codesite/ph","domainName":null,"assetVersionPath":"http://www.gstatic.com/codesite/ph/6432456761710229989","projectHomeUrl":"/p/pypar","relativeBaseUrl":"","projectName":"pypar","loggedInUserEmail":"ole.moller.niel...@gmail.com"}; var _gaq = _gaq || []; _gaq.push( ['siteTracker._setAccount', 'UA-18071-1'], ['siteTracker._trackPageview']); _gaq.push( ['projectTracker._setAccount', 'UA-19946867-1'], ['projectTracker._trackPageview']); </script> <title>mpi_test.c - pypar - Parallel programming for Python - Google Project Hosting </title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" > <meta name="ROBOTS" content="NOARCHIVE"> <link type="text/css" rel="stylesheet" href="http://www.gstatic.com/codesite/ph/6432456761710229989/css/core.css"> <link type="text/css" rel="stylesheet" href="http://www.gstatic.com/codesite/ph/6432456761710229989/css/ph_detail.css" > <link type="text/css" rel="stylesheet" href="http://www.gstatic.com/codesite/ph/6432456761710229989/css/d_sb.css" > <!--[if IE]> <link type="text/css" rel="stylesheet" href="http://www.gstatic.com/codesite/ph/6432456761710229989/css/d_ie.css" > <![endif]--> <style type="text/css"> .menuIcon.off { background: no-repeat url(http://www.gstatic.com/codesite/ph/images/dropdown_sprite.gif) 0 -42px } .menuIcon.on { background: no-repeat url(http://www.gstatic.com/codesite/ph/images/dropdown_sprite.gif) 0 -28px } .menuIcon.down { background: no-repeat url(http://www.gstatic.com/codesite/ph/images/dropdown_sprite.gif) 0 0; } tr.inline_comment { background: #fff; vertical-align: top; } div.draft, div.published { padding: .3em; border: 1px solid #999; margin-bottom: .1em; font-family: arial, sans-serif; max-width: 60em; } div.draft { background: #ffa; } div.published { background: #e5ecf9; } div.published .body, div.draft .body { padding: .5em .1em .1em .1em; max-width: 60em; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word; font-size: 1em; } div.draft .actions { margin-left: 1em; font-size: 90%; } div.draft form { padding: .5em .5em .5em 0; } div.draft textarea, div.published textarea { width: 95%; height: 10em; font-family: arial, sans-serif; margin-bottom: .5em; } .nocursor, .nocursor td, .cursor_hidden, .cursor_hidden td { background-color: white; height: 2px; } .cursor, .cursor td { background-color: darkblue; height: 2px; display: ''; } .list { border: 1px solid white; border-bottom: 0; } </style> </head> <body class="t4"> <script type="text/javascript"> (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); })(); </script> <div class="headbg"> <div id="gaia"> <span> <b>ole.moller.niel...@gmail.com</b> | <a href="/u/@UhFXRVJWBRJGVwN8/" id="projects-dropdown" onclick="return false;" ><u>My favorites</u> <small>▼</small></a> | <a href="/u/@UhFXRVJWBRJGVwN8/" onclick="_CS_click('/gb/ph/profile');" title="Profile, Updates, and Settings" ><u>Profile</u></a> | <a href="https://www.google.com/accounts/Logout?continue=http%3A%2F%2Fcode.google.com%2Fp%2Fpypar%2Fsource%2Fbrowse%2Fsource%2Fmpi_test.c" onclick="_CS_click('/gb/ph/signout');" ><u>Sign out</u></a> </span> </div> <div class="gbh" style="left: 0pt;"></div> <div class="gbh" style="right: 0pt;"></div> <div style="height: 1px"></div> <!--[if lte IE 7]> <div style="text-align:center;"> Your version of Internet Explorer is not supported. Try a browser that contributes to open source, such as <a href="http://www.firefox.com">Firefox</a>, <a href="http://www.google.com/chrome">Google Chrome</a>, or <a href="http://code.google.com/chrome/chromeframe/">Google Chrome Frame</a>. </div> <![endif]--> <table style="padding:0px; margin: 0px 0px 10px 0px; width:100%" cellpadding="0" cellspacing="0" itemscope itemtype="http://schema.org/CreativeWork"> <tr style="height: 58px;"> <td id="plogo"> <link itemprop="url" href="/p/pypar"> <a href="/p/pypar/"> <img src="/p/pypar/logo?cct=1307146585" alt="Logo" itemprop="image"> </a> </td> <td style="padding-left: 0.5em"> <div id="pname"> <a href="/p/pypar/"><span itemprop="name">pypar</span></a> </div> <div id="psum"> <a id="project_summary_link" href="/p/pypar/"><span itemprop="description">Parallel programming for Python</span></a> </div> </td> <td style="white-space:nowrap;text-align:right; vertical-align:bottom;"> <form action="/hosting/search"> <input size="30" name="q" value="" type="text"> <input type="submit" name="projectsearch" value="Search projects" > </form> </tr> </table> </div> <div id="mt" class="gtb"> <a href="/p/pypar/" class="tab ">Project Home</a> <a href="/p/pypar/downloads/list" class="tab ">Downloads</a> <a href="/p/pypar/w/list" class="tab ">Wiki</a> <a href="/p/pypar/issues/list" class="tab ">Issues</a> <a href="/p/pypar/source/checkout" class="tab active">Source</a> <a href="/p/pypar/admin" class="tab inactive">Administer</a> <div class=gtbc></div> </div> <table cellspacing="0" cellpadding="0" width="100%" align="center" border="0" class="st"> <tr> <td class="subt"> <div class="st2"> <div class="isf"> <span class="inst1"><a href="/p/pypar/source/checkout">Checkout</a></span> <span class="inst2"><a href="/p/pypar/source/browse/">Browse</a></span> <span class="inst3"><a href="/p/pypar/source/list">Changes</a></span> <form action="http://www.google.com/codesearch" method="get" style="display:inline" onsubmit="document.getElementById('codesearchq').value = document.getElementById('origq').value + ' package:http://pypar\\.googlecode\\.com'"> <input type="hidden" name="q" id="codesearchq" value=""> <input type="text" maxlength="2048" size="38" id="origq" name="origq" value="" title="Google Code Search" style="font-size:92%"> <input type="submit" value="Search Trunk" name="btnG" style="font-size:92%"> <a href="/p/pypar/issues/entry?show=review&former=sourcelist">Request code review</a> </form> </div> </div> </td> <td align="right" valign="top" class="bevel-right"></td> </tr> </table> <script type="text/javascript"> var cancelBubble = false; function _go(url) { document.location = url; } </script> <div id="maincol" > <!-- IE --> <div class="expand"> <div id="colcontrol"> <style type="text/css"> #file_flipper { white-space: nowrap; padding-right: 2em; } #file_flipper.hidden { display: none; } #file_flipper .pagelink { color: #0000CC; text-decoration: underline; } #file_flipper #visiblefiles { padding-left: 0.5em; padding-right: 0.5em; } </style> <table id="nav_and_rev" class="list" cellpadding="0" cellspacing="0" width="100%"> <tr> <td nowrap="nowrap" class="src_crumbs src_nav" width="33%"> <strong class="src_nav">Source path: </strong> <span id="crumb_root"> <a href="/p/pypar/source/browse/">svn</a>/ </span> <span id="crumb_links" class="ifClosed"><a href="/p/pypar/source/browse/source/">source</a><span class="sp">/ </span>mpi_test.c</span> </td> <td nowrap="nowrap" width="33%" align="center"> <a href="/p/pypar/source/browse/source/mpi_test.c?edit=1" ><img src="http://www.gstatic.com/codesite/ph/images/pencil-y14.png" class="edit_icon">Edit file</a> </td> <td nowrap="nowrap" width="33%" align="right"> <table cellpadding="0" cellspacing="0" style="font-size: 100%"><tr> <td class="flipper"><b>r98</b></td> </tr></table> </td> </tr> </table> <div class="fc"> <style type="text/css"> .undermouse span { background-image: url(http://www.gstatic.com/codesite/ph/images/comments.gif); } </style> <table class="opened" id="review_comment_area" onmouseout="gutterOut()"><tr> <td id="nums"> <pre><table width="100%"><tr class="nocursor"><td></td></tr></table></pre> <pre><table width="100%" id="nums_table_0"><tr id="gr_svn98_1" onmouseover="gutterOver(1)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',1);"> </span ></td><td id="1"><a href="#1">1</a></td></tr ><tr id="gr_svn98_2" onmouseover="gutterOver(2)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',2);"> </span ></td><td id="2"><a href="#2">2</a></td></tr ><tr id="gr_svn98_3" onmouseover="gutterOver(3)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',3);"> </span ></td><td id="3"><a href="#3">3</a></td></tr ><tr id="gr_svn98_4" onmouseover="gutterOver(4)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',4);"> </span ></td><td id="4"><a href="#4">4</a></td></tr ><tr id="gr_svn98_5" onmouseover="gutterOver(5)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',5);"> </span ></td><td id="5"><a href="#5">5</a></td></tr ><tr id="gr_svn98_6" onmouseover="gutterOver(6)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',6);"> </span ></td><td id="6"><a href="#6">6</a></td></tr ><tr id="gr_svn98_7" onmouseover="gutterOver(7)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',7);"> </span ></td><td id="7"><a href="#7">7</a></td></tr ><tr id="gr_svn98_8" onmouseover="gutterOver(8)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',8);"> </span ></td><td id="8"><a href="#8">8</a></td></tr ><tr id="gr_svn98_9" onmouseover="gutterOver(9)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',9);"> </span ></td><td id="9"><a href="#9">9</a></td></tr ><tr id="gr_svn98_10" onmouseover="gutterOver(10)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',10);"> </span ></td><td id="10"><a href="#10">10</a></td></tr ><tr id="gr_svn98_11" onmouseover="gutterOver(11)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',11);"> </span ></td><td id="11"><a href="#11">11</a></td></tr ><tr id="gr_svn98_12" onmouseover="gutterOver(12)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',12);"> </span ></td><td id="12"><a href="#12">12</a></td></tr ><tr id="gr_svn98_13" onmouseover="gutterOver(13)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',13);"> </span ></td><td id="13"><a href="#13">13</a></td></tr ><tr id="gr_svn98_14" onmouseover="gutterOver(14)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',14);"> </span ></td><td id="14"><a href="#14">14</a></td></tr ><tr id="gr_svn98_15" onmouseover="gutterOver(15)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',15);"> </span ></td><td id="15"><a href="#15">15</a></td></tr ><tr id="gr_svn98_16" onmouseover="gutterOver(16)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',16);"> </span ></td><td id="16"><a href="#16">16</a></td></tr ><tr id="gr_svn98_17" onmouseover="gutterOver(17)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',17);"> </span ></td><td id="17"><a href="#17">17</a></td></tr ><tr id="gr_svn98_18" onmouseover="gutterOver(18)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',18);"> </span ></td><td id="18"><a href="#18">18</a></td></tr ><tr id="gr_svn98_19" onmouseover="gutterOver(19)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',19);"> </span ></td><td id="19"><a href="#19">19</a></td></tr ><tr id="gr_svn98_20" onmouseover="gutterOver(20)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',20);"> </span ></td><td id="20"><a href="#20">20</a></td></tr ><tr id="gr_svn98_21" onmouseover="gutterOver(21)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',21);"> </span ></td><td id="21"><a href="#21">21</a></td></tr ><tr id="gr_svn98_22" onmouseover="gutterOver(22)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',22);"> </span ></td><td id="22"><a href="#22">22</a></td></tr ><tr id="gr_svn98_23" onmouseover="gutterOver(23)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',23);"> </span ></td><td id="23"><a href="#23">23</a></td></tr ><tr id="gr_svn98_24" onmouseover="gutterOver(24)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',24);"> </span ></td><td id="24"><a href="#24">24</a></td></tr ><tr id="gr_svn98_25" onmouseover="gutterOver(25)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',25);"> </span ></td><td id="25"><a href="#25">25</a></td></tr ><tr id="gr_svn98_26" onmouseover="gutterOver(26)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',26);"> </span ></td><td id="26"><a href="#26">26</a></td></tr ><tr id="gr_svn98_27" onmouseover="gutterOver(27)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',27);"> </span ></td><td id="27"><a href="#27">27</a></td></tr ><tr id="gr_svn98_28" onmouseover="gutterOver(28)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',28);"> </span ></td><td id="28"><a href="#28">28</a></td></tr ><tr id="gr_svn98_29" onmouseover="gutterOver(29)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',29);"> </span ></td><td id="29"><a href="#29">29</a></td></tr ><tr id="gr_svn98_30" onmouseover="gutterOver(30)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',30);"> </span ></td><td id="30"><a href="#30">30</a></td></tr ><tr id="gr_svn98_31" onmouseover="gutterOver(31)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',31);"> </span ></td><td id="31"><a href="#31">31</a></td></tr ><tr id="gr_svn98_32" onmouseover="gutterOver(32)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',32);"> </span ></td><td id="32"><a href="#32">32</a></td></tr ><tr id="gr_svn98_33" onmouseover="gutterOver(33)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',33);"> </span ></td><td id="33"><a href="#33">33</a></td></tr ><tr id="gr_svn98_34" onmouseover="gutterOver(34)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',34);"> </span ></td><td id="34"><a href="#34">34</a></td></tr ><tr id="gr_svn98_35" onmouseover="gutterOver(35)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',35);"> </span ></td><td id="35"><a href="#35">35</a></td></tr ><tr id="gr_svn98_36" onmouseover="gutterOver(36)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',36);"> </span ></td><td id="36"><a href="#36">36</a></td></tr ><tr id="gr_svn98_37" onmouseover="gutterOver(37)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',37);"> </span ></td><td id="37"><a href="#37">37</a></td></tr ><tr id="gr_svn98_38" onmouseover="gutterOver(38)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',38);"> </span ></td><td id="38"><a href="#38">38</a></td></tr ><tr id="gr_svn98_39" onmouseover="gutterOver(39)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',39);"> </span ></td><td id="39"><a href="#39">39</a></td></tr ><tr id="gr_svn98_40" onmouseover="gutterOver(40)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',40);"> </span ></td><td id="40"><a href="#40">40</a></td></tr ><tr id="gr_svn98_41" onmouseover="gutterOver(41)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',41);"> </span ></td><td id="41"><a href="#41">41</a></td></tr ><tr id="gr_svn98_42" onmouseover="gutterOver(42)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',42);"> </span ></td><td id="42"><a href="#42">42</a></td></tr ><tr id="gr_svn98_43" onmouseover="gutterOver(43)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',43);"> </span ></td><td id="43"><a href="#43">43</a></td></tr ><tr id="gr_svn98_44" onmouseover="gutterOver(44)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',44);"> </span ></td><td id="44"><a href="#44">44</a></td></tr ><tr id="gr_svn98_45" onmouseover="gutterOver(45)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',45);"> </span ></td><td id="45"><a href="#45">45</a></td></tr ><tr id="gr_svn98_46" onmouseover="gutterOver(46)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',46);"> </span ></td><td id="46"><a href="#46">46</a></td></tr ><tr id="gr_svn98_47" onmouseover="gutterOver(47)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',47);"> </span ></td><td id="47"><a href="#47">47</a></td></tr ><tr id="gr_svn98_48" onmouseover="gutterOver(48)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',48);"> </span ></td><td id="48"><a href="#48">48</a></td></tr ><tr id="gr_svn98_49" onmouseover="gutterOver(49)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',49);"> </span ></td><td id="49"><a href="#49">49</a></td></tr ><tr id="gr_svn98_50" onmouseover="gutterOver(50)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',50);"> </span ></td><td id="50"><a href="#50">50</a></td></tr ><tr id="gr_svn98_51" onmouseover="gutterOver(51)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',51);"> </span ></td><td id="51"><a href="#51">51</a></td></tr ><tr id="gr_svn98_52" onmouseover="gutterOver(52)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',52);"> </span ></td><td id="52"><a href="#52">52</a></td></tr ><tr id="gr_svn98_53" onmouseover="gutterOver(53)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',53);"> </span ></td><td id="53"><a href="#53">53</a></td></tr ><tr id="gr_svn98_54" onmouseover="gutterOver(54)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',54);"> </span ></td><td id="54"><a href="#54">54</a></td></tr ><tr id="gr_svn98_55" onmouseover="gutterOver(55)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',55);"> </span ></td><td id="55"><a href="#55">55</a></td></tr ><tr id="gr_svn98_56" onmouseover="gutterOver(56)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',56);"> </span ></td><td id="56"><a href="#56">56</a></td></tr ><tr id="gr_svn98_57" onmouseover="gutterOver(57)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',57);"> </span ></td><td id="57"><a href="#57">57</a></td></tr ><tr id="gr_svn98_58" onmouseover="gutterOver(58)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',58);"> </span ></td><td id="58"><a href="#58">58</a></td></tr ><tr id="gr_svn98_59" onmouseover="gutterOver(59)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',59);"> </span ></td><td id="59"><a href="#59">59</a></td></tr ><tr id="gr_svn98_60" onmouseover="gutterOver(60)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',60);"> </span ></td><td id="60"><a href="#60">60</a></td></tr ><tr id="gr_svn98_61" onmouseover="gutterOver(61)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',61);"> </span ></td><td id="61"><a href="#61">61</a></td></tr ><tr id="gr_svn98_62" onmouseover="gutterOver(62)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',62);"> </span ></td><td id="62"><a href="#62">62</a></td></tr ><tr id="gr_svn98_63" onmouseover="gutterOver(63)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',63);"> </span ></td><td id="63"><a href="#63">63</a></td></tr ><tr id="gr_svn98_64" onmouseover="gutterOver(64)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',64);"> </span ></td><td id="64"><a href="#64">64</a></td></tr ><tr id="gr_svn98_65" onmouseover="gutterOver(65)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',65);"> </span ></td><td id="65"><a href="#65">65</a></td></tr ><tr id="gr_svn98_66" onmouseover="gutterOver(66)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',66);"> </span ></td><td id="66"><a href="#66">66</a></td></tr ><tr id="gr_svn98_67" onmouseover="gutterOver(67)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',67);"> </span ></td><td id="67"><a href="#67">67</a></td></tr ><tr id="gr_svn98_68" onmouseover="gutterOver(68)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',68);"> </span ></td><td id="68"><a href="#68">68</a></td></tr ><tr id="gr_svn98_69" onmouseover="gutterOver(69)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',69);"> </span ></td><td id="69"><a href="#69">69</a></td></tr ><tr id="gr_svn98_70" onmouseover="gutterOver(70)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',70);"> </span ></td><td id="70"><a href="#70">70</a></td></tr ><tr id="gr_svn98_71" onmouseover="gutterOver(71)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',71);"> </span ></td><td id="71"><a href="#71">71</a></td></tr ><tr id="gr_svn98_72" onmouseover="gutterOver(72)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',72);"> </span ></td><td id="72"><a href="#72">72</a></td></tr ><tr id="gr_svn98_73" onmouseover="gutterOver(73)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',73);"> </span ></td><td id="73"><a href="#73">73</a></td></tr ><tr id="gr_svn98_74" onmouseover="gutterOver(74)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',74);"> </span ></td><td id="74"><a href="#74">74</a></td></tr ><tr id="gr_svn98_75" onmouseover="gutterOver(75)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',75);"> </span ></td><td id="75"><a href="#75">75</a></td></tr ><tr id="gr_svn98_76" onmouseover="gutterOver(76)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',76);"> </span ></td><td id="76"><a href="#76">76</a></td></tr ><tr id="gr_svn98_77" onmouseover="gutterOver(77)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',77);"> </span ></td><td id="77"><a href="#77">77</a></td></tr ><tr id="gr_svn98_78" onmouseover="gutterOver(78)" ><td><span title="Add comment" onclick="codereviews.startEdit('svn98',78);"> </span ></td><td id="78"><a href="#78">78</a></td></tr ></table></pre> <pre><table width="100%"><tr class="nocursor"><td></td></tr></table></pre> </td> <td id="lines"> <pre><table width="100%"><tr class="cursor_stop cursor_hidden"><td></td></tr></table></pre> <pre class="prettyprint lang-c"><table id="src_table_0"><tr id=sl_svn98_1 onmouseover="gutterOver(1)" ><td class="source">/*<br></td></tr ><tr id=sl_svn98_2 onmouseover="gutterOver(2)" ><td class="source"> Simple MPI communication test.<br></td></tr ><tr id=sl_svn98_3 onmouseover="gutterOver(3)" ><td class="source"> Ole Moller Nielsen - 2011<br></td></tr ><tr id=sl_svn98_4 onmouseover="gutterOver(4)" ><td class="source">*/<br></td></tr ><tr id=sl_svn98_5 onmouseover="gutterOver(5)" ><td class="source"><br></td></tr ><tr id=sl_svn98_6 onmouseover="gutterOver(6)" ><td class="source">#include <stdio.h><br></td></tr ><tr id=sl_svn98_7 onmouseover="gutterOver(7)" ><td class="source">#include <stdlib.h><br></td></tr ><tr id=sl_svn98_8 onmouseover="gutterOver(8)" ><td class="source">#include <mpi.h><br></td></tr ><tr id=sl_svn98_9 onmouseover="gutterOver(9)" ><td class="source"><br></td></tr ><tr id=sl_svn98_10 onmouseover="gutterOver(10)" ><td class="source"><br></td></tr ><tr id=sl_svn98_11 onmouseover="gutterOver(11)" ><td class="source">#define M 500000 /* Data size */<br></td></tr ><tr id=sl_svn98_12 onmouseover="gutterOver(12)" ><td class="source"><br></td></tr ><tr id=sl_svn98_13 onmouseover="gutterOver(13)" ><td class="source"><br></td></tr ><tr id=sl_svn98_14 onmouseover="gutterOver(14)" ><td class="source">int main(int argc, char **argv) {<br></td></tr ><tr id=sl_svn98_15 onmouseover="gutterOver(15)" ><td class="source"> int repeats = 3, msgid = 0;<br></td></tr ><tr id=sl_svn98_16 onmouseover="gutterOver(16)" ><td class="source"> int myid, procs;<br></td></tr ><tr id=sl_svn98_17 onmouseover="gutterOver(17)" ><td class="source"> int j, k;<br></td></tr ><tr id=sl_svn98_18 onmouseover="gutterOver(18)" ><td class="source"><br></td></tr ><tr id=sl_svn98_19 onmouseover="gutterOver(19)" ><td class="source"> double A[M];<br></td></tr ><tr id=sl_svn98_20 onmouseover="gutterOver(20)" ><td class="source"><br></td></tr ><tr id=sl_svn98_21 onmouseover="gutterOver(21)" ><td class="source"> int namelen;<br></td></tr ><tr id=sl_svn98_22 onmouseover="gutterOver(22)" ><td class="source"> char processor_name[MPI_MAX_PROCESSOR_NAME];<br></td></tr ><tr id=sl_svn98_23 onmouseover="gutterOver(23)" ><td class="source"><br></td></tr ><tr id=sl_svn98_24 onmouseover="gutterOver(24)" ><td class="source"> MPI_Status stat;<br></td></tr ><tr id=sl_svn98_25 onmouseover="gutterOver(25)" ><td class="source"><br></td></tr ><tr id=sl_svn98_26 onmouseover="gutterOver(26)" ><td class="source"><br></td></tr ><tr id=sl_svn98_27 onmouseover="gutterOver(27)" ><td class="source"> /* Initialize */<br></td></tr ><tr id=sl_svn98_28 onmouseover="gutterOver(28)" ><td class="source"> MPI_Init(&argc, &argv);<br></td></tr ><tr id=sl_svn98_29 onmouseover="gutterOver(29)" ><td class="source"> MPI_Comm_size(MPI_COMM_WORLD, &procs);<br></td></tr ><tr id=sl_svn98_30 onmouseover="gutterOver(30)" ><td class="source"> MPI_Comm_rank(MPI_COMM_WORLD, &myid);<br></td></tr ><tr id=sl_svn98_31 onmouseover="gutterOver(31)" ><td class="source"> MPI_Get_processor_name(processor_name, &namelen);<br></td></tr ><tr id=sl_svn98_32 onmouseover="gutterOver(32)" ><td class="source"><br></td></tr ><tr id=sl_svn98_33 onmouseover="gutterOver(33)" ><td class="source"> if (myid == 0) {<br></td></tr ><tr id=sl_svn98_34 onmouseover="gutterOver(34)" ><td class="source"> printf("Number of processes = %d\n", procs);<br></td></tr ><tr id=sl_svn98_35 onmouseover="gutterOver(35)" ><td class="source"> printf("Test repeated %d times for reliability\n", repeats);<br></td></tr ><tr id=sl_svn98_36 onmouseover="gutterOver(36)" ><td class="source"> }<br></td></tr ><tr id=sl_svn98_37 onmouseover="gutterOver(37)" ><td class="source"><br></td></tr ><tr id=sl_svn98_38 onmouseover="gutterOver(38)" ><td class="source"> if (procs < 2) {<br></td></tr ><tr id=sl_svn98_39 onmouseover="gutterOver(39)" ><td class="source"> printf("Program needs at least two processors - aborting\n");<br></td></tr ><tr id=sl_svn98_40 onmouseover="gutterOver(40)" ><td class="source"> MPI_Abort(MPI_COMM_WORLD,999);<br></td></tr ><tr id=sl_svn98_41 onmouseover="gutterOver(41)" ><td class="source"> }<br></td></tr ><tr id=sl_svn98_42 onmouseover="gutterOver(42)" ><td class="source"><br></td></tr ><tr id=sl_svn98_43 onmouseover="gutterOver(43)" ><td class="source"> /* Create the data */<br></td></tr ><tr id=sl_svn98_44 onmouseover="gutterOver(44)" ><td class="source"> for (j=0; j<M; j++) {<br></td></tr ><tr id=sl_svn98_45 onmouseover="gutterOver(45)" ><td class="source"> A[j]=rand();<br></td></tr ><tr id=sl_svn98_46 onmouseover="gutterOver(46)" ><td class="source"> }<br></td></tr ><tr id=sl_svn98_47 onmouseover="gutterOver(47)" ><td class="source"><br></td></tr ><tr id=sl_svn98_48 onmouseover="gutterOver(48)" ><td class="source"> /* Synchronize */<br></td></tr ><tr id=sl_svn98_49 onmouseover="gutterOver(49)" ><td class="source"> MPI_Barrier(MPI_COMM_WORLD);<br></td></tr ><tr id=sl_svn98_50 onmouseover="gutterOver(50)" ><td class="source"> printf("I am process %d on node %s\n", myid, processor_name);<br></td></tr ><tr id=sl_svn98_51 onmouseover="gutterOver(51)" ><td class="source"><br></td></tr ><tr id=sl_svn98_52 onmouseover="gutterOver(52)" ><td class="source"> /* Pass msg circularly a number of times*/<br></td></tr ><tr id=sl_svn98_53 onmouseover="gutterOver(53)" ><td class="source"> for (k=0; k<repeats; k++) {<br></td></tr ><tr id=sl_svn98_54 onmouseover="gutterOver(54)" ><td class="source"> if (myid == 0) {<br></td></tr ><tr id=sl_svn98_55 onmouseover="gutterOver(55)" ><td class="source"> printf("Run %d of %d\n", k+1, repeats);<br></td></tr ><tr id=sl_svn98_56 onmouseover="gutterOver(56)" ><td class="source"> }<br></td></tr ><tr id=sl_svn98_57 onmouseover="gutterOver(57)" ><td class="source"><br></td></tr ><tr id=sl_svn98_58 onmouseover="gutterOver(58)" ><td class="source"> /* Communicate*/<br></td></tr ><tr id=sl_svn98_59 onmouseover="gutterOver(59)" ><td class="source"> if (myid == 0) {<br></td></tr ><tr id=sl_svn98_60 onmouseover="gutterOver(60)" ><td class="source"> printf("P%i: Sending to P%i\n", myid, 1);<br></td></tr ><tr id=sl_svn98_61 onmouseover="gutterOver(61)" ><td class="source"> MPI_Send(&A[0], M, MPI_DOUBLE, 1, msgid, MPI_COMM_WORLD);<br></td></tr ><tr id=sl_svn98_62 onmouseover="gutterOver(62)" ><td class="source"> MPI_Recv(&A[0], M, MPI_DOUBLE, procs-1, msgid, MPI_COMM_WORLD, &stat);<br></td></tr ><tr id=sl_svn98_63 onmouseover="gutterOver(63)" ><td class="source"> printf("P%i: Received from to P%i\n", myid, procs-1);<br></td></tr ><tr id=sl_svn98_64 onmouseover="gutterOver(64)" ><td class="source"> } else {<br></td></tr ><tr id=sl_svn98_65 onmouseover="gutterOver(65)" ><td class="source"> printf("P%i: Waiting to receive from to P%i\n", myid, myid-1);<br></td></tr ><tr id=sl_svn98_66 onmouseover="gutterOver(66)" ><td class="source"> MPI_Recv(&A[0], M, MPI_DOUBLE, myid-1, msgid, MPI_COMM_WORLD, &stat);<br></td></tr ><tr id=sl_svn98_67 onmouseover="gutterOver(67)" ><td class="source"> printf("P%i: Sending to to P%i\n", myid, (myid+1)%procs);<br></td></tr ><tr id=sl_svn98_68 onmouseover="gutterOver(68)" ><td class="source"> MPI_Send(&A[0], M, MPI_DOUBLE, (myid+1)%procs, msgid, MPI_COMM_WORLD);<br></td></tr ><tr id=sl_svn98_69 onmouseover="gutterOver(69)" ><td class="source"> }<br></td></tr ><tr id=sl_svn98_70 onmouseover="gutterOver(70)" ><td class="source"> }<br></td></tr ><tr id=sl_svn98_71 onmouseover="gutterOver(71)" ><td class="source"><br></td></tr ><tr id=sl_svn98_72 onmouseover="gutterOver(72)" ><td class="source"><br></td></tr ><tr id=sl_svn98_73 onmouseover="gutterOver(73)" ><td class="source"> printf("P%i: Done\n", myid);<br></td></tr ><tr id=sl_svn98_74 onmouseover="gutterOver(74)" ><td class="source"><br></td></tr ><tr id=sl_svn98_75 onmouseover="gutterOver(75)" ><td class="source"> MPI_Finalize();<br></td></tr ><tr id=sl_svn98_76 onmouseover="gutterOver(76)" ><td class="source"> return 0;<br></td></tr ><tr id=sl_svn98_77 onmouseover="gutterOver(77)" ><td class="source">}<br></td></tr ><tr id=sl_svn98_78 onmouseover="gutterOver(78)" ><td class="source"><br></td></tr ></table></pre> <pre><table width="100%"><tr class="cursor_stop cursor_hidden"><td></td></tr></table></pre> </td> </tr></table> <script type="text/javascript"> var lineNumUnderMouse = -1; function gutterOver(num) { gutterOut(); var newTR = document.getElementById('gr_svn98_' + num); if (newTR) { newTR.className = 'undermouse'; } lineNumUnderMouse = num; } function gutterOut() { if (lineNumUnderMouse != -1) { var oldTR = document.getElementById( 'gr_svn98_' + lineNumUnderMouse); if (oldTR) { oldTR.className = ''; } lineNumUnderMouse = -1; } } var numsGenState = {table_base_id: 'nums_table_'}; var srcGenState = {table_base_id: 'src_table_'}; var alignerRunning = false; var startOver = false; function setLineNumberHeights() { if (alignerRunning) { startOver = true; return; } numsGenState.chunk_id = 0; numsGenState.table = document.getElementById('nums_table_0'); numsGenState.row_num = 0; if (!numsGenState.table) { return; // Silently exit if no file is present. } srcGenState.chunk_id = 0; srcGenState.table = document.getElementById('src_table_0'); srcGenState.row_num = 0; alignerRunning = true; continueToSetLineNumberHeights(); } function rowGenerator(genState) { if (genState.row_num < genState.table.rows.length) { var currentRow = genState.table.rows[genState.row_num]; genState.row_num++; return currentRow; } var newTable = document.getElementById( genState.table_base_id + (genState.chunk_id + 1)); if (newTable) { genState.chunk_id++; genState.row_num = 0; genState.table = newTable; return genState.table.rows[0]; } return null; } var MAX_ROWS_PER_PASS = 1000; function continueToSetLineNumberHeights() { var rowsInThisPass = 0; var numRow = 1; var srcRow = 1; while (numRow && srcRow && rowsInThisPass < MAX_ROWS_PER_PASS) { numRow = rowGenerator(numsGenState); srcRow = rowGenerator(srcGenState); rowsInThisPass++; if (numRow && srcRow) { if (numRow.offsetHeight != srcRow.offsetHeight) { numRow.firstChild.style.height = srcRow.offsetHeight + 'px'; } } } if (rowsInThisPass >= MAX_ROWS_PER_PASS) { setTimeout(continueToSetLineNumberHeights, 10); } else { alignerRunning = false; if (startOver) { startOver = false; setTimeout(setLineNumberHeights, 500); } } } function initLineNumberHeights() { // Do 2 complete passes, because there can be races // between this code and prettify. startOver = true; setTimeout(setLineNumberHeights, 250); window.onresize = setLineNumberHeights; } initLineNumberHeights(); </script> <div id="log"> <div style="text-align:right"> <a class="ifCollapse" href="#" onclick="_toggleMeta('', 'p', 'pypar', this)">Show details</a> <a class="ifExpand" href="#" onclick="_toggleMeta('', 'p', 'pypar', this)">Hide details</a> </div> <div class="ifExpand"> <div class="pmeta_bubble_bg" style="border:1px solid white"> <div class="round4"></div> <div class="round2"></div> <div class="round1"></div> <div class="box-inner"> <div id="changelog"> <p>Change log</p> <div> <a href="/p/pypar/source/detail?spec=svn98&r=98">r98</a> by Ole.Moller.Nielsen on Today (3 minutes ago) <a href="/p/pypar/source/diff?spec=svn98&r=98&format=side&path=/source/mpi_test.c&old_path=/source/mpi_test.c&old=">Diff</a> </div> <pre>Added small MPI test program</pre> </div> <script type="text/javascript"> var detail_url = '/p/pypar/source/detail?r=98&spec=svn98'; var publish_url = '/p/pypar/source/detail?r=98&spec=svn98#publish'; // describe the paths of this revision in javascript. var changed_paths = []; var changed_urls = []; changed_paths.push('/source/mpi_test.c'); changed_urls.push('/p/pypar/source/browse/source/mpi_test.c?r\x3d98\x26spec\x3dsvn98'); var selected_path = '/source/mpi_test.c'; function getCurrentPageIndex() { for (var i = 0; i < changed_paths.length; i++) { if (selected_path == changed_paths[i]) { return i; } } } function getNextPage() { var i = getCurrentPageIndex(); if (i < changed_paths.length - 1) { return changed_urls[i + 1]; } return null; } function getPreviousPage() { var i = getCurrentPageIndex(); if (i > 0) { return changed_urls[i - 1]; } return null; } function gotoNextPage() { var page = getNextPage(); if (!page) { page = detail_url; } window.location = page; } function gotoPreviousPage() { var page = getPreviousPage(); if (!page) { page = detail_url; } window.location = page; } function gotoDetailPage() { window.location = detail_url; } function gotoPublishPage() { window.location = publish_url; } </script> <style type="text/css"> #review_nav { border-top: 3px solid white; padding-top: 6px; margin-top: 1em; } #review_nav td { vertical-align: middle; } #review_nav select { margin: .5em 0; } </style> <div id="review_nav"> <table><tr><td>Go to: </td><td> <select name="files_in_rev" onchange="window.location=this.value"> <option value="/p/pypar/source/browse/source/mpi_test.c?r=98&spec=svn98" selected="selected" >/source/mpi_test.c</option> </select> </td></tr></table> <div id="review_instr" class="closed"> <a class="ifOpened" href="/p/pypar/source/detail?r=98&spec=svn98#publish">Publish your comments</a> <div class="ifClosed">Double click a line to add a comment</div> </div> </div> </div> <div class="round1"></div> <div class="round2"></div> <div class="round4"></div> </div> <div class="pmeta_bubble_bg" style="border:1px solid white"> <div class="round4"></div> <div class="round2"></div> <div class="round1"></div> <div class="box-inner"> <div id="older_bubble"> <p>Older revisions</p> <a href="/p/pypar/source/list?path=/source/mpi_test.c&start=98">All revisions of this file</a> </div> </div> <div class="round1"></div> <div class="round2"></div> <div class="round4"></div> </div> <div class="pmeta_bubble_bg" style="border:1px solid white"> <div class="round4"></div> <div class="round2"></div> <div class="round1"></div> <div class="box-inner"> <div id="fileinfo_bubble"> <p>File info</p> <div>Size: 1846 bytes, 78 lines</div> <div><a href="//pypar.googlecode.com/svn/source/mpi_test.c">View raw file</a></div> </div> </div> <div class="round1"></div> <div class="round2"></div> <div class="round4"></div> </div> </div> </div> </div> </div> </div> <script src="http://www.gstatic.com/codesite/ph/6432456761710229989/js/prettify/prettify.js"></script> <script type="text/javascript">prettyPrint();</script> <script src="http://www.gstatic.com/codesite/ph/6432456761710229989/js/source_file_scripts.js"></script> <script type="text/javascript" src="https://kibbles.googlecode.com/files/kibbles-1.3.3.comp.js"></script> <script type="text/javascript"> var lastStop = null; var initialized = false; function updateCursor(next, prev) { if (prev && prev.element) { prev.element.className = 'cursor_stop cursor_hidden'; } if (next && next.element) { next.element.className = 'cursor_stop cursor'; lastStop = next.index; } } function pubRevealed(data) { updateCursorForCell(data.cellId, 'cursor_stop cursor_hidden'); if (initialized) { reloadCursors(); } } function draftRevealed(data) { updateCursorForCell(data.cellId, 'cursor_stop cursor_hidden'); if (initialized) { reloadCursors(); } } function draftDestroyed(data) { updateCursorForCell(data.cellId, 'nocursor'); if (initialized) { reloadCursors(); } } function reloadCursors() { kibbles.skipper.reset(); loadCursors(); if (lastStop != null) { kibbles.skipper.setCurrentStop(lastStop); } } // possibly the simplest way to insert any newly added comments // is to update the class of the corresponding cursor row, // then refresh the entire list of rows. function updateCursorForCell(cellId, className) { var cell = document.getElementById(cellId); // we have to go two rows back to find the cursor location var row = getPreviousElement(cell.parentNode); row.className = className; } // returns the previous element, ignores text nodes. function getPreviousElement(e) { var element = e.previousSibling; if (element.nodeType == 3) { element = element.previousSibling; } if (element && element.tagName) { return element; } } function loadCursors() { // register our elements with skipper var elements = CR_getElements('*', 'cursor_stop'); var len = elements.length; for (var i = 0; i < len; i++) { var element = elements[i]; element.className = 'cursor_stop cursor_hidden'; kibbles.skipper.append(element); } } function toggleComments() { CR_toggleCommentDisplay(); reloadCursors(); } function keysOnLoadHandler() { // setup skipper kibbles.skipper.addStopListener( kibbles.skipper.LISTENER_TYPE.PRE, updateCursor); // Set the 'offset' option to return the middle of the client area // an option can be a static value, or a callback kibbles.skipper.setOption('padding_top', 50); // Set the 'offset' option to return the middle of the client area // an option can be a static value, or a callback kibbles.skipper.setOption('padding_bottom', 100); // Register our keys kibbles.skipper.addFwdKey("n"); kibbles.skipper.addRevKey("p"); kibbles.keys.addKeyPressListener( 'u', function() { window.location = detail_url; }); kibbles.keys.addKeyPressListener( 'r', function() { window.location = detail_url + '#publish'; }); kibbles.keys.addKeyPressListener('j', gotoNextPage); kibbles.keys.addKeyPressListener('k', gotoPreviousPage); kibbles.keys.addKeyPressListener('h', toggleComments); } </script> <script src="http://www.gstatic.com/codesite/ph/6432456761710229989/js/code_review_scripts.js"></script> <script type="text/javascript"> function showPublishInstructions() { var element = document.getElementById('review_instr'); if (element) { element.className = 'opened'; } } var codereviews; function revsOnLoadHandler() { // register our source container with the commenting code var paths = {'svn98': '/source/mpi_test.c'} codereviews = CR_controller.setup( {"profileUrl":["/u/@UhFXRVJWBRJGVwN8/"],"token":"37184c5d629ad5b3864d886a93928b17","assetHostPath":"http://www.gstatic.com/codesite/ph","domainName":null,"assetVersionPath":"http://www.gstatic.com/codesite/ph/6432456761710229989","projectHomeUrl":"/p/pypar","relativeBaseUrl":"","projectName":"pypar","loggedInUserEmail":"ole.moller.niel...@gmail.com"}, '', 'svn98', paths, CR_BrowseIntegrationFactory); // register our source container with the commenting code // in this case we're registering the container and the revison // associated with the contianer which may be the primary revision // or may be a previous revision against which the primary revision // of the file is being compared. codereviews.registerSourceContainer(document.getElementById('lines'), 'svn98'); codereviews.registerActivityListener(CR_ActivityType.REVEAL_DRAFT_PLATE, showPublishInstructions); codereviews.registerActivityListener(CR_ActivityType.REVEAL_PUB_PLATE, pubRevealed); codereviews.registerActivityListener(CR_ActivityType.REVEAL_DRAFT_PLATE, draftRevealed); codereviews.registerActivityListener(CR_ActivityType.DISCARD_DRAFT_COMMENT, draftDestroyed); var initialized = true; reloadCursors(); } window.onload = function() {keysOnLoadHandler(); revsOnLoadHandler();}; </script> <script type="text/javascript" src="http://www.gstatic.com/codesite/ph/6432456761710229989/js/dit_scripts.js"></script> <script type="text/javascript" src="http://www.gstatic.com/codesite/ph/6432456761710229989/js/ph_core.js"></script> <script type="text/javascript" src="/js/codesite_product_dictionary_ph.pack.04102009.js"></script> </div> <div id="footer" dir="ltr"> <div class="text"> ©2011 Google - <a href="/projecthosting/terms.html">Terms</a> - <a href="http://www.google.com/privacy.html">Privacy</a> - <a href="/p/support/">Project Hosting Help</a> </div> </div> <div class="hostedBy" style="margin-top: -20px;"> <span style="vertical-align: top;">Powered by <a href="http://code.google.com/projecthosting/">Google Project Hosting</a></span> </div> </body> </html>