<div dir="ltr">Hi,<div><br></div><div>I would like to bring your attention to the choice of 2 proposals for the declare mapper runtime interface:</div><div><br></div><div>1. The current design which creates new runtime functions for declare mappers. For example, right now we have `__tgt_target_teams(...)` which corresponds to the runtime interface for `omp target teams`. Now we add `__tgt_target_teams_mapper(..., void **mappers)` to replace it.</div><div><br></div><div>As a result, the old interfaces will be deprecated, but they need to be kept there for backward compatibility. I think this scheme is clear and has no hidden problems. The down side is it will create more OpenMP runtime interfaces. The patches for this scheme can be found at <a href="https://reviews.llvm.org/D67833">https://reviews.llvm.org/D67833</a> and <a href="https://reviews.llvm.org/D68100">https://reviews.llvm.org/D68100</a>.</div><div><br></div><div>2. Introduce a function `__tgt_push_mappers`, which should be called before every target function call (e.g., `__tgt_target_teams`) to pass the mapper argument for that function. The call of `__tgt_push_mappers` is implicitly bonded with the actual target call.</div><div><br></div><div>This scheme will introduce less runtime interfaces. Its problem is the implementation is not straightforward and needs to take extra precautions. For example, each OpenMP task should have a separate mapper storage, to prevent a target region from reading the mapper written by another task.</div><div><br></div><div>Your option about which one is better will be greatly appreciated.</div><div><br></div><div>Thanks,</div><div>Lingda Li</div></div>