[Openmp-commits] Intel OpenMP Runtime & LLVM [kmp_tasking.c]: Problem to access SHARED VARIABLE DATA LOCATION

Rezaul Karim Raju via Openmp-commits openmp-commits at lists.llvm.org
Mon Dec 14 21:46:50 PST 2015


Dear concern,

Please consider the source code(openmp c code) snippet as below:
--- code snippet ---
int a1, b1, c1, N;

Initially address of a1:= 0x7fff9bd58304
omp_set_num_threads(2);
#pragma omp parallel
{
#pragma omp single
{
// task one: a1=b1+c1;
#pragma omp task shared(a1) firstprivate(b1,c1)
{
a1 = a1 + b1 + c1;
}
}
}
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.

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


I am trying to access the "shared variable data location for a task" which
is as below:
kmp_task_t *
__kmp_task_alloc(...){

kmp_task_t *task;
kmp_taskdata_t *taskdata;

// Calculate shared structure offset including padding after kmp_task_t
struct
    // to align pointers in shared struct
    shareds_offset = sizeof( kmp_taskdata_t ) + sizeof_kmp_task_t;
    shareds_offset = __kmp_round_up_to_val( shareds_offset, sizeof( void *
));

// Avoid double allocation here by combining shareds with taskdata
    #if USE_FAST_MEMORY
    taskdata = (kmp_taskdata_t *) __kmp_fast_allocate( thread,
shareds_offset + sizeof_shareds );
    #else /* ! USE_FAST_MEMORY */
    taskdata = (kmp_taskdata_t *) __kmp_thread_malloc( thread,
shareds_offset + sizeof_shareds );
    #endif /* USE_FAST_MEMORY */

task                      = KMP_TASKDATA_TO_TASK(taskdata);

if (sizeof_shareds > 0) {
        // Avoid double allocation here by combining shareds with taskdata
        task->shareds         = & ((char *) taskdata)[ shareds_offset ];
printf("task->shareds address original:= %p address of pointer it points to
:= %p\n", & ((char *) taskdata)[ shareds_offset ], *task->shareds);
}
}

here,
typedef struct kmp_task {                   /* GEH: Shouldn't this be
aligned somehow? */
    void *              shareds;            /**< pointer to block of
pointers to shared vars   */
}

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)
IT PRINTS DIFFERENT ADDRESS: <0x1fe0ef0>

NEED TO GET THE ADDRESS OF TASK'S SHARED VARIABLE ADDRESS FROM RUNTIME.

appreciate your comment and help.  Thanking you.
------------------------
RaJu, Rezaul Karim
Graduate Student (PhD) | Computer Science | University of Houston
Research in High Performance Computing Tools
Houston, Texas-77004
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20151214/42d04379/attachment-0001.html>


More information about the Openmp-commits mailing list