<div dir="ltr">I see; I had understood this comment as saying the allocation order of kmp_task_t and the private vars in memory (i.e., that private vars would be always allocated just after kmp_task_t) not really referring that kmp_task_t would be "re-shaped" by the compiler.<div><br></div><div>In the code example I sent before the "task function fun", as I understand, does not have any private/shared vars. Why the structure still has a fifth field? Could you please point me to the LLVM code that compute that? Moreover, accessing these private vars through a pointer to an array, like what is done for shared vars, would make sense?</div><div><br></div><div><br></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><br><br>César.</div></div>
<br><div class="gmail_quote">On Tue, Apr 14, 2015 at 3:08 AM, Bataev, Alexey <span dir="ltr"><<a href="mailto:a.bataev@hotmail.com" target="_blank">a.bataev@hotmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div>
    <div>Actually kmp_task_t can have more than
      4 fields. See /*  private vars  */ comment. It is a place for a
      list of private variables used inside of task construct.<br>
      <pre cols="72">Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team</pre>
      13.04.2015 23:43, César пишет:<br>
    </div>
    <blockquote type="cite"><div><div class="h5">
      <div dir="ltr">Hello.
        <div><br>
        </div>
        <div>I'm doing some experiments with the RTL and I'm seeing
          something that I could not understand. When I compile this
          code with clang (clang -S emit-llvm test.c -fopenmp):</div>
        <div><br>
        </div>
        <div>//=--------------------------------------------------=//<br>
        </div>
        <div>
          <div><span style="white-space:pre-wrap"> </span>#pragma
            omp parallel<br>
          </div>
          <div><span style="white-space:pre-wrap"> </span>{</div>
          <div><span style="white-space:pre-wrap"> </span>#pragma
            omp task <span style="white-space:pre-wrap"> </span></div>
          <div><span style="white-space:pre-wrap"> </span>fun();</div>
          <div><span style="white-space:pre-wrap"> </span>}</div>
          <div>//=--------------------------------------------------=//<br>
          </div>
          <div><br>
          </div>
          <div>the LLVM IR produced contains the following call to
            "task_alloc", which, in this case, returns a structure with
            *five* fields:</div>
          <div><br>
          </div>
          <div>//=--------------------------------------------------=//<br>
          </div>
          <div>
            <div>%.task_t.val.addr = call { i8*, i32 (i32, i8*)*, i32,
              i32 (i32, i8*)*, i32 }* @__kmpc_omp_task_alloc({ i32, i32,
              i32, i32, i8* }* %.__kmpc_ident_t.2., i32 %.gtid., i32
              %.flags., i64 ptrtoint ({ i8*, i32 (i32, i8*)*, i32, i32
              (i32, i8*)*, i32 }* getelementptr ({ i8*, i32 (i32, i8*)*,
              i32, i32 (i32, i8*)*, i32 }* null, i32 1) to i64), i64 0,
              i32 (i32, i8*)* @.omp_ptask.)</div>
          </div>
          <div>//=--------------------------------------------------=//<br>
          </div>
          <div><br>
          </div>
          <div>the point is, when I inspect the RTL source code the
            structure kmp_task_t contains only *four* fields:</div>
          <div><br>
          </div>
          <div>//=--------------------------------------------------=//<br>
          </div>
          <div>
            <div>typedef struct kmp_task {                   /* GEH:
              Shouldn't this be aligned somehow? */</div>
            <div>    void *              shareds;            /**<
              pointer to block of pointers to shared vars   */</div>
            <div>    kmp_routine_entry_t routine;            /**<
              pointer to routine to call for executing task */</div>
            <div>    kmp_int32           part_id;            /**<
              part id for the task                          */</div>
            <div>#if OMP_40_ENABLED</div>
            <div>    kmp_routine_entry_t destructors;        /* pointer
              to function to invoke deconstructors of firstprivate C++
              objects */</div>
            <div>#endif // OMP_40_ENABLED</div>
            <div>    /*  private vars  */</div>
            <div>} kmp_task_t;</div>
          </div>
          <div>//=--------------------------------------------------=//</div>
          <div><br>
          </div>
          <div>What am I doing wrong here? Am I using the wrong version
            of some library? To install the RTL and LLVM I followed the
            steps from: <a href="http://openmp.llvm.org/" target="_blank">http://openmp.llvm.org/</a>
            and <a href="http://clang-omp.github.io/" target="_blank">http://clang-omp.github.io/</a></div>
          <div><br>
          </div>
          <div><br>
          </div>
          <div><br>
          </div>
          <div>
            <div>César.</div>
          </div>
        </div>
      </div>
      <br>
      <fieldset></fieldset>
      <br>
      </div></div><pre>_______________________________________________
Openmp-dev mailing list
<a href="mailto:Openmp-dev@dcs-maillist2.engr.illinois.edu" target="_blank">Openmp-dev@dcs-maillist2.engr.illinois.edu</a>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/openmp-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/openmp-dev</a>
</pre>
    </blockquote>
    <br>
  </div>

</blockquote></div><br></div>