<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic about OpenMP Critical  ,data race in Intel® Moderncode for Parallel Architectures</title>
    <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/about-OpenMP-Critical-data-race/m-p/869115#M2813</link>
    <description>why?&lt;BR /&gt;&lt;STRONG&gt;&lt;EM&gt;code1&lt;/EM&gt;&lt;/STRONG&gt;&lt;BR /&gt;#include "stdafx.h"&lt;BR /&gt;#include "omp.h"&lt;BR /&gt;#define N 100000 &lt;BR /&gt;int _tmain(int argc, _TCHAR* argv[])&lt;BR /&gt;{&lt;BR /&gt; int arx&lt;N&gt;,ary&lt;N&gt;;&lt;BR /&gt; int i,max_num_x=-1,max_num_y=-1;&lt;BR /&gt; for(i=0;i&lt;N&gt;&lt;/N&gt; {&lt;BR /&gt; arx&lt;I&gt;=i;&lt;BR /&gt; ary&lt;I&gt;=N-i;&lt;BR /&gt; }&lt;BR /&gt; omp_set_num_threads(10);&lt;BR /&gt; #pragma omp parallel for&lt;BR /&gt; for(i=0;i&lt;N&gt;&lt;/N&gt; {&lt;BR /&gt; //#pragma omp critical(max_arx)&lt;BR /&gt; if(arx&lt;I&gt;&amp;gt;max_num_x)&lt;BR /&gt; max_num_x=arx&lt;I&gt;;&lt;BR /&gt; //#pragma omp critical(max_ary)&lt;BR /&gt; if(ary&lt;I&gt;&amp;gt;max_num_y)&lt;BR /&gt; max_num_y=ary&lt;I&gt;;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt; printf("max_num_x=%d max_num_y=%d\n",max_num_x,max_num_y);&lt;BR /&gt; return 0;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;and&lt;BR /&gt;&lt;STRONG&gt;&lt;EM&gt;code2&lt;/EM&gt;&lt;/STRONG&gt;&lt;BR /&gt;#include "stdafx.h"&lt;BR /&gt;#include "omp.h"&lt;BR /&gt;#define N 100000 &lt;BR /&gt;int _tmain(int argc, _TCHAR* argv[])&lt;BR /&gt;{&lt;BR /&gt; int arx&lt;N&gt;,ary&lt;N&gt;;&lt;BR /&gt; int i,max_num_x=-1,max_num_y=-1;&lt;BR /&gt; for(i=0;i&lt;N&gt;&lt;/N&gt; {&lt;BR /&gt; arx&lt;I&gt;=i;&lt;BR /&gt; ary&lt;I&gt;=N-i;&lt;BR /&gt; }&lt;BR /&gt; omp_set_num_threads(10);&lt;BR /&gt; #pragma omp parallel for&lt;BR /&gt; for(i=0;i&lt;N&gt;&lt;/N&gt; {&lt;BR /&gt; #pragma omp critical(max_arx)&lt;BR /&gt; if(arx&lt;I&gt;&amp;gt;max_num_x)&lt;BR /&gt; max_num_x=arx&lt;I&gt;;&lt;BR /&gt; #pragma omp critical(max_ary)&lt;BR /&gt; if(ary&lt;I&gt;&amp;gt;max_num_y)&lt;BR /&gt; max_num_y=ary&lt;I&gt;;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt; printf("max_num_x=%d max_num_y=%d\n",max_num_x,max_num_y);&lt;BR /&gt; return 0;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;please tell me why the results of the two codes are identical? I don't know why no add #pragma omp critical ,no data race too,in code1.&lt;!--[if !mso]&gt;
