annotate libclc/amdgcn/lib/mem_fence/fence.cl @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 #include <clc/clc.h>
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 void __clc_amdgcn_s_waitcnt(unsigned flags);
anatofuz
parents:
diff changeset
4
anatofuz
parents:
diff changeset
5 // s_waitcnt takes 16bit argument with a combined number of maximum allowed
anatofuz
parents:
diff changeset
6 // pending operations:
anatofuz
parents:
diff changeset
7 // [12:8] LGKM -- LDS, GDS, Konstant (SMRD), Messages
anatofuz
parents:
diff changeset
8 // [7] -- undefined
anatofuz
parents:
diff changeset
9 // [6:4] -- exports, GDS, and mem write
anatofuz
parents:
diff changeset
10 // [3:0] -- vector memory operations
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 // Newer clang supports __builtin_amdgcn_s_waitcnt
anatofuz
parents:
diff changeset
13 #if __clang_major__ >= 5
anatofuz
parents:
diff changeset
14 # define __waitcnt(x) __builtin_amdgcn_s_waitcnt(x)
anatofuz
parents:
diff changeset
15 #else
anatofuz
parents:
diff changeset
16 # define __waitcnt(x) __clc_amdgcn_s_waitcnt(x)
anatofuz
parents:
diff changeset
17 _CLC_DEF void __clc_amdgcn_s_waitcnt(unsigned) __asm("llvm.amdgcn.s.waitcnt");
anatofuz
parents:
diff changeset
18 #endif
anatofuz
parents:
diff changeset
19
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
20 _CLC_DEF _CLC_OVERLOAD void mem_fence(cl_mem_fence_flags flags) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
21 if (flags & CLK_GLOBAL_MEM_FENCE) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
22 // scalar loads are counted with LGKM but we don't know whether
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
23 // the compiler turned any loads to scalar
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
24 __waitcnt(0);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
25 } else if (flags & CLK_LOCAL_MEM_FENCE)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
26 __waitcnt(0xff); // LGKM is [12:8]
150
anatofuz
parents:
diff changeset
27 }
anatofuz
parents:
diff changeset
28 #undef __waitcnt
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 // We don't have separate mechanism for read and write fences
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
31 _CLC_DEF _CLC_OVERLOAD void read_mem_fence(cl_mem_fence_flags flags) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
32 mem_fence(flags);
150
anatofuz
parents:
diff changeset
33 }
anatofuz
parents:
diff changeset
34
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
35 _CLC_DEF _CLC_OVERLOAD void write_mem_fence(cl_mem_fence_flags flags) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
36 mem_fence(flags);
150
anatofuz
parents:
diff changeset
37 }