#include "private.h"
#include "xbt/virtu.h"
#include "mc/mc.h"
+#include "mc/mc_replay.h"
#include "xbt/replay.h"
#include <errno.h>
#include "simix/smx_private.h"
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)
if(smpi_wtime_sleep > 0) simcall_process_sleep(smpi_wtime_sleep);
smpi_bench_begin();
} else {
else
request->refcount = 0;
request->op = MPI_REPLACE;
-#ifdef HAVE_TRACING
request->send = 0;
request->recv = 0;
-#endif
if (flags & SEND) smpi_datatype_unuse(datatype);
return request;
int receiver = request->dst;
- #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
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 )){
XBT_DEBUG("Privatization : We are sending from a zone inside global memory. Switch data segment ");
- smpi_switch_data_segment(request->src);
- }
+ smpi_switch_data_segment(request->src);
+ }
buf = xbt_malloc(request->size);
memcpy(buf,oldbuf,request->size);
XBT_DEBUG("buf %p copied into %p",oldbuf,buf);
-#ifdef HAVE_TRACING
/* FIXME: detached sends are not traceable (request->action == NULL) */
if (request->action)
- simcall_set_category(request->action, TRACE_internal_smpi_get_category());
+ simcall_set_category(request->action, TRACE_internal_smpi_get_category());
-#endif
xbt_mutex_release(mut);
}
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());
}
-#ifdef HAVE_TRACING
if (TRACE_smpi_view_internals()) {
if(req->flags & RECV){
int rank = smpi_process_index();
TRACE_smpi_recv(rank, src_traced, rank);
}
}
-#endif
if(req->detached_sender!=NULL){
smpi_mpi_request_free(&(req->detached_sender));
//assume that request is not MPI_REQUEST_NULL (filtered in PMPI_Test or smpi_mpi_testall before)
- //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
static int nsleeps = 1;
if(smpi_test_sleep > 0) simcall_process_sleep(nsleeps*smpi_test_sleep);
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