Hi,
I would like to bring your attention to the choice of 2 proposals for the declare mapper runtime interface:
- 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 foromp target teams
. Now we add__tgt_target_teams_mapper(..., void **mappers)
to replace it.
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 https://reviews.llvm.org/D67833 and https://reviews.llvm.org/D68100.
- 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.
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.
Your option about which one is better will be greatly appreciated.
Thanks,
Lingda Li