<?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 Try keeping the context of in Software Archive</title>
    <link>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093614#M66158</link>
    <description>&lt;P&gt;Try keeping the context of the lock exclusively within the scope of the offload. IOW, move the &lt;STRONG&gt;#pragma offload&lt;/STRONG&gt; above the &lt;STRONG&gt;omp_init_lock &lt;/STRONG&gt;and encapsulate the omp_init_lock/omp_destroy_lock within the scope of the offload.&lt;/P&gt;

&lt;P&gt;Something like this works:&lt;/P&gt;

&lt;PRE class="brush:cpp;"&gt;     #pragma offload target(mic)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; omp_init_lock(&amp;amp;lck);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #pragma omp parallel num_threads(2) private(id) shared(lck)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mic_ok = chk_target();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (mic_ok == 0) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Error offloading to MIC!\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("MIC found and running!\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id = omp_get_thread_num();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; omp_set_lock(&amp;amp;lck);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* only one thread at a time can execute this printf */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("My thread id is %d.\n", id);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; omp_unset_lock(&amp;amp;lck);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; omp_destroy_lock(&amp;amp;lck);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  // end pragma offload&lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Wed, 02 Dec 2015 21:38:00 GMT</pubDate>
    <dc:creator>Kevin_D_Intel</dc:creator>
    <dc:date>2015-12-02T21:38:00Z</dc:date>
    <item>
      <title>Problem using locks with MIC and OpenMP</title>
      <link>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093613#M66157</link>
      <description>&lt;P&gt;Hi all,&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;I'm new to this world of MIC and OpenMP. I'm trying to write a simple multithreaded program that uses a lock and it seems to give me a segmentation fault.&lt;/P&gt;

&lt;P&gt;The code:&lt;/P&gt;

&lt;PRE class="brush:cpp;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;omp.h&amp;gt;

__attribute__((target(mic))) int chk_target() {
    int retval;

    #ifdef __MIC__
        retval = 1;
    #else
        retval = 0;
    #endif

    // Return 1 if target available
    return retval;
}

int main() {
	omp_lock_t lck;
	int id;
	int mic_ok;
	
	omp_init_lock(&amp;amp;lck);

	#pragma offload target(mic)
	#pragma omp parallel num_threads(2) private(id) shared(lck)
	{
		mic_ok = chk_target();
		if (mic_ok == 0) {
			printf("Error offloading to MIC!\n");
		}
		else {
			printf("MIC found and running!\n");
		}

		id = omp_get_thread_num();
		omp_set_lock(&amp;amp;lck);
		/* only one thread at a time can execute this printf */
		printf("My thread id is %d.\n", id);
		omp_unset_lock(&amp;amp;lck);
	}

	omp_destroy_lock(&amp;amp;lck);

	return 0;
}&lt;/PRE&gt;

&lt;P&gt;Compilation command:&lt;/P&gt;

&lt;P&gt;icc -qopenmp &amp;lt;filename&amp;gt; -o &amp;lt;output_filename&amp;gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;The output:&lt;/P&gt;

&lt;P&gt;offload error: process on the device 0 was terminated by signal 11 (SIGSEGV)&lt;/P&gt;

&lt;P&gt;When the same code is run on the host, it runs fine without issue.&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;Would love to get some help to start me up on this subject :)&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;Thanks!&lt;/P&gt;</description>
      <pubDate>Wed, 02 Dec 2015 19:48:47 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093613#M66157</guid>
      <dc:creator>Yoel_E_</dc:creator>
      <dc:date>2015-12-02T19:48:47Z</dc:date>
    </item>
    <item>
      <title>Try keeping the context of</title>
      <link>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093614#M66158</link>
      <description>&lt;P&gt;Try keeping the context of the lock exclusively within the scope of the offload. IOW, move the &lt;STRONG&gt;#pragma offload&lt;/STRONG&gt; above the &lt;STRONG&gt;omp_init_lock &lt;/STRONG&gt;and encapsulate the omp_init_lock/omp_destroy_lock within the scope of the offload.&lt;/P&gt;

