wiki:Insieme

A simple OpenMP program

#include <omp.h>
#define N 10

int main (int argc, char * argv[]){
  double a[N];
  int i;

#pragma omp parallel
#pragma omp for
  for(i=0; i<N; i++)
      a[i] = 0;
}

Translation unit:

TU(
	Types:
		_omp_lock_t => struct _omp_lock_t <insieme_omp_lock_struct_marker:int<4>>,
	Globals:
		,
	Initializer:
		,
	Functions:
		main : ((int<4>,ref<array<ref<array<char,1>>,1>>)->int<4>) => fun(int<4> v2, ref<array<ref<array<char,1>>,1>> v3) -> int<4> {decl ref<vector<real<8>,10>> v4 = ( var(undefined(type<vector<real<8>,10>>)));decl ref<int<4>> v54 = ( var(undefined(type<int<4>>)));{merge(parallel(job(([1-inf])){bind(){fun(ref<vector<real<8>,10>> v103) -> unit {{pfor(getThreadGroup(0), 0, 10, 1, bind(v91, v92, v93){fun(ref<vector<real<8>,10>> v87, int<4> v88, int<4> v89, int<4> v90) -> unit {for(decl int<4> v64 = v88 .. v89 : v90) {((ref_vector_to_ref_array(v87)&[int_to_uint(v64, 4)]) := 0.0);};}(v103, v91, v92, v93)});(barrier());};mergeAll();}(v4)}}));};merge(parallel(job(([1-inf])){bind(){fun(ref<int<4>> v105) -> unit {{(v105 := 10);};mergeAll();}(v54)}}));},
	Entry Points:	{},
	MetaInfos:	{_omp_lock_t : [class-info <
>
]}
)

Control flow graph: see attachment

Insieme IR:

let fun000 = fun(ref<vector<real<8>,10>> v87, int<4> v88, int<4> v89, int<4> v90) -> unit {
    for(decl int<4> v64 = v88 .. v89 : v90) {
        ((ref_vector_to_ref_array(v87)&[int_to_uint(v64, 4)]) := 0.0);
    };
};

let fun001 = fun(ref<array<int<4>,1>> v1, uint<8> v2, uint<8> v3) -> unit {
    return unit;
};

let fun002 = fun(ref<vector<real<8>,10>> v103) -> unit {
    {
        pfor(getThreadGroup(0), 0, 10, 1, bind(v91, v92, v93){fun000(v103, v91, v92, v93)});
        (barrier());
    };
    mergeAll();
};

let fun003 = fun(ref<int<4>> v105) -> unit {
    {
        (v105 := 10);
    };
    mergeAll();
};

let fun004 = fun(int<4> v2, ref<array<ref<array<char,1>>,1>> v3) -> int<4> {
    decl ref<vector<real<8>,10>> v4 = ( var(undefined(type<vector<real<8>,10>>)));
    decl ref<int<4>> v54 = ( var(undefined(type<int<4>>)));
    {
        merge(parallel(job(([1-inf])){
            bind(){fun002(v4)}
        }));
    };
    merge(parallel(job(([1-inf])){
        bind(){fun003(v54)}
    }));
    return 0;
};

// Inspire Program 
//  Entry Point: 
fun004

target code:

/**
 * ------------------------ Auto-generated Code ------------------------ 
 *           This code was generated by the Insieme Compiler 
 * --------------------------------------------------------------------- 
 */
#include <ir_interface.h>
#include <irt_all_impls.h>
#include <standalone.h>
#include <stdbool.h>
#include <stdint.h>

struct __insieme_type_10;
typedef struct __insieme_type_10 __insieme_type_10;

struct __insieme_type_19;
typedef struct __insieme_type_19 __insieme_type_19;

struct __insieme_type_19 {
    irt_type_id c0;
    __insieme_type_10* c1;
};

struct __insieme_type_24;
typedef struct __insieme_type_24 __insieme_type_24;

struct __insieme_type_24 {
    irt_type_id c0;
    int32_t* c1;
};

struct __insieme_type_26;
typedef struct __insieme_type_26 __insieme_type_26;

struct __insieme_type_26 {
    irt_type_id c0;
    int32_t c1;
    char** c2;
};

// --- components for type table entries ---
irt_type_id g_type_2_components[] = {0,1};
irt_type_id g_type_4_components[] = {0,3};
irt_type_id g_type_7_components[] = {0,5,6};

// --- the type table ---
irt_type g_insieme_type_table[] = {
    {IRT_T_UINT32, sizeof(irt_type_id), 0, 0},
    {IRT_T_POINTER, sizeof(__insieme_type_10*), 0, 0},
    {IRT_T_STRUCT, sizeof(__insieme_type_19), 2, g_type_2_components},
    {IRT_T_POINTER, sizeof(int32_t*), 0, 0},
    {IRT_T_STRUCT, sizeof(__insieme_type_24), 2, g_type_4_components},
    {IRT_T_INT32, sizeof(int32_t), 0, 0},
    {IRT_T_POINTER, sizeof(char**), 0, 0},
    {IRT_T_STRUCT, sizeof(__insieme_type_26), 3, g_type_7_components}
};

struct __insieme_type_10 {
    double data[10];
};

