in src/dev/spatial_conv.py [0:0]
def gpu_fprop_tune(self):
C, H, W, N, P, Q, R, S, pad_r, pad_s, std = self.fprop_params
results = list()
TILE_P = 8;
TILE_Q = 8;
TILE_N = 16;
TILE_H = TILE_P + R - 1;
TILE_W1 = TILE_Q + S - 1;
TILE_W = ceil_div(TILE_W1, 8)*8;
TILE_PQ = TILE_P * TILE_Q;
TILE_HW = TILE_H * TILE_W;
TILE_RW = R * TILE_W;
#wys = (4,2,1) if R <= 10 else (2,1)
for WARP_Y in (2,):
for WARP_X in range(1,5):
THREADS = WARP_X * WARP_Y * 32;
TILE_X = ceil_div(TILE_RW, WARP_X*8)*8
TILE_Y = TILE_P // WARP_Y
TILE_RW4 = TILE_X * WARP_X
STRD_RW = TILE_RW4 if TILE_RW4 & (16|8|4) else TILE_RW4 + 4
STRD_HW = (TILE_HW + TILE_RW4 - TILE_RW) | 4
SIZE_F = STRD_RW*4 + 8;
SIZE_I = STRD_HW * TILE_N;
SIZE_O = WARP_X*TILE_PQ*TILE_N if WARP_X > 1 else 0
F_LOOPS = ceil_div(STRD_RW, THREADS)
I_LOOPS = ceil_div(STRD_HW, THREADS)
SHARE = max((SIZE_F + SIZE_I)*2, SIZE_O*4)
BLOCKS = min(49152*2 // SHARE, 1024 // THREADS)
if 64 <= THREADS <= 1024 and SHARE <= 49152:
for b in range(1, BLOCKS+1):
op = f"k:8 t:{THREADS:4d} wy:{WARP_Y:d} wx:{WARP_X:d} b:{b:2d} ma:{TILE_X//2:4d} fl:{F_LOOPS:2d} il:{I_LOOPS:2d} sh:{SHARE:5d}"
#print(op)
kernel, devO, cpuO = xprop_kernel(self.gpu_fprop_params, self.fprop_params, fprop=1, config=(8,WARP_Y,WARP_X,b))
results.append(self.execute(kernel, devO, cpuO, op))
TILE_W = ceil_div(TILE_W1, 4)*4;
TILE_PQ = TILE_P * TILE_Q;
TILE_HW = TILE_H * TILE_W;
TILE_RW = R * TILE_W;
#wys = (4,2,1) if R <= 10 else (2,1)
for WARP_Y in (2,1):
for WARP_X in range(1,9):
THREADS = WARP_X * WARP_Y * 32;
TILE_X = ceil_div(TILE_RW, WARP_X*4)*4
TILE_Y = 4 // WARP_Y
TILE_RW4 = TILE_X * WARP_X
STRD_RW = TILE_RW4 | 4
STRD_HW = (TILE_HW + TILE_RW4 - TILE_RW) | 4
SIZE_F = STRD_RW*4 + 8;
SIZE_I = STRD_HW * TILE_N;
SIZE_O = WARP_X*TILE_PQ*TILE_N
F_LOOPS = ceil_div(STRD_RW, THREADS)
I_LOOPS = ceil_div(STRD_HW, THREADS)
SHARE = max((SIZE_F + SIZE_I)*2, SIZE_O*4)
BLOCKS = min(49152*2 // SHARE, 1024 // THREADS)
if 64 <= THREADS <= 1024 and SHARE <= 49152:
for b in range(1, BLOCKS+1):
op = f"k:4 t:{THREADS:4d} wy:{WARP_Y:d} wx:{WARP_X:d} b:{b:2d} ma:{TILE_X:4d} fl:{F_LOOPS:2d} il:{I_LOOPS:2d} sh:{SHARE:5d}"
#print(op)
kernel, devO, cpuO = xprop_kernel(self.gpu_fprop_params, self.fprop_params, fprop=1, config=(4, WARP_Y, WARP_X, b))
results.append(self.execute(kernel, devO, cpuO, op))
print(R, S)
for g, s in sorted(results):
print(s)
print("", flush=True)