&lt;style&gt;
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
p\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
v\:textbox {display:none;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;!--[endif]--&gt; &lt;SPAN style="font-family: Verdana; font-size: 26pt;" lang="EN-US"&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/N&gt;&lt;/N&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/N&gt;&lt;/N&gt;</description>
    <pubDate>Wed, 01 Apr 2009 08:57:33 GMT</pubDate>
    <dc:creator>zhangzhe65</dc:creator>
    <dc:date>2009-04-01T08:57:33Z</dc:date>
    <item>
      <title>about OpenMP Critical  ,data race</title>
      <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/about-OpenMP-Critical-data-race/m-p/869115#M2813</link>
      <description>why?&lt;BR /&gt;&lt;STRONG&gt;&lt;EM&gt;code1&lt;/EM&gt;&lt;/STRONG&gt;&lt;BR /&gt;#include "stdafx.h"&lt;BR /&gt;#include "omp.h"&lt;BR /&gt;#define N 100000 &lt;BR /&gt;int _tmain(int argc, _TCHAR* argv[])&lt;BR /&gt;{&lt;BR /&gt; int arx&lt;N&gt;,ary&lt;N&gt;;&lt;BR /&gt; int i,max_num_x=-1,max_num_y=-1;&lt;BR /&gt; for(i=0;i&lt;N&gt;&lt;/N&gt; {&lt;BR /&gt; arx&lt;I&gt;=i;&lt;BR /&gt; ary&lt;I&gt;=N-i;&lt;BR /&gt; }&lt;BR /&gt; omp_set_num_threads(10);&lt;BR /&gt; #pragma omp parallel for&lt;BR /&gt; for(i=0;i&lt;N&gt;&lt;/N&gt; {&lt;BR /&gt; //#pragma omp critical(max_arx)&lt;BR /&gt; if(arx&lt;I&gt;&amp;gt;max_num_x)&lt;BR /&gt; max_num_x=arx&lt;I&gt;;&lt;BR /&gt; //#pragma omp critical(max_ary)&lt;BR /&gt; if(ary&lt;I&gt;&amp;gt;max_num_y)&lt;BR /&gt; max_num_y=ary&lt;I&gt;;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt; printf("max_num_x=%d max_num_y=%d\n",max_num_x,max_num_y);&lt;BR /&gt; return 0;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;and&lt;BR /&gt;&lt;STRONG&gt;&lt;EM&gt;code2&lt;/EM&gt;&lt;/STRONG&gt;&lt;BR /&gt;#include "stdafx.h"&lt;BR /&gt;#include "omp.h"&lt;BR /&gt;#define N 100000 &lt;BR /&gt;int _tmain(int argc, _TCHAR* argv[])&lt;BR /&gt;{&lt;BR /&gt; int arx&lt;N&gt;,ary&lt;N&gt;;&lt;BR /&gt; int i,max_num_x=-1,max_num_y=-1;&lt;BR /&gt; for(i=0;i&lt;N&gt;&lt;/N&gt; {&lt;BR /&gt; arx&lt;I&gt;=i;&lt;BR /&gt; ary&lt;I&gt;=N-i;&lt;BR /&gt; }&lt;BR /&gt; omp_set_num_threads(10);&lt;BR /&gt; #pragma omp parallel for&lt;BR /&gt; for(i=0;i&lt;N&gt;&lt;/N&gt; {&lt;BR /&gt; #pragma omp critical(max_arx)&lt;BR /&gt; if(arx&lt;I&gt;&amp;gt;max_num_x)&lt;BR /&gt; max_num_x=arx&lt;I&gt;;&lt;BR /&gt; #pragma omp critical(max_ary)&lt;BR /&gt; if(ary&lt;I&gt;&amp;gt;max_num_y)&lt;BR /&gt; max_num_y=ary&lt;I&gt;;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt; printf("max_num_x=%d max_num_y=%d\n",max_num_x,max_num_y);&lt;BR /&gt; return 0;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;please tell me why the results of the two codes are identical? I don't know why no add #pragma omp critical ,no data race too,in code1.&lt;!--[if !mso]&gt;
&lt;style&gt;
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
p\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
v\:textbox {display:none;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;!--[endif]--&gt; &lt;SPAN style="font-family: Verdana; font-size: 26pt;" lang="EN-US"&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/N&gt;&lt;/N&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/N&gt;&lt;/N&gt;</description>
      <pubDate>Wed, 01 Apr 2009 08:57:33 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/about-OpenMP-Critical-data-race/m-p/869115#M2813</guid>
      <dc:creator>zhangzhe65</dc:creator>
      <dc:date>2009-04-01T08:57:33Z</dc:date>
    </item>
    <item>
      <title>Re: about OpenMP Critical  ,data race</title>
      <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/about-OpenMP-Critical-data-race/m-p/869116#M2814</link>
      <description>&lt;DIV style="margin:0px;"&gt;
&lt;DIV id="quote_reply" style="margin-top: 5px; width: 100%;"&gt;
&lt;DIV style="margin-left:2px;margin-right:2px;"&gt;Quoting - &lt;A href="https://community.intel.com/en-us/profile/308412"&gt;zhangzhe65&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV style="background-color:#E5E5E5; padding:5px;border: 1px; border-style: inset;margin-left:2px;margin-right:2px;"&gt;&lt;EM&gt;why?&lt;BR /&gt;&lt;STRONG&gt;&lt;EM&gt;code1&lt;/EM&gt;&lt;/STRONG&gt;&lt;BR /&gt;#include "stdafx.h"&lt;BR /&gt;#include "omp.h"&lt;BR /&gt;#define N 100000 &lt;BR /&gt;int _tmain(int argc, _TCHAR* argv[])&lt;BR /&gt;{&lt;BR /&gt;int arx&lt;N&gt;,ary&lt;N&gt;;&lt;BR /&gt;int i,max_num_x=-1,max_num_y=-1;&lt;BR /&gt;for(i=0;i&lt;N&gt;&lt;/N&gt;{&lt;BR /&gt;arx&lt;I&gt;=i;&lt;BR /&gt;ary&lt;I&gt;=N-i;&lt;BR /&gt;}&lt;BR /&gt;omp_set_num_threads(10);&lt;BR /&gt;#pragma omp parallel for&lt;BR /&gt;for(i=0;i&lt;N&gt;&lt;/N&gt;{&lt;BR /&gt;//#pragma omp critical(max_arx)&lt;BR /&gt;if(arx&lt;I&gt;&amp;gt;max_num_x)&lt;BR /&gt;max_num_x=arx&lt;I&gt;;&lt;BR /&gt;//#pragma omp critical(max_ary)&lt;BR /&gt;if(ary&lt;I&gt;&amp;gt;max_num_y)&lt;BR /&gt;max_num_y=ary&lt;I&gt;;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;printf("max_num_x=%d max_num_y=%dn",max_num_x,max_num_y);&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;and&lt;BR /&gt;&lt;STRONG&gt;&lt;EM&gt;code2&lt;/EM&gt;&lt;/STRONG&gt;&lt;BR /&gt;#include "stdafx.h"&lt;BR /&gt;#include "omp.h"&lt;BR /&gt;#define N 100000 &lt;BR /&gt;int _tmain(int argc, _TCHAR* argv[])&lt;BR /&gt;{&lt;BR /&gt;int arx&lt;N&gt;,ary&lt;N&gt;;&lt;BR /&gt;int i,max_num_x=-1,max_num_y=-1;&lt;BR /&gt;for(i=0;i&lt;N&gt;&lt;/N&gt;{&lt;BR /&gt;arx&lt;I&gt;=i;&lt;BR /&gt;ary&lt;I&gt;=N-i;&lt;BR /&gt;}&lt;BR /&gt;omp_set_num_threads(10);&lt;BR /&gt;#pragma omp parallel for&lt;BR /&gt;for(i=0;i&lt;N&gt;&lt;/N&gt;{&lt;BR /&gt;#pragma omp critical(max_arx)&lt;BR /&gt;if(arx&lt;I&gt;&amp;gt;max_num_x)&lt;BR /&gt;max_num_x=arx&lt;I&gt;;&lt;BR /&gt;#pragma omp critical(max_ary)&lt;BR /&gt;if(ary&lt;I&gt;&amp;gt;max_num_y)&lt;BR /&gt;max_num_y=ary&lt;I&gt;;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;printf("max_num_x=%d max_num_y=%dn",max_num_x,max_num_y);&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;please tell me why the results of the two codes are identical? I don't know why no add #pragma omp critical ,no data race too,in code1. &lt;!-- v:* {behavior:url(#default#VML);} o:* {behavior:url(#default#VML);} p:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} v:textbox {display:none;} --&gt;&lt;!--[endif]--&gt; &lt;SPAN style="font-family: Verdana; font-size: 26pt;" lang="EN-US"&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/N&gt;&lt;/N&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/N&gt;&lt;/N&gt;&lt;/EM&gt;&lt;I&gt;&lt;I&gt;&lt;I&gt;&lt;I&gt;&lt;I&gt;&lt;I&gt;&lt;I&gt;&lt;I&gt;&lt;I&gt;&lt;I&gt;&lt;I&gt;&lt;I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;BR /&gt;&lt;BR /&gt;Hello,&lt;BR /&gt;&lt;BR /&gt;It's obvious you'vea potential data race =&amp;gt; you've a percentile of chance to have one&lt;BR /&gt;it's for that it's so difficult to detect and reproduce =&amp;gt; that's the heart of parallelism&lt;BR /&gt;&lt;BR /&gt;Statistically,it depends on size (in cache line) of potential data racable,number of caches and cores, cash coherency policy (inclusive,exclusive), and time needed to read/write from cache&lt;BR /&gt;=&amp;gt; not easy to calculate (I could perhapsif you pay me :=) :=) )&lt;BR /&gt;&lt;BR /&gt;But if you want to increase the chances to "SEE" a cache race, I propose:&lt;BR /&gt;&lt;BR /&gt;- increase hardware configuration (more cores and caches involved) &lt;BR /&gt;- diminish the size of your array to few elements&lt;BR /&gt;- randomize your data in array&lt;BR /&gt;&lt;BR /&gt;And parallel graal will appear !&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Hope this help.</description>
      <pubDate>Wed, 29 Apr 2009 13:44:40 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/about-OpenMP-Critical-data-race/m-p/869116#M2814</guid>
      <dc:creator>Alain_D_Intel</dc:creator>
      <dc:date>2009-04-29T13:44:40Z</dc:date>
    </item>
  </channel>
</rss>

