Skip to content
Snippets Groups Projects

P2P

Open
Jammer, Timrequested to merge
p2p into main
1 file
+ 39
10
Compare changes
  • Side-by-side
  • Inline
@@ -18,6 +18,7 @@ class RecvBeforeSend(ErrorGenerator):
@@ -18,6 +18,7 @@ class RecvBeforeSend(ErrorGenerator):
]
]
recv_funcs = ["mpi_recv", "mpi_irecv", "mpi_recv_init", "mpi_precv_init"]
recv_funcs = ["mpi_recv", "mpi_irecv", "mpi_recv_init", "mpi_precv_init"]
probe_recv_funcs = ["mpi_mprobe", "mpi_improbe"]
probe_recv_funcs = ["mpi_mprobe", "mpi_improbe"]
 
probe_funcs = ["mpi_probe", "mpi_iprobe"]
def __init__(self):
def __init__(self):
pass
pass
@@ -25,14 +26,7 @@ class RecvBeforeSend(ErrorGenerator):
@@ -25,14 +26,7 @@ class RecvBeforeSend(ErrorGenerator):
def get_feature(self):
def get_feature(self):
return ["P2P"]
return ["P2P"]
def generate_impl(self, send_func, recv_func):
def get_reverse_msg_block(self):
tm = get_send_recv_template(send_func, recv_func)
tm.set_description("CallOrdering-" + send_func, "Call Ordering: both ranks try to receive befroe sending")
tm.get_block("MPICALL").get_instruction(kind=0, index=0).set_has_error()
reverse_msg_block = InstructionBlock("second_msg")
reverse_msg_block = InstructionBlock("second_msg")
send = CorrectMPICallFactory.mpi_send()
send = CorrectMPICallFactory.mpi_send()
send.set_arg("dest", "1")
send.set_arg("dest", "1")
@@ -41,8 +35,19 @@ class RecvBeforeSend(ErrorGenerator):
@@ -41,8 +35,19 @@ class RecvBeforeSend(ErrorGenerator):
recv.set_arg("source", "0")
recv.set_arg("source", "0")
recv.set_has_error()
recv.set_has_error()
reverse_msg_block.register_instruction(recv, 1)
reverse_msg_block.register_instruction(recv, 1)
 
return reverse_msg_block
 
 
def generate_impl(self, send_func, recv_func):
 
 
tm = get_send_recv_template(send_func, recv_func)
# this is a correct case with no deadlock
tm.set_description("CallOrdering-" + send_func + "-" + recv_func,
 
"Call Ordering: both ranks try to receive befroe sending")
 
 
tm.get_block("MPICALL").get_instruction(kind=0, index=0).set_has_error()
 
 
reverse_msg_block = self.get_reverse_msg_block()
 
# this is a correct case with no deadlock: tm.insert_block(reverse_msg_block, after_block_name="MPICALL")
# introduce deadlock by moving rank 1s send after the recv
# introduce deadlock by moving rank 1s send after the recv
rank_1_send_instr = tm.get_block("MPICALL").get_instruction(kind=1, index='all')
rank_1_send_instr = tm.get_block("MPICALL").get_instruction(kind=1, index='all')
@@ -53,8 +58,32 @@ class RecvBeforeSend(ErrorGenerator):
@@ -53,8 +58,32 @@ class RecvBeforeSend(ErrorGenerator):
yield tm
yield tm
 
def generate_probe(self, probe_to_use):
 
tm = get_send_recv_template("mpi_send", "mpi_recv")
 
 
tm.set_description("CallOrdering-" + probe_to_use + "-" + "mpi_send",
 
"Call Ordering: probe for message before it is going to be send")
 
 
reverse_msg_block = self.get_reverse_msg_block()
 
tm.insert_block(reverse_msg_block, after_block_name="MPICALL")
 
 
# add the probe to rank 1 before the send
 
probecall = CorrectMPICallFactory.get(probe_to_use)
 
probecall.set_arg("source", "0") # recv from 1 is the default
 
if probe_to_use == "mpi_iprobe":
 
tm.get_block("MPICALL").insert_instruction("int flag=0;", kind=1, before_index=0)
 
tm.get_block("MPICALL").insert_instruction("while (!flag){", kind=1, before_index=1)
 
tm.get_block("MPICALL").insert_instruction(probecall, kind=1, before_index=2)
 
tm.get_block("MPICALL").insert_instruction("}", kind=1, before_index=3)
 
else:
 
tm.get_block("MPICALL").insert_instruction(probecall, kind=1, before_index=0)
 
 
yield tm
 
def generate(self, generate_full_set):
def generate(self, generate_full_set):
for send_func, recv_func in itertools.product(self.send_funcs, self.recv_funcs):
for send_func, recv_func in itertools.product(self.send_funcs, self.recv_funcs):
yield from self.generate_impl(send_func, "mpi_irecv")
yield from self.generate_impl(send_func, "mpi_irecv")
if not generate_full_set:
if not generate_full_set:
pass
return
 
yield from self.generate_probe("mpi_probe")
 
yield from self.generate_probe("mpi_iprobe")
Loading