&lt;P&gt;Something like this works:&lt;/P&gt;

&lt;PRE class="brush:cpp;"&gt;     #pragma offload target(mic)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; omp_init_lock(&amp;amp;lck);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #pragma omp parallel num_threads(2) private(id) shared(lck)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mic_ok = chk_target();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (mic_ok == 0) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Error offloading to MIC!\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("MIC found and running!\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id = omp_get_thread_num();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; omp_set_lock(&amp;amp;lck);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* only one thread at a time can execute this printf */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("My thread id is %d.\n", id);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; omp_unset_lock(&amp;amp;lck);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; omp_destroy_lock(&amp;amp;lck);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  // end pragma offload&lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 02 Dec 2015 21:38:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093614#M66158</guid>
      <dc:creator>Kevin_D_Intel</dc:creator>
      <dc:date>2015-12-02T21:38:00Z</dc:date>
    </item>
    <item>
      <title>Thanks, that did it :)</title>
      <link>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093615#M66159</link>
      <description>&lt;P&gt;Thanks, that did it :)&lt;/P&gt;

&lt;P&gt;Can you explain why there's a difference?&lt;/P&gt;</description>
      <pubDate>Wed, 02 Dec 2015 21:42:20 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093615#M66159</guid>
      <dc:creator>Yoel_E_</dc:creator>
      <dc:date>2015-12-02T21:42:20Z</dc:date>
    </item>
    <item>
      <title>The omp_lock_t is an opaque</title>
      <link>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093616#M66160</link>
      <description>&lt;P&gt;The omp_lock_t is an opaque object (struct) and may not necessarily be copy able as POD from outside the offload to inside the offload via shared(lck).&lt;/P&gt;

&lt;P&gt;You also have a race condition in that mic_ok is not declared as private. This race condition is benign because all threads inside the offload parallel region ought to return the same value.&lt;/P&gt;

&lt;P&gt;Jim Dempsey&lt;/P&gt;</description>
      <pubDate>Wed, 02 Dec 2015 22:43:17 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093616#M66160</guid>
      <dc:creator>jimdempseyatthecove</dc:creator>
      <dc:date>2015-12-02T22:43:17Z</dc:date>
    </item>
    <item>
      <title>Many thanks! :)</title>
      <link>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093617#M66161</link>
      <description>&lt;P&gt;Many thanks! :)&lt;/P&gt;</description>
      <pubDate>Wed, 02 Dec 2015 23:41:59 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093617#M66161</guid>
      <dc:creator>Yoel_E_</dc:creator>
      <dc:date>2015-12-02T23:41:59Z</dc:date>
    </item>
    <item>
      <title>Jim Dempsey is correct. The</title>
      <link>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093618#M66162</link>
      <description>&lt;P&gt;Jim Dempsey is correct. The omp_lock_t may contain a pointer to additional information, in which case it cannot be copied between address spaces.&amp;nbsp;&lt;/P&gt;

&lt;P&gt;The wider point is that if you're writing C/C++ and using OpenMP it is very helpful to follow the practice of declaring variables in the smallest possible scope. (I find this good practice anyway, but it particularly helps OpenMP since it often removes the need for private or firstprivate annotations which are easy to forget).&lt;/P&gt;

&lt;P&gt;P.S. if your code is really all you're trying to do, there's no need to use an explicit lock. you could write the guarded printf &amp;nbsp;using omp critical&amp;nbsp;&lt;SPAN style="font-size: 1em; line-height: 1.5;"&gt;and do away with all of the lock manipulation, something like this&lt;/SPAN&gt;&lt;/P&gt;

&lt;PRE class="brush:cpp;"&gt;#pragma omp critical
{
    printf("My thread id is %d.\n", id);
}&lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 03 Dec 2015 11:00:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Problem-using-locks-with-MIC-and-OpenMP/m-p/1093618#M66162</guid>
      <dc:creator>James_C_Intel2</dc:creator>
      <dc:date>2015-12-03T11:00:00Z</dc:date>
    </item>
  </channel>
</rss>

