[cfe-dev] [RFC][OpenMP] Usability improvement, allow dropping offload targets
Alexey Bataev via cfe-dev
cfe-dev at lists.llvm.org
Wed Aug 1 11:45:13 PDT 2018
Hi Serguei,
I don't see a lot of problems with this example. As I can see there is
only one problem: clang-offload-bundler generates an empty object file
that cannot be recognized by the linker. If we teach
clang-offload-bundler to generate correct empty object files (what we
need to do anyway, because currently it may produce wrong utout), your
example will work without any changes.
-------------
Best regards,
Alexey Bataev
31.07.2018 16:50, Dmitriev, Serguei N пишет:
>
> Hi Alexey,
>
>
>
> Such change would fix the link issue, but I believe it would be a
> short term solution that will still be revised in future.
>
>
>
> Let me explain my concerns. Current implementation has one more
> limitation which I assume would also be addressed in future – target
> binaries are expected to have entries for all OpenMP target regions in
> the program, though it seems to be too restrictive. I assume there
> would be use cases when you would want to tune target regions in your
> program for particular targets and offloading to other targets would
> not make much sense for those regions (or probably won’t even be
> possible due to limitations of a particular target). It seems
> reasonable to compile those region only for the targets they were
> tuned for, thus I assume compiler will support the following usage
> model in future
>
>
>
> clang -fopenmp -fopenmp-targets=nvptx64-nvidia-cuda -c a.c
>
> clang -fopenmp -fopenmp-targets=x86_64-pc-linux-gnu -c b.c
>
> clang -fopenmp
> -fopenmp-targets=nvptx64-nvidia-cuda,x86_64-pc-linux-gnu a.o b.o
>
>
>
> And such usage model would anyway require redesigning the way how
> offload initialization code is generated. It has to be delayed till
> link time because the final set of offload targets that need to be
> registered in runtime would be known only at link step and thus
> compiler cannot create correct target binary descriptor object (which
> is a part of the offload initialization code) at compile time as it is
> done now.
>
>
>
> Does that sound reasonable?
>
>
>
> Thanks,
>
> Serguei
>
>
>
> *From:*Alexey Bataev [mailto:a.bataev at outlook.com]
> *Sent:* Tuesday, July 31, 2018 9:55 AM
> *To:* Dmitriev, Serguei N <serguei.n.dmitriev at intel.com>;
> cfe-dev at lists.llvm.org
> *Subject:* Re: [cfe-dev] [RFC][OpenMP] Usability improvement, allow
> dropping offload targets
>
>
>
> Hi Serguei,
>
> Actually your problem can be fixed easily with a simple patch that
> changes the linkage of the
>
> `.omp_offloading.img_[start|end]` symbols from external to external
> weak. After this change your example compiles and works perfectly
> without any additional changes. I'm going to commit this patch in few
> minutes.
> -------------
> Best regards,
> Alexey Bataev
>
> 30.07.2018 19:50, Dmitriev, Serguei N via cfe-dev пишет:
>
> Motivation
>
>
>
> The existing OpenMP offloading implementation in clang does not
> allow dropping
>
> offload targets at link time. That is, if an object file is
> created with one set
>
> of offload targets you must use exactly the same set of offload
> targets at the
>
> link stage. Otherwise, linking will fail
>
>
>
> $ clang -fopenmp
> -fopenmp-targets=x86_64-pc-linux-gnu,nvptx64-nvidia-cuda foo.c -c
>
> $ clang -fopenmp -fopenmp-targets=x86_64-pc-linux-gnu foo.o
>
> /tmp/foo-dd79f7.o:(.rodata..omp_offloading.device_images[.omp_offloading.descriptor_reg]+0x20):
> undefined reference to `.omp_offloading.img_start.nvptx64-nvidia-cuda'
>
> /tmp/foo-dd79f7.o:(.rodata..omp_offloading.device_images[.omp_offloading.descriptor_reg]+0x28):
> undefined reference to `.omp_offloading.img_end.nvptx64-nvidia-cuda'
>
> clang-7: error: linker command failed with exit code 1 (use -v to
> see invocation)
>
> $
>
>
>
> This limits OpenMP offload usability. So far, this has not been a
> high priority
>
> issue but the importance of this problem will grow once clang
> offload starts
>
> supporting static libraries with offload functionality. For
> instance, this
>
> limitation won't allow creating general purpose static libraries
> targeting
>
> multiple types of offload devices and later linking them into a
> program that
>
> uses only one offload target.
>
>
>
> Problem description
>
>
>
> Offload targets cannot be dropped at the link phase because object
> files
>
> produced by the compiler for the host have dependencies on the
> offload targets
>
> specified during compilation. These dependencies arise from the
> offload
>
> initialization code.
>
>
>
> The clang front-end adds offload initialization code to each host
> object in
>
> addition to all necessary processing of OpenMP constructs. This
> initialization
>
> code is intended to register target binaries for all offload
> targets in the
>
> runtime library at program startup. This code consists of two
> compiler-generated
>
> routines. One of these routines is added to the list of global
> constructors and
>
> the other to the global destructors. The constructor routine calls a
>
> libomptarget API which registers the target binaries and the
> destructor
>
> correspondingly calls a similar API for unregistering target binaries.
>
>
>
> Both these APIs accept a pointer to the target binary descriptor
> object which
>
> specifies the number of offload target binaries to register and
> the start/end
>
> addresses of target binary images. Since the start/end addresses
> of target
>
> binaries are not available at compile time, the target binary
> descriptors are
>
> initialized using link-time constants which reference (undefined)
> symbols
>
> containing the start/end addresses of all target images. These
> symbols are
>
> created by the dynamically-generated linker script which the clang
> driver
>
> creates for the host link action.
>
>
>
> References to the target specific symbols from host objects make
> them dependent
>
> on particular offload targets and prevents dropping offload
> targets at the link
>
> step. Therefore, the OpenMP offload initialization needs to be
> redesigned to
>
> make offload targets discardable.
>
>
>
> Proposed change
>
>
>
> Host objects should be independent of offload targets in order to
> allow dropping
>
> code for offload targets. That can be achieved by removing offload
>
> initialization code from host objects. The compiler should not
> inject this code
>
> into host objects.
>
>
>
> However, offload initialization should still be done, so it is
> proposed to move
>
> the initialization code into a special dynamically generated
> object file
>
> (referred to as 'wrapper object' here onwards), which, besides the
>
> initialization code, will also contain embedded images for offload
> targets.
>
>
>
> The wrapper object file will be generated by the clang driver with
> the help of
>
> a new tool: clang-offload-wrapper. This tool will take offload
> target binaries
>
> as input and produce bitcode files containing offload
> initialization code and
>
> embedded target images. The output bitcode is then passed to the
> backend and
>
> assembler tools from the host toolchain to produce the wrapper
> object which is
>
> then added as an input to the linker for host linking.
>
>
>
> The offload action builder in the clang driver needs to be changed
> to use this
>
> tool while building the actions graph for OpenMP offload compilations.
>
>
>
> Current status
>
>
>
> A patch with initial implementation of the proposed changes has
> been uploaded to
>
> phabricator for review - https://reviews.llvm.org/D49510.
>
>
>
> Looking for a feedback for this proposal.
>
>
>
> Thanks,
>
> Sergey
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180801/2ecf999d/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180801/2ecf999d/attachment.sig>
More information about the cfe-dev
mailing list