Commit 72accf06 authored by Shane Snyder's avatar Shane Snyder

Merge branch 'master' of git.mcs.anl.gov:radix/codes-base

parents 2d6a1673 a5c689f1
...@@ -29,6 +29,7 @@ enum cl_event_t ...@@ -29,6 +29,7 @@ enum cl_event_t
CL_GETSIZE=1, CL_GETSIZE=1,
CL_GETRANK, CL_GETRANK,
CL_WRITEAT, CL_WRITEAT,
CL_READAT,
CL_OPEN, CL_OPEN,
CL_CLOSE, CL_CLOSE,
CL_SYNC, CL_SYNC,
......
...@@ -22,6 +22,8 @@ char * code_kernel_helpers_kinstToStr(int inst) ...@@ -22,6 +22,8 @@ char * code_kernel_helpers_kinstToStr(int inst)
{ {
case WRITEAT: case WRITEAT:
return "WRITEAT"; return "WRITEAT";
case READAT:
return "READAT";
case GETGROUPRANK: case GETGROUPRANK:
return "GETGROUPRANK"; return "GETGROUPRANK";
case GETGROUPSIZE: case GETGROUPSIZE:
...@@ -51,6 +53,8 @@ char * code_kernel_helpers_cleventToStr(int inst) ...@@ -51,6 +53,8 @@ char * code_kernel_helpers_cleventToStr(int inst)
{ {
case CL_WRITEAT: case CL_WRITEAT:
return "CL_WRITEAT"; return "CL_WRITEAT";
case CL_READAT:
return "CL_READAT";
case CL_GETRANK: case CL_GETRANK:
return "CL_GETRANK"; return "CL_GETRANK";
case CL_GETSIZE: case CL_GETSIZE:
...@@ -80,6 +84,8 @@ static int convertKLInstToEvent(int inst) ...@@ -80,6 +84,8 @@ static int convertKLInstToEvent(int inst)
{ {
case WRITEAT: case WRITEAT:
return CL_WRITEAT; return CL_WRITEAT;
case READAT:
return CL_READAT;
case GETGROUPRANK: case GETGROUPRANK:
return CL_GETRANK; return CL_GETRANK;
case GETGROUPSIZE: case GETGROUPSIZE:
...@@ -214,6 +220,7 @@ int codes_kernel_helper_parse_input(CodesIOKernel_pstate * ps, CodesIOKernelCont ...@@ -214,6 +220,7 @@ int codes_kernel_helper_parse_input(CodesIOKernel_pstate * ps, CodesIOKernelCont
{ {
/* for each instrunction that triggers a simulator event */ /* for each instrunction that triggers a simulator event */
case WRITEAT: case WRITEAT:
case READAT:
case GETGROUPRANK: case GETGROUPRANK:
case GETGROUPSIZE: case GETGROUPSIZE:
case CLOSE: case CLOSE:
...@@ -247,6 +254,7 @@ int codes_kernel_helper_parse_input(CodesIOKernel_pstate * ps, CodesIOKernelCont ...@@ -247,6 +254,7 @@ int codes_kernel_helper_parse_input(CodesIOKernel_pstate * ps, CodesIOKernelCont
case CL_GETRANK: case CL_GETRANK:
case CL_GETSIZE: case CL_GETSIZE:
case CL_WRITEAT: case CL_WRITEAT:
case CL_READAT:
case CL_OPEN: case CL_OPEN:
case CL_CLOSE: case CL_CLOSE:
case CL_SYNC: case CL_SYNC:
......
- The codes-mapping.h header file contains the function definitions for the codes LP mapping.
Step 1: Specifying the LP types in the config file:
- Here is an example of a config file that specifies the codes LP mapping
-------------------------------example-test.conf-----------------------------
LPGROUPS
{
MODELNET_GRP
{
repetitions="16";
server="1";
example_net="1";
}
}
------------------------------------------------------------------------------
In this config file, there are multiple LP types defined in a single LP group (As we will see in a later
example, there can be multiple LP groups in a config file too). There is 1 server LP and 1 example_net
LP type in a group and this combination is repeated 16 time (repetitions="16"). ROSS will assign the
LPs to the PEs (PEs is an abstraction for MPI rank in ROSS) by placing 1 server LP then 1 example_net
LP a total of 16 times. This configuration is useful if there is some form of communication involved
between the server and example_net LP types, in which case ROSS will place them on the same PE and
communication between server and example_net LPs will not involve remote messages.
The number of server and example_net LPs can be more than 1. Lets assume if we have two example_net
LPs for each server then the config file will have the following format:
-------------------------------example-test2.conf-----------------------------
LPGROUPS
{
MODELNET_GRP
{
repetitions="16";
server="1";
example_net="2";
}
}
------------------------------------------------------------------------------
Step 2: Loading the config file in the model:
After the initialization function calls of ROSS (tw_init), the configuration file can be loaded in the
example program using:
configuration_load(example-test.conf, MPI_COMM_WORLD, &config);
Step 3: Each LP type must register itself with the lp_type_register before setting up the codes-mapping.
Following is an example function that registers 'server' lp type.
static void svr_add_lp_type()
{
lp_type_register("server", svr_get_lp_type());
}
Step 4: Call to codes_mapping_setup that sets up the LPs of each registered LP type as specified in the config
file.
codes_mapping_setup();
Step 5: Querying number of LPs in a repetition
int codes_mapping_get_lp_count(group_name, lp_type_name);
For example, to query the number of server LPs in example-test2.conf file, calling
num_servers = codes_mapping_get_lp_count("MODELNET_GRP", "server");
will return 2.
Step 6: Querying number of repetitions in a particular group, use
int codes_mapping_get_group_reps(group_name);
For example, to query the number of repetitions in example-test2.conf file, calling
num_repetitions = codes_mapping_get_group_reps("MODELNET_GRP");
will return 16.
...@@ -90,61 +90,31 @@ int bgp_io_workload_load(const char* params, int rank) ...@@ -90,61 +90,31 @@ int bgp_io_workload_load(const char* params, int rank)
/* Maps the enum types from I/O language to the CODES workload API */ /* Maps the enum types from I/O language to the CODES workload API */
static int convertTypes(int inst) static int convertTypes(int inst)
{ {
int op_type = -1;
switch(inst) switch(inst)
{ {
case CL_WRITEAT: /* write to file */ case CL_WRITEAT: /* write to file */
{ return CODES_WK_WRITE;
op_type = CODES_WK_WRITE; case CL_READAT:
} return CODES_WK_READ;
break;
case CL_CLOSE: case CL_CLOSE:
{ return CODES_WK_CLOSE; /* close the file */
op_type = CODES_WK_CLOSE; /* close the file */
}
break;
case CL_OPEN: case CL_OPEN:
{ return CODES_WK_OPEN; /* open file */
op_type = CODES_WK_OPEN; /* open file */
}
break;
case CL_SYNC: case CL_SYNC:
{ return CODES_WK_BARRIER; /* barrier in CODES workload is similar to sync in I/O lang? */
op_type = CODES_WK_BARRIER; /* barrier in CODES workload is similar to sync in I/O lang? */
}
break;
case CL_SLEEP: case CL_SLEEP:
{ return CODES_WK_DELAY; /* sleep or delay */
op_type = CODES_WK_DELAY; /* sleep or delay */
}
break;
case CL_EXIT: case CL_EXIT:
{ return CODES_WK_END; /* end of the operations/ no more operations in file */
op_type = CODES_WK_END; /* end of the operations/ no more operations in file */
}
break;
case CL_DELETE: case CL_DELETE:
{ return -2;
op_type = -2;
}
break;
case CL_GETRANK: case CL_GETRANK:
{ return -3; /* defined in I/O lang but not in workloads API*/
op_type = -3; /* defined in I/O lang but not in workloads API*/
}
break;
case CL_GETSIZE: case CL_GETSIZE:
{ return -4; /* defined in I/O lang but not in workload API */
op_type = -4; /* defined in I/O lang but not in workload API */
}
break;
default: default:
{ return -1;
//printf("\n convert type undefined %d ", inst); }
op_type = -1;
}
}
return op_type;
} }
/* Gets the next operation specified in the workload file for the simulated MPI rank /* Gets the next operation specified in the workload file for the simulated MPI rank
...@@ -196,7 +166,9 @@ void bgp_io_workload_get_next(int rank, struct codes_workload_op *op) ...@@ -196,7 +166,9 @@ void bgp_io_workload_get_next(int rank, struct codes_workload_op *op)
break; break;
case CODES_WK_READ: case CODES_WK_READ:
{ {
/* to be added (the BG/P model does not supports read operations right now) */ op->u.read.file_id = (wrkld_arr[local_rank].next_event).var[0];
op->u.read.offset = (wrkld_arr[local_rank].next_event).var[2];
op->u.read.size = (wrkld_arr[local_rank].next_event).var[1];
} }
break; break;
default: default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment