From c9bacc1473be78e4a5392148c11da43a96dd6dcc Mon Sep 17 00:00:00 2001 From: Luke Kenneth Casson Leighton Date: Mon, 5 Jul 2021 13:01:28 +0100 Subject: [PATCH] fix matrix multiply schedule by using A=3x4 and B=5x3, eliminate dimension bugs --- openpower/sv/remapmatrix.py | 61 +++++++++++++++++++++++++------------ openpower/sv/remapyield.py | 2 +- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/openpower/sv/remapmatrix.py b/openpower/sv/remapmatrix.py index dc8f5caa3..841886491 100644 --- a/openpower/sv/remapmatrix.py +++ b/openpower/sv/remapmatrix.py @@ -14,25 +14,41 @@ def iterate_triple(SVSHAPE0, SVSHAPE1, SVSHAPE2): def matrix_demo(): #### test matrices 1 # 3x2 matrix - X = [[1, 2, 3], + X1 = [[1, 2, 3], [3, 4, 5], ] # 2x3 matrix - Y = [[6, 7], + Y1 = [[6, 7], [8, 9], [10, 11], ] #### test matrices 2 # 3x3 matrix - X = [[12,7,3], + X2 = [[12,7,3], [4 ,5,6], - [7 ,8,9]] + [7 ,8,9], + ] # 3x4 matrix - Y = [[5,8,1,2], + Y2 = [[5,8,1,2], [6,7,3,0], [4,5,9,1]] + #### test matrices 3 + # 3x4 matrix + X3 = [[12,7,3], + [4 ,5,6], + [7 ,8,9], + [2 ,0,1]] + # 3x5 matrix + Y3 = [[5,8,1,2,3], + [6,7,3,0,9], + [4,5,9,1,2]] + + # pick one of the above (crude, non-automated, but it works, hey) + X = X3 + Y = Y3 + # get the dimensions of the 2 matrices xdim1 = len(X[0]) ydim1 = len(X) @@ -53,16 +69,19 @@ def matrix_demo(): for _ in range(ydim1): result.append([0]*xdim2) # iterate through rows of Y + count = 0 for k in range(len(Y)): # ydim2 # iterate through rows of X for i in range(len(X)): # ydim1 - # iterate through columns of Y - for j in range(len(Y[0])): # xdim2 - print ("order res %d X %d Y %d" % \ - ((i*xdim2)+j, # result linear array index + # iterate through columns of Y + for j in range(len(Y[0])): # xdim2 + print ("order %d res %d X %d Y %d" % \ + (count, + (i*xdim2)+j, # result linear array index (i*xdim1)+k, # X linear array index (k*xdim2)+j)) # Y linear array index - result[i][j] += X[i][k] * Y[k][j] + result[i][j] += X[i][k] * Y[k][j] + count += 1 print ("expected result") for r in result: print ("\t", r) @@ -93,26 +112,30 @@ def matrix_demo(): pass # result uses SVSHAPE0 SVSHAPE0 = SVSHAPE() - SVSHAPE0.lims = [ydim2, xdim2, 1] - SVSHAPE0.order = [0,2,1] # result iterates through i and j (modulo) + SVSHAPE0.lims = [xdim2, ydim1, ydim2] + SVSHAPE0.order = [0,1,2] # result iterates through i and j (modulo) SVSHAPE0.mode = 0b00 + SVSHAPE0.skip = 0b11 # select 1st 2 dimensions (skip 3rd) SVSHAPE0.offset = 0 # no offset SVSHAPE0.invxyz = [0,0,0] # no inversion # X uses SVSHAPE1 SVSHAPE1 = SVSHAPE() - SVSHAPE1.lims = [ydim2, xdim2, ydim1] - SVSHAPE1.order = [1,2,0] # X iterates through i and k - SVSHAPE1.mode = 0b10 + SVSHAPE1.lims = [xdim2, ydim1, ydim2] + SVSHAPE1.order = [0,2,1] # X iterates through i and k + SVSHAPE1.mode = 0b00 + SVSHAPE1.skip = 0b01 # skip middle dimension SVSHAPE1.offset = 0 # no offset SVSHAPE1.invxyz = [0,0,0] # no inversion # y-selector uses SHAPE2 SVSHAPE2 = SVSHAPE() - SVSHAPE2.lims = [ydim2, xdim2, ydim1] - SVSHAPE2.order = [1,2,0] # Y iterates through k and j - SVSHAPE2.mode = 0b01 + SVSHAPE2.lims = [xdim2, ydim1, ydim2] + SVSHAPE2.order = [0,2,1] # X iterates through i and k + SVSHAPE2.mode = 0b00 + SVSHAPE2.skip = 0b11 # select 1st 2 dimensions (skip 3rd) SVSHAPE2.offset = 0 # no offset SVSHAPE2.invxyz = [0,0,0] # no inversion + # perform the iteration over the *linear* arrays using the # schedules VL = ydim2 * xdim2 * ydim1 @@ -120,7 +143,7 @@ def matrix_demo(): for i, idxs in enumerate(iterate_triple(SVSHAPE0, SVSHAPE1, SVSHAPE2)): if i == VL: break - print ("idxs", idxs, len(result2), len(xf), len(yf)) + print ("idxs", i, idxs, len(result2), len(xf), len(yf)) r_idx, x_idx, y_idx = idxs result2[r_idx] += xf[x_idx] * yf[y_idx] diff --git a/openpower/sv/remapyield.py b/openpower/sv/remapyield.py index 7ff21c0b1..23604a662 100644 --- a/openpower/sv/remapyield.py +++ b/openpower/sv/remapyield.py @@ -55,7 +55,7 @@ def iterate_indices(SVSHAPE): # "order" to say which ones get stacked on for i in range(3): lim, idx, dbg = vals[i] - if permute & (1<