diff --git a/scripts/Infrastructure/TemplateFactory.py b/scripts/Infrastructure/TemplateFactory.py index 32f4e29427ae94447bd2a4a782f8e75c2a2d38e6..3772f8f72226198fed9bbf5986fd2089cfb39754 100644 --- a/scripts/Infrastructure/TemplateFactory.py +++ b/scripts/Infrastructure/TemplateFactory.py @@ -756,6 +756,7 @@ def get_rma_call(tm: TemplateManager, rma_func, rank, identifier="RMACall") -> T rma_call = getattr(cfmpi, rma_func)() rma_call.set_identifier(identifier) rma_call.set_rank_executing(rank) + rma_call.set_arg("target_rank", "1") # request-based RMA call, add request if rma_call.has_arg("request"): diff --git a/scripts/errors/rma/LocalConcurrency.py b/scripts/errors/rma/LocalConcurrency.py index 9bc87c75f3f19de8a1e9ddb9c58c424d83c2a425..b068aa7302a60c4a2ea4fc8e39f375bd3f0b351f 100644 --- a/scripts/errors/rma/LocalConcurrency.py +++ b/scripts/errors/rma/LocalConcurrency.py @@ -22,8 +22,8 @@ class LocalConcurrencyErrorRMA(ErrorGenerator): self.cfmpi = CorrectMPICallFactory() # generate standard buffer access instructions self.buf_instructions = { - "bufread": Instruction(f'printf("buf is %d\\n", {CorrectParameterFactory().buf_var_name}[1]);', 0, "bufread"), - "bufwrite": Instruction(f'{CorrectParameterFactory().buf_var_name}[1] = 42;', 0, "bufwrite") + "bufread": Instruction(f'printf("buf is %d\\n", {CorrectParameterFactory().buf_var_name}[0]);', 0, "bufread"), + "bufwrite": Instruction(f'{CorrectParameterFactory().buf_var_name}[0] = 42;', 0, "bufwrite") } def get_feature(self): @@ -318,7 +318,7 @@ class LocalConcurrencyErrorRMA(ErrorGenerator): for (op1, op2) in itertools.product(ops1, ops2): self.tm = TemplateManager() (win_declare, win_alloc, win_free) = get_allocated_window( - "mpi_win_create", cf.get("win"), cf.winbuf_var_name, "int", "10") + "mpi_win_create", cf.get("win"), cf.winbuf_var_name, "int", "20") # window allocation boilerplate self.tm.register_instruction(win_declare) self.tm.register_instruction(win_alloc) @@ -332,9 +332,15 @@ class LocalConcurrencyErrorRMA(ErrorGenerator): alloc1, inst1, inst1_free = self.get_mem_op(op1, 0) alloc2, inst2, inst2_free = self.get_mem_op(op2, 0) - # avoid race at the target rank by setting the target rank to 1 for the second operation - if isinstance(inst2, MPICall): - inst2.set_arg("target_rank", "0") + if sync_mode not in [self.lockflush, self.lockflushlocal, self.lockunlock]: + # avoid race at the target rank by setting the target rank to 0 for the second operation + if isinstance(inst2, MPICall): + inst2.set_arg("target_rank", "0") + else: + # cannot set target rank to 0, because this would be not allowed with exclusive locks here + # avoid race at the target rank by setting the target disp to 10 for the second operation + if isinstance(inst2, MPICall): + inst2.set_arg("target_disp", "10") # if the operations are not conflicting and we should sync, we do not have to generate this test case if not hasconflict and shouldsync: