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)
-
for.png
(112.4 KB
) - added by 10 years ago.
control graph
Download all attachments as: .zip
Note:
See TracWiki
for help on using the wiki.