/* ------- Function Definitions --------- */
void insieme_wi_0_var_0_impl(irt_work_item* var_1) {
    irt_work_item_range var_2 = (*var_1).range;
    int32_t var_3 = var_2.begin;
    int32_t var_4 = var_2.end;
    int32_t var_5 = var_2.step;
    {
        for (int32_t i_ins_it = var_3; i_ins_it < var_4; i_ins_it+=var_5) {
            ((double*)(*(__insieme_type_19*)(*var_1).parameters).c1)[i_ins_it] = 0.0;
        };
    };
}
/* ------- Function Definitions --------- */
void __insieme_fun_21(int32_t* var_1) {
    {
        *var_1 = 10;
    };
    irt_wi_join_all(irt_wi_get_current());
}
/* ------- Function Definitions --------- */
void insieme_wi_2_var_0_impl(irt_work_item* var_1) {
    __insieme_fun_21((*(__insieme_type_24*)(*var_1).parameters).c1);
}
// --- the meta info table --- 
irt_meta_info_table_entry g_insieme_meta_table[] = {
    {{ false, 0, 0 },{ false, 0, -1, -1, 0, -1, -1, 0, -1, -1, 0, -1, -1, (2147483647 * 2U + 1U), (2147483647 * 2U + 1U) },{ false, false },{ false, { 0 }, { 0 }, 0, 0, 0 },{ false, "" }}, /* the no-info-entry */
    {{ false, 0, 0 },{ false, 0, -1, -1, 0, -1, -1, 0, -1, -1, 0, -1, -1, (2147483647 * 2U + 1U), (2147483647 * 2U + 1U) },{ true, (bool)false },{ false, { 0 }, { 0 }, 0, 0, 0 },{ false, "" }}
};

extern irt_wi_implementation g_insieme_impl_table[];
/* ------- Function Definitions --------- */
void __insieme_fun_13(__insieme_type_10* var_1) {
    {
        irt_pfor(irt_wi_get_current(), irt_wi_get_wg(irt_wi_get_current(), 0u), (irt_work_item_range){0, 10, 1}, &g_insieme_impl_table[0], (irt_lw_data_item*)(&(__insieme_type_19){2, var_1}));
        irt_wg_barrier(irt_wi_get_wg(irt_wi_get_current(), 0u));
    };
    irt_wi_join_all(irt_wi_get_current());
}
/* ------- Function Definitions --------- */
void insieme_wi_1_var_0_impl(irt_work_item* var_1) {
    __insieme_fun_13((*(__insieme_type_19*)(*var_1).parameters).c1);
}
/* ------- Function Definitions --------- */
int32_t __insieme_fun_8(int32_t argc, char** argv) {
    __insieme_type_10 a;
    int32_t i;
    {
        irt_merge(irt_parallel(&(irt_parallel_job){(uint64_t)1, (uint64_t)4294967295, (uint64_t)1, &g_insieme_impl_table[1], (irt_lw_data_item*)(&(__insieme_type_19){2, &a})}));
    };
    irt_merge(irt_parallel(&(irt_parallel_job){(uint64_t)1, (uint64_t)4294967295, (uint64_t)1, &g_insieme_impl_table[2], (irt_lw_data_item*)(&(__insieme_type_24){4, &i})}));
    return 0;
}
/* ------- Function Definitions --------- */
void insieme_wi_3_var_0_impl(irt_work_item* var_229) {
    __insieme_fun_8((*(__insieme_type_26*)(*var_229).parameters).c1, (*(__insieme_type_26*)(*var_229).parameters).c2);
}
// --- work item variants ---
irt_wi_implementation_variant g_insieme_wi_0_variants[] = {
    { &insieme_wi_0_var_0_impl, 0, NULL, 0, NULL,  &(g_insieme_meta_table[1]) },
};
irt_wi_implementation_variant g_insieme_wi_1_variants[] = {
    { &insieme_wi_1_var_0_impl, 0, NULL, 0, NULL,  &(g_insieme_meta_table[0]) },
};
irt_wi_implementation_variant g_insieme_wi_2_variants[] = {
    { &insieme_wi_2_var_0_impl, 0, NULL, 0, NULL,  &(g_insieme_meta_table[0]) },
};
irt_wi_implementation_variant g_insieme_wi_3_variants[] = {
    { &insieme_wi_3_var_0_impl, 0, NULL, 0, NULL,  &(g_insieme_meta_table[0]) },
};
// --- the implementation table --- 
irt_wi_implementation g_insieme_impl_table[] = {
    { 1, 1, g_insieme_wi_0_variants },
    { 2, 1, g_insieme_wi_1_variants },
    { 3, 1, g_insieme_wi_2_variants },
    { 4, 1, g_insieme_wi_3_variants },
};

void insieme_init_context(irt_context* context) {
    context->type_table_size = 8;
    context->type_table = g_insieme_type_table;
    context->impl_table_size = 4;
    context->impl_table = g_insieme_impl_table;
    context->info_table_size = 2;
    context->info_table = g_insieme_meta_table;
    context->num_regions = 1;
}

void insieme_cleanup_context(irt_context* context) {
}

/* ------- Function Definitions --------- */
int32_t main(int32_t var_227, char** var_228) {
    irt_runtime_standalone(irt_get_default_worker_count(), &insieme_init_context, &insieme_cleanup_context, &g_insieme_impl_table[3], (irt_lw_data_item*)(&(__insieme_type_26){7, var_227, var_228}));
    return 0;
}



No OpenMP transformation (ignoring OpenMP pragma):

let fun000 = fun(int<4> v2, ref<array<ref<array<char,1>>,1>> v3) -> int<4> {
    decl ref<vector<real<8>,10>> v4 = ( var(undefined(type<vector<real<8>,10>>)));
    decl ref<int<4>> v54 = ( var(undefined(type<int<4>>)));
    for(decl int<4> v64 = 0 .. 10 : 1) {
        ((ref_vector_to_ref_array(v4)&[int_to_uint(v64, 4)]) := 0.0);
    };
    (v54 := 10);
    return 0;
};

// Inspire Program 
//  Entry Point: 
fun000
Last modified 10 years ago Last modified on 05/25/16 10:36:55

Attachments (1)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.