Honza, Martin,

Further to our conversation on IRC ...

We have just completed work on a GCN3 & GCN5 port intended for running OpenMP and OpenACC offload kernels on AMD Fiji and Vega discrete GPUs. Unfortunately Carrizo is probably broken because we don't have one to test, and the APUs use shared memory and XNACK, which we've not paid any attention to.

There will be a binary release available soon(ish).

Apologies the development schedule has made it hard to push the work upstream, but now it is time.

I've posted the code to Github for reference:
 https://github.com/ams-cs/gcc
 https://github.com/ams-cs/newlib

We're using LLVM 6 for the assembler and linker; there's no binutils port.

It should be possible to build a "standalone" amdgcn-none-amdhsa compiler that can run code via the included "gcn-run" loader tool (and the HSA runtime). This can be used to run the testsuite, with a little dejagnu config trickery.

It should also be possible to build an x86_64-linux-gnu compiler with --enable-offload-target=gcn, and a matching amdgcn-none-amdhsa compiler with --enable-as-accelerator-for=x86_64-linux-gnu, and have them run code offloaded with OpenMP or OpenACC directives.

The code is based on Honza's original port, rebased to GCC 7.3.

I'd like to agree an upstreaming strategy that
a) gets basic GCN support into trunk soonish. We'll need to get a few middle/front end patches approved, and probably update a few back-end hooks, but this ought to be easy enough. b) gets trunk OpenMP/OpenACC to work for GCN, eventually. I'm expecting some pain in libgomp here. c) gives me a stable base from which to make binary releases (i.e. not trunk). d) allows me to use openacc-gcc-8-branch without too much duplication of effort.

How about the following strategy?

1. Create "gcn-gcc-7-branch" to archive the current work. This would be a source for merges (or cherry-picking), but I'd not expect much future development. Initially it would have the same content as the Github repository above.

2. Create "gcn-gcc-8-branch" with a merger of "gcc-8-branch" and "gcn-gcc-7-branch". This would be broken w.r.t. libgomp, initially, but get fixed up in time. It would receive occasional merges from the release branch. I expect to do GCN back-end development work here.

3. Create "gcn-openacc-gcc-8-branch" from the new "gcn-gcc-8-branch", and merge in "openacc-gcc-8-branch". This will hold offloading patches not compatible with trunk, and receive updated GCN changes via merge. I intend to deliver my next binary release from this branch.

4. Replace/update the existing "gcn" branch with a merger of "trunk" and "gcn-gcc-8-branch" (not the OpenACC branch). This would be merged to trunk, and possibly retired, as soon as possible. I imagine bits will have to be submitted as patches, and then the back-end merged as a whole.

trunk
 |\
 | gcc-7-branch
 | |\
 | : gcn-gcc-7-branch
 |                  \
 |\                  '--------.
 | gcc-8-branch               |
 | | \         '------------. |
 | :  openacc-gcc-8-branch  gcn-gcc-8-branch
 |               \           /         |
 |              gcn-openacc-8-branch   |
 |\  ,---------------------------------'
 | gcn
 |/
gcc-9

It's slightly complex to describe, but hopefully logical and workable.

Comments? Better suggestions?

--
Andrew Stubbs
Mentor Graphics / CodeSourcery.

Reply via email to