<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">In clang-omp we have to create some
additional fields for proper codegen. They are not used by
runtime, but used by the codegen process. In official trunk
implementation there won't be any of such junk fields.<br>
<pre class="moz-signature" cols="72">Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team</pre>
14.04.2015 16:05, César пишет:<br>
</div>
<blockquote
cite="mid:CAHN8PedNzrfAqKP=ameV_dpuBAsRPp75nTBPo7KdbMsaVUc6cw@mail.gmail.com"
type="cite">
<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 moz-do-not-send="true"
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
moz-do-not-send="true"
href="http://openmp.llvm.org/"
target="_blank">http://openmp.llvm.org/</a>
and <a moz-do-not-send="true"
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 moz-do-not-send="true" href="mailto:Openmp-dev@dcs-maillist2.engr.illinois.edu" target="_blank">Openmp-dev@dcs-maillist2.engr.illinois.edu</a>
<a moz-do-not-send="true" 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>
</blockquote>
<br>
</body>
</html>