+ // Iterate over all the sections that were specified and find the right
+ // value. (fact.factor represents the interval sizes; we want to find the
+ // section that has fact.factor <= size and no other such fact.factor <= size)
+ // Note: parse_factor() (used before) already sorts the dynar we iterate over!
XBT_DEBUG("os : %f <= %ld return %f", size, fact.factor, current);
return current;
}else{
XBT_DEBUG("os : %f <= %ld return %f", size, fact.factor, current);
return current;
}else{
- current=fact.values[0]+fact.values[1]*size;
+ // If the next section is too large, the current section must be used.
+ // Hence, save the cost, as we might have to use it.
+ current = fact.values[0]+fact.values[1]*size;
}
}
XBT_DEBUG("os : %f > %ld return %f", size, fact.factor, current);
}
}
XBT_DEBUG("os : %f > %ld return %f", size, fact.factor, current);
+ // Iterate over all the sections that were specified and find the right
+ // value. (fact.factor represents the interval sizes; we want to find the
+ // section that has fact.factor <= size and no other such fact.factor <= size)
+ // Note: parse_factor() (used before) already sorts the dynar we iterate over!
XBT_DEBUG("ois : %f <= %ld return %f", size, fact.factor, current);
return current;
}else{
XBT_DEBUG("ois : %f <= %ld return %f", size, fact.factor, current);
return current;
}else{
- current=fact.values[0]+fact.values[1]*size;
+ // If the next section is too large, the current section must be used.
+ // Hence, save the cost, as we might have to use it.
+ current = fact.values[0]+fact.values[1]*size;
}
}
XBT_DEBUG("ois : %f > %ld return %f", size, fact.factor, current);
}
}
XBT_DEBUG("ois : %f > %ld return %f", size, fact.factor, current);
+ // Iterate over all the sections that were specified and find the right
+ // value. (fact.factor represents the interval sizes; we want to find the
+ // section that has fact.factor <= size and no other such fact.factor <= size)
+ // Note: parse_factor() (used before) already sorts the dynar we iterate over!
XBT_DEBUG("or : %f <= %ld return %f", size, fact.factor, current);
return current;
XBT_DEBUG("or : %f <= %ld return %f", size, fact.factor, current);
return current;
}
XBT_DEBUG("or : %f > %ld return %f", size, fact.factor, current);
}
XBT_DEBUG("or : %f > %ld return %f", size, fact.factor, current);
if (smpi_process_initialized() && !smpi_process_finalized() && !smpi_process_get_sampling()) {
smpi_bench_end();
time = SIMIX_get_clock();
if (smpi_process_initialized() && !smpi_process_finalized() && !smpi_process_get_sampling()) {
smpi_bench_end();
time = SIMIX_get_clock();
- //to avoid deadlocks if called too many times
+ // to avoid deadlocks if used as a break condition, such as
+ // while (MPI_Wtime(...) < time_limit) {
+ // ....
+ // }
+ // because the time will not normally advance when only calls to MPI_Wtime
+ // are made -> deadlock (MPI_Wtime never reaches the time limit)
- #ifdef HAVE_TRACING
- int rank = request->src;
- if (TRACE_smpi_view_internals()) {
- TRACE_smpi_send(rank, rank, receiver,request->size);
- }
- #endif
+ int rank = request->src;
+ if (TRACE_smpi_view_internals()) {
+ TRACE_smpi_send(rank, rank, receiver,request->size);
+ }
print_request("New send", request);
//if we are giving back the control to the user without waiting for completion, we have to inject timings
print_request("New send", request);
//if we are giving back the control to the user without waiting for completion, we have to inject timings
oldbuf = request->buf;
if (!smpi_process_get_replaying() && oldbuf && request->size!=0){
if((smpi_privatize_global_variables)
oldbuf = request->buf;
if (!smpi_process_get_replaying() && oldbuf && request->size!=0){
if((smpi_privatize_global_variables)
- && ((char*)request->buf >= start_data_exe)
- && ((char*)request->buf < start_data_exe + size_data_exe )){
+ && ((char*) request->buf >= smpi_start_data_exe)
+ && ((char*)request->buf < smpi_start_data_exe + smpi_size_data_exe )){
buf = xbt_malloc(request->size);
memcpy(buf,oldbuf,request->size);
XBT_DEBUG("buf %p copied into %p",oldbuf,buf);
buf = xbt_malloc(request->size);
memcpy(buf,oldbuf,request->size);
XBT_DEBUG("buf %p copied into %p",oldbuf,buf);
if((req->flags & ACCUMULATE) || (datatype->has_subtype == 1)){
if (!smpi_process_get_replaying()){
if( smpi_privatize_global_variables
if((req->flags & ACCUMULATE) || (datatype->has_subtype == 1)){
if (!smpi_process_get_replaying()){
if( smpi_privatize_global_variables
- && ((char*)req->old_buf >= start_data_exe)
- && ((char*)req->old_buf < start_data_exe + size_data_exe )
+ && ((char*)req->old_buf >= smpi_start_data_exe)
+ && ((char*)req->old_buf < smpi_start_data_exe + smpi_size_data_exe )
){
XBT_VERB("Privatization : We are unserializing to a zone in global memory - Switch data segment ");
smpi_switch_data_segment(smpi_process_index());
){
XBT_VERB("Privatization : We are unserializing to a zone in global memory - Switch data segment ");
smpi_switch_data_segment(smpi_process_index());
- //to avoid deadlocks
- //multiplier to the sleeptime, to increase speed of execution, each failed test will increase it
+ // to avoid deadlocks if used as a break condition, such as
+ // while (MPI_Test(request, flag, status) && flag) {
+ // }
+ // because the time will not normally advance when only calls to MPI_Test
+ // are made -> deadlock
+ // multiplier to the sleeptime, to increase speed of execution, each failed test will increase it
MPI_Request request =build_request(NULL, 0, MPI_CHAR, source == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), source), smpi_comm_rank(comm), tag,
comm, PERSISTENT | RECV);
MPI_Request request =build_request(NULL, 0, MPI_CHAR, source == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), source), smpi_comm_rank(comm), tag,
comm, PERSISTENT | RECV);
- //to avoid deadlock, we have to sleep some time here, or the timer won't advance and we will only do iprobe simcalls
- //multiplier to the sleeptime, to increase speed of execution, each failed iprobe will increase it
+ // to avoid deadlock, we have to sleep some time here, or the timer won't advance and we will only do iprobe simcalls
+ // (especially when used as a break condition, such as while(MPI_Iprobe(...)) ... )
+ // multiplier to the sleeptime, to increase speed of execution, each failed iprobe will increase it
static int nsleeps = 1;
if(smpi_iprobe_sleep > 0) simcall_process_sleep(nsleeps*smpi_iprobe_sleep);
// behave like a receive, but don't do it
static int nsleeps = 1;
if(smpi_iprobe_sleep > 0) simcall_process_sleep(nsleeps*smpi_iprobe_sleep);
// behave like a receive, but don't do it
print_request("New iprobe", request);
// We have to test both mailboxes as we don't know if we will receive one one or another
print_request("New iprobe", request);
// We have to test both mailboxes as we don't know if we will receive one one or another
- if (sg_cfg_get_int("smpi/async_small_thres")>0){
- mailbox = smpi_process_mailbox_small();
- XBT_DEBUG("trying to probe the perm recv mailbox");
- request->action = simcall_comm_iprobe(mailbox, 0, request->src, request->tag, &match_recv, (void*)request);
- }
- if (request->action==NULL){
- mailbox = smpi_process_mailbox();
- XBT_DEBUG("trying to probe the other mailbox");
- request->action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, (void*)request);
- }
+ if (sg_cfg_get_int("smpi/async_small_thres")>0){
+ mailbox = smpi_process_mailbox_small();
+ XBT_DEBUG("trying to probe the perm recv mailbox");
+ request->action = simcall_comm_iprobe(mailbox, 0, request->src, request->tag, &match_recv, (void*)request);
+ }
+ if (request->action==NULL){
+ mailbox = smpi_process_mailbox();
+ XBT_DEBUG("trying to probe the other mailbox");
+ request->action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, (void*)request);
+ }
MPI_Request req = (MPI_Request)SIMIX_comm_get_src_data(request->action);
*flag = 1;
if(status != MPI_STATUS_IGNORE && !(req->flags & PREPARED)) {
status->MPI_SOURCE = smpi_group_rank(smpi_comm_group(comm), req->src);
MPI_Request req = (MPI_Request)SIMIX_comm_get_src_data(request->action);
*flag = 1;
if(status != MPI_STATUS_IGNORE && !(req->flags & PREPARED)) {
status->MPI_SOURCE = smpi_group_rank(smpi_comm_group(comm), req->src);
- status->MPI_TAG = req->tag;
- status->MPI_ERROR = MPI_SUCCESS;
- status->count = req->real_size;
+ status->MPI_TAG = req->tag;
+ status->MPI_ERROR = MPI_SUCCESS;
+ status->count = req->real_size;