[Libclc-dev] [PATCH] R600: Use new barrier intrinsic

Jan Vesely via Libclc-dev libclc-dev at lists.llvm.org
Fri Jul 15 09:03:15 PDT 2016


On Thu, 2016-07-14 at 23:48 -0700, Matt Arsenault via Libclc-dev wrote:
> > 
> > On Jul 14, 2016, at 20:03, Aaron Watry <awatry at gmail.com> wrote:
> > 
> > Re-adding libclc to CC list.... oops.
> > 
> > On Thu, Jul 14, 2016 at 10:03 PM, Aaron Watry <awatry at gmail.com
> > <mailto:awatry at gmail.com>> wrote:
> > From 02c998f017107153c6dc78b8eb58192bfc338d80 Mon Sep 17 00:00:00
> > 2001
> > From: Matt Arsenault <matthew.arsenault at Amd.com>
> > Date: Wed, 13 Jul 2016 21:07:53 -0700
> > Subject: [PATCH] R600: Use new barrier intrinsic
> > 
> > ---
> >  r600/lib/synchronization/barrier_impl.ll | 7 +++----
> >  1 file changed, 3 insertions(+), 4 deletions(-)
> > 
> > diff --git a/r600/lib/synchronization/barrier_impl.ll
> > b/r600/lib/synchronization/barrier_impl.ll
> > index 825b2eb..9b8fefb 100644
> > --- a/r600/lib/synchronization/barrier_impl.ll
> > +++ b/r600/lib/synchronization/barrier_impl.ll
> > @@ -1,7 +1,6 @@
> >  declare i32 @__clc_clk_local_mem_fence() #1
> >  declare i32 @__clc_clk_global_mem_fence() #1
> > -declare void @llvm.AMDGPU.barrier.local() #0
> > -declare void @llvm.AMDGPU.barrier.global() #0
> > +declare void @llvm.r600.group.barrier() #0
> >  
> >  define void @barrier(i32 %flags) #2 {
> >  barrier_local_test:
> > @@ -11,7 +10,7 @@ barrier_local_test:
> >    br i1 %1, label %barrier_local, label %barrier_global_test
> >  
> >  barrier_local:
> > -  call void @llvm.AMDGPU.barrier.local()
> > +  call void @llvm.r600.group.barrier()
> > 
> > Please pardon my ignorance, but does the new intrinsic handle
> > synchronizing writes/reads to local/global memory along with thread
> > synchronization?
> > 
> > If that is the case, could we modify the barrier_local portion to
> > jump straight to done, so that we don't end up inserting two
> > barriers if someone calls
> > barrier(CLK_GLOBAL_MEM_FENCE | CLK_LOCAL_MEM_FENCE);
> > 
> > I don't have my NI card installed at the moment, but could if
> > necessary to test things out.
> > 
> > --Aaron
> > 
> 
> No, but the old intrinsics didn’t either. There is only one
> synchronization instruction, the memory fence is a different problem.
> I don’t think it actually matters with the constraint that global
> memory is only consistent within a workgroup, although I”m less sure
> how the old hardware caches worked

EG/NI both reload/flush L1 (VC and TC) caches at the beginning and end
of every fetch clause. We can make the barrier instruction wait for
previous CF instructions (bit 31 CF_WORD0), but afaik it only waits for
instruction to complete (i.e I don't think it waits for the flush
complete).

There are _ACK versions of VC/TC fetch clauses, and WAIT_ACK
instruction as fence, although I haven't found decisive info on whether
these do wait for flushes to complete (or how they differ from using
barrier bit).

I agree with the point about issuing two barrier instructions. IMO the
correct implementation of this functions for r600 would be:

void barrier(cl_mem_fence_flags flags) {
  mem_fence(flags);
  __builtin_r600_barrier();
}

the current implementation also fails to issue any barrier if flags ==
0, so reducing it to:

define void @barrier(i32 %flags) #2 {
  call void @llvm.r600.group.barrier()
  ret void
}

would be an improvement


jan
> 
> -Matt
> 
> _______________________________________________
> Libclc-dev mailing list
> Libclc-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/libclc-dev
-- 
Jan Vesely <jan.vesely at rutgers.edu>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.llvm.org/pipermail/libclc-dev/attachments/20160715/c71da77a/attachment.sig>


More information about the Libclc-dev mailing list