<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="RU" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">Hello,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">If you print information from __kmp_task_alloc() function, you cannot find your data in the structures.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">The reason is that this routine only allocates space requested by the compiler and initializes its own runtime-related
 info, and if you examine the space allocated for shareds you can only find uninitialized memory there.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">The addresses of shared variables are put into allocated memory by the compiler later, AFTER the __kmp_task_alloc() call.
 E.g. the array of shareds should already be initialized in the __kmp_omp_task() call.  But I doubt you can rely on particular location of any shared variable in the array of shareds, it is compiler’s decision where to place your particular variable’s address,
 and it may or may not be the first in the array of shareds. E.g. compiler can insert its own auxiliary data before user’s data.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">Andrey<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><a name="_____replyseparator"></a><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Openmp-dev [mailto:openmp-dev-bounces@lists.llvm.org]
<b>On Behalf Of </b>Rezaul Karim Raju via Openmp-dev<br>
<b>Sent:</b> Tuesday, December 15, 2015 8:47 AM<br>
<b>To:</b> openmp-dev@lists.llvm.org; openmp-commits@lists.llvm.org<br>
<b>Subject:</b> [Openmp-dev] Intel OpenMP Runtime & LLVM [kmp_tasking.c]: Problem to access SHARED VARIABLE DATA LOCATION<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Dear concern, <o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Please consider the source code(openmp c code) snippet as below: <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">--- code snippet ---<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">int a1, b1, c1, N;<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Initially address of a1:= 0x7fff9bd58304 <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">omp_set_num_threads(2);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            #pragma omp parallel<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                        #pragma omp single<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                        {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                                   // task one: a1=b1+c1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                                   #pragma omp task shared(a1) firstprivate(b1,c1)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                                   {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                                               a1 = a1 + b1 + c1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                                   }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">                 }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">         }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">In the above openMP code task construct contains shared variable (a1), I AM INTERESTED TO FIND THE SHARED VARIABLE OF TASK DATA IN RUNTIME TASK ALLOCATION.         
<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I am looking into the source code of Intel OpenMP Runtime, my openmp code is compiled with LLVM. In the LLVM IR, @__kmpc_omp_task_alloc( ...) calls runtime function kmp_task_alloc(), source code is here: under the <src> directory, Kmp_tasking.c
  <o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I am trying to access the "shared variable data location for a task" which is as below: <o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">kmp_task_t *<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">__kmp_task_alloc(...){<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">kmp_task_t *task;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">kmp_taskdata_t *taskdata;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">// Calculate shared structure offset including padding after kmp_task_t struct<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    // to align pointers in shared struct<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    shareds_offset = sizeof( kmp_taskdata_t ) + sizeof_kmp_task_t;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    shareds_offset = __kmp_round_up_to_val( shareds_offset, sizeof( void * ));<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">// Avoid double allocation here by combining shareds with taskdata<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    #if USE_FAST_MEMORY<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    taskdata = (kmp_taskdata_t *) __kmp_fast_allocate( thread, shareds_offset + sizeof_shareds );<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    #else /* ! USE_FAST_MEMORY */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    taskdata = (kmp_taskdata_t *) __kmp_thread_malloc( thread, shareds_offset + sizeof_shareds );<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    #endif /* USE_FAST_MEMORY */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    <o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal">task                      = KMP_TASKDATA_TO_TASK(taskdata);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">if (sizeof_shareds > 0) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        // Avoid double allocation here by combining shareds with taskdata<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        task->shareds         = & ((char *) taskdata)[ shareds_offset ];<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">printf("task->shareds address original:= %p  address of pointer it points to := %p\n", & ((char *) taskdata)[ shareds_offset ], *task->shareds);<o:p></o:p></p>
<p class="MsoNormal">                        <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            }<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">here, <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">typedef struct kmp_task {                   /* GEH: Shouldn't this be aligned somehow? */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    void *              shareds;            /**< pointer to block of pointers to shared vars   */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">But, task->shareds         = & ((char *) taskdata)[ shareds_offset ]; which is a pointer to block of pointers to shared variables, if I print the shared variable pointing address(which should be the address of a1:= 0x7fff9bd58304) <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">IT PRINTS DIFFERENT ADDRESS: <0x1fe0ef0><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">NEED TO GET THE ADDRESS OF TASK'S SHARED VARIABLE ADDRESS FROM RUNTIME.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">appreciate your comment and help.  Thanking you.<o:p></o:p></p>
</div>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;color:#CCCCCC">------------------------</span><o:p></o:p></p>
</div>
<p class="MsoNormal"><span style="font-size:10.0pt;color:#999999">RaJu, Rezaul Karim<br>
Graduate Student (PhD) | Computer Science | University of Houston</span><o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;color:#999999">Research in High Performance Computing Tools  </span><o:p></o:p></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;color:#999999">Houston, Texas-77004</span><o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p><br>--------------------------------------------------------------------<br>Joint Stock Company Intel A/O<br>Registered legal address: Krylatsky Hills Business Park, <br>17 Krylatskaya Str., Bldg 4, Moscow 121614, <br>Russian Federation</p><p>This e-mail and any attachments may contain confidential material for<br>the sole use of the intended recipient(s). Any review or distribution<br>by others is strictly prohibited. If you are not the intended<br>recipient, please contact the sender and delete all copies.</p>
</body>
</html>