@@ -261,10 +261,11 @@ export class MathBackendCPU implements KernelBackend {
261
261
}
262
262
263
263
const buffer = ops . buffer ( size , x . dtype ) ;
264
+ const xBuf = x . bufferSync ( ) ;
264
265
for ( let i = 0 ; i < buffer . size ; ++ i ) {
265
266
const loc = buffer . indexToLoc ( i ) ;
266
267
const xLoc = loc . map ( ( idx , j ) => idx + begin [ j ] ) ;
267
- buffer . values [ i ] = x . get ( ...xLoc ) ;
268
+ buffer . values [ i ] = xBuf . get ( ...xLoc ) ;
268
269
}
269
270
return buffer . toTensor ( ) as T ;
270
271
}
@@ -286,15 +287,15 @@ export class MathBackendCPU implements KernelBackend {
286
287
}
287
288
288
289
const buffer = ops . buffer ( size , x . dtype ) ;
289
-
290
+ const xBuf = x . bufferSync ( ) ;
290
291
for ( let i = 0 ; i < buffer . size ; i ++ ) {
291
292
const loc = buffer . indexToLoc ( i ) ;
292
293
293
294
const newLoc : number [ ] = new Array ( loc . length ) ;
294
295
for ( let j = 0 ; j < newLoc . length ; j ++ ) {
295
296
newLoc [ j ] = loc [ j ] * strides [ j ] + beginIndex [ j ] ;
296
297
}
297
- buffer . set ( x . get ( ...newLoc ) , ...loc ) ;
298
+ buffer . set ( xBuf . get ( ...newLoc ) , ...loc ) ;
298
299
}
299
300
300
301
return buffer . toTensor ( ) . reshape ( shape ) as T ;
@@ -325,13 +326,13 @@ export class MathBackendCPU implements KernelBackend {
325
326
this . assertNotComplex ( x , 'reverse' ) ;
326
327
327
328
const buffer = ops . buffer ( x . shape , x . dtype ) ;
328
- const xBuffer = x . buffer ( ) ;
329
+ const xBuf = x . bufferSync ( ) ;
329
330
330
331
for ( let i = 0 ; i < buffer . size ; i ++ ) {
331
332
const outLoc = buffer . indexToLoc ( i ) ;
332
333
const inLoc = outLoc . slice ( ) ;
333
334
axis . forEach ( ax => inLoc [ ax ] = x . shape [ ax ] - 1 - inLoc [ ax ] ) ;
334
- buffer . set ( xBuffer . get ( ...inLoc ) , ...outLoc ) ;
335
+ buffer . set ( xBuf . get ( ...inLoc ) , ...outLoc ) ;
335
336
}
336
337
337
338
return buffer . toTensor ( ) as T ;
@@ -1719,7 +1720,8 @@ export class MathBackendCPU implements KernelBackend {
1719
1720
1720
1721
const leftPad = convInfo . padInfo . left ;
1721
1722
const topPad = convInfo . padInfo . top ;
1722
-
1723
+ const xBuf = x . bufferSync ( ) ;
1724
+ const dyBuf = dy . bufferSync ( ) ;
1723
1725
for ( let wR = 0 ; wR < filterHeight ; ++ wR ) {
1724
1726
const yRMin = Math . max ( 0 , Math . ceil ( ( topPad - wR ) / strideHeight ) ) ;
1725
1727
const yRMax = Math . min (
@@ -1739,7 +1741,7 @@ export class MathBackendCPU implements KernelBackend {
1739
1741
const xR = wR + yR * strideHeight - topPad ;
1740
1742
for ( let yC = yCMin ; yC < yCMax ; ++ yC ) {
1741
1743
const xC = wC + yC * strideWidth - leftPad ;
1742
- dotProd += x . get ( b , xR , xC , d1 ) * dy . get ( b , yR , yC , d2 ) ;
1744
+ dotProd += xBuf . get ( b , xR , xC , d1 ) * dyBuf . get ( b , yR , yC , d2 ) ;
1743
1745
}
1744
1746
}
1745
1747
}
@@ -1970,6 +1972,8 @@ export class MathBackendCPU implements KernelBackend {
1970
1972
const topPad = convInfo . padInfo . top ;
1971
1973
const chMul = convInfo . outChannels / convInfo . inChannels ;
1972
1974
1975
+ const xBuf = x . bufferSync ( ) ;
1976
+ const dyBuf = dy . bufferSync ( ) ;
1973
1977
for ( let wR = 0 ; wR < filterHeight ; ++ wR ) {
1974
1978
const yRMin = Math . max ( 0 , Math . ceil ( ( topPad - wR ) / strideHeight ) ) ;
1975
1979
const yRMax = Math . min (
@@ -1990,7 +1994,7 @@ export class MathBackendCPU implements KernelBackend {
1990
1994
const xR = wR + yR * strideHeight - topPad ;
1991
1995
for ( let yC = yCMin ; yC < yCMax ; ++ yC ) {
1992
1996
const xC = wC + yC * strideWidth - leftPad ;
1993
- dotProd += x . get ( b , xR , xC , d1 ) * dy . get ( b , yR , yC , d2 ) ;
1997
+ dotProd += xBuf . get ( b , xR , xC , d1 ) * dyBuf . get ( b , yR , yC , d2 ) ;
1994
1998
}
1995
1999
}
1996
2000
}
@@ -2009,7 +2013,7 @@ export class MathBackendCPU implements KernelBackend {
2009
2013
newShape [ i ] = x . shape [ i ] * reps [ i ] ;
2010
2014
}
2011
2015
const result = ops . buffer ( newShape , x . dtype ) ;
2012
- const xBuf = x . buffer ( ) ;
2016
+ const xBuf = x . bufferSync ( ) ;
2013
2017
for ( let i = 0 ; i < result . values . length ; ++ i ) {
2014
2018
const newLoc = result . indexToLoc ( i ) ;
2015
2019
@@ -2032,7 +2036,7 @@ export class MathBackendCPU implements KernelBackend {
2032
2036
const outShape = paddings . map (
2033
2037
( p , i ) => p [ 0 ] /* beforePad */ + x . shape [ i ] + p [ 1 ] /* afterPad */ ) ;
2034
2038
const start = paddings . map ( p => p [ 0 ] ) ;
2035
- const xBuffer = x . buffer ( ) ;
2039
+ const xBuffer = x . bufferSync ( ) ;
2036
2040
const buffer = ops . buffer ( outShape , x . dtype as 'float32' ) ;
2037
2041
if ( constantValue !== 0 ) {
2038
2042
buffer . values . fill ( constantValue ) ;
@@ -2041,7 +2045,7 @@ export class MathBackendCPU implements KernelBackend {
2041
2045
for ( let i = 0 ; i < x . size ; i ++ ) {
2042
2046
const coords = xBuffer . indexToLoc ( i ) ;
2043
2047
const outCoords = coords . map ( ( c , i ) => c + start [ i ] ) ;
2044
- buffer . set ( x . get ( ...coords ) , ...outCoords ) ;
2048
+ buffer . set ( xBuffer . get ( ...coords ) , ...outCoords ) ;
2045
2049
}
2046
2050
return buffer . toTensor ( ) as T ;
2047
2051
}
@@ -2056,7 +2060,7 @@ export class MathBackendCPU implements KernelBackend {
2056
2060
const values = x . dataSync ( ) ;
2057
2061
const result = buffer ( newShape , x . dtype ) ;
2058
2062
2059
- const xBuf = x . buffer ( ) ;
2063
+ const xBuf = x . bufferSync ( ) ;
2060
2064
for ( let i = 0 ; i < x . size ; ++ i ) {
2061
2065
const loc = xBuf . indexToLoc ( i ) ;
2062
2066
@@ -2079,7 +2083,7 @@ export class MathBackendCPU implements KernelBackend {
2079
2083
const indicesValues = indices . dataSync ( ) ;
2080
2084
newShape [ axis ] = indicesValues . length ;
2081
2085
const result = buffer ( newShape , x . dtype ) ;
2082
- const xBuf = x . buffer ( ) ;
2086
+ const xBuf = x . bufferSync ( ) ;
2083
2087
2084
2088
for ( let i = 0 ; i < result . size ; ++ i ) {
2085
2089
const newLoc = result . indexToLoc ( i ) ;
@@ -2226,6 +2230,7 @@ export class MathBackendCPU implements KernelBackend {
2226
2230
const padTop = convInfo . padInfo . top ;
2227
2231
const padLeft = convInfo . padInfo . left ;
2228
2232
2233
+ const xBuf = x . bufferSync ( ) ;
2229
2234
for ( let b = 0 ; b < convInfo . batchSize ; ++ b ) {
2230
2235
for ( let d = 0 ; d < convInfo . inChannels ; ++ d ) {
2231
2236
for ( let yR = 0 ; yR < convInfo . outHeight ; ++ yR ) {
@@ -2252,7 +2257,7 @@ export class MathBackendCPU implements KernelBackend {
2252
2257
const wR = xR - xRCorner ;
2253
2258
for ( let xC = xCMin ; xC < xCMax ; xC += dilationWidth ) {
2254
2259
const wC = xC - xCCorner ;
2255
- const pixel = x . get ( b , xR , xC , d ) ;
2260
+ const pixel = xBuf . get ( b , xR , xC , d ) ;
2256
2261
if ( pixel > maxValue ) {
2257
2262
maxValue = pixel ;
2258
2263
maxPosition = wR * effectiveFilterWidth + wC ;
@@ -2282,6 +2287,9 @@ export class MathBackendCPU implements KernelBackend {
2282
2287
const padTop = effectiveFilterHeight - 1 - convInfo . padInfo . top ;
2283
2288
const dx = ops . buffer < Rank . R4 > ( x . shape , 'float32' ) ;
2284
2289
2290
+ const maxPosBuf = maxPositions . bufferSync ( ) ;
2291
+ const dyBuf = dy . bufferSync ( ) ;
2292
+
2285
2293
for ( let b = 0 ; b < convInfo . batchSize ; ++ b ) {
2286
2294
for ( let d = 0 ; d < convInfo . inChannels ; ++ d ) {
2287
2295
for ( let dxR = 0 ; dxR < convInfo . inHeight ; ++ dxR ) {
@@ -2303,15 +2311,15 @@ export class MathBackendCPU implements KernelBackend {
2303
2311
continue ;
2304
2312
}
2305
2313
const maxPos = effectiveFilterHeight * effectiveFilterWidth -
2306
- 1 - maxPositions . get ( b , dyR , dyC , d ) ;
2314
+ 1 - maxPosBuf . get ( b , dyR , dyC , d ) ;
2307
2315
const curPos = wR * effectiveFilterWidth + wC ;
2308
2316
2309
2317
const mask = maxPos === curPos ? 1 : 0 ;
2310
2318
if ( mask === 0 ) {
2311
2319
continue ;
2312
2320
}
2313
2321
2314
- const pixel = dy . get ( b , dyR , dyC , d ) ;
2322
+ const pixel = dyBuf . get ( b , dyR , dyC , d ) ;
2315
2323
dotProd += pixel * mask ;
2316
2324
}
2317
2325
}
@@ -2340,6 +2348,8 @@ export class MathBackendCPU implements KernelBackend {
2340
2348
2341
2349
const avgMultiplier = 1 / ( filterHeight * filterWidth ) ;
2342
2350
2351
+ const dyBuf = dy . bufferSync ( ) ;
2352
+
2343
2353
for ( let b = 0 ; b < convInfo . batchSize ; ++ b ) {
2344
2354
for ( let d = 0 ; d < convInfo . inChannels ; ++ d ) {
2345
2355
for ( let dxR = 0 ; dxR < convInfo . inHeight ; ++ dxR ) {
@@ -2361,7 +2371,7 @@ export class MathBackendCPU implements KernelBackend {
2361
2371
continue ;
2362
2372
}
2363
2373
2364
- const pixel = dy . get ( b , dyR , dyC , d ) ;
2374
+ const pixel = dyBuf . get ( b , dyR , dyC , d ) ;
2365
2375
dotProd += pixel ;
2366
2376
}
2367
2377
}
@@ -2842,10 +2852,11 @@ export class MathBackendCPU implements KernelBackend {
2842
2852
2843
2853
const res = new Float32Array ( indices . size * depth ) ;
2844
2854
res . fill ( offValue ) ;
2855
+ const indicesVal = indices . dataSync ( ) ;
2845
2856
2846
2857
for ( let event = 0 ; event < indices . size ; ++ event ) {
2847
- if ( indices . get ( event ) >= 0 && indices . get ( event ) < depth ) {
2848
- res [ event * depth + indices . get ( event ) ] = onValue ;
2858
+ if ( indicesVal [ event ] >= 0 && indicesVal [ event ] < depth ) {
2859
+ res [ event * depth + indicesVal [ event ] ] = onValue ;
2849
2860
}
2850
2861
}
2851
2862
return ops . tensor2d ( res , [ indices . size , depth ] , 'int32' ) ;
@@ -3040,8 +3051,8 @@ export class MathBackendCPU implements KernelBackend {
3040
3051
resVals [ i ] = op ( aVals [ i % aVals . length ] , bVals [ i % bVals . length ] ) ;
3041
3052
}
3042
3053
} else {
3043
- const aBuf = a . buffer ( ) ;
3044
- const bBuf = b . buffer ( ) ;
3054
+ const aBuf = a . bufferSync ( ) ;
3055
+ const bBuf = b . bufferSync ( ) ;
3045
3056
for ( let i = 0 ; i < resVals . length ; ++ i ) {
3046
3057
const loc = result . indexToLoc ( i ) ;
3047
3058
@@ -3090,8 +3101,8 @@ export class MathBackendCPU implements KernelBackend {
3090
3101
imagVals [ i ] = result . imag ;
3091
3102
}
3092
3103
} else {
3093
- const aRealBuf = this . data . get ( a . dataId ) . complexTensors . real . buffer ( ) ;
3094
- const bRealBuf = this . data . get ( b . dataId ) . complexTensors . real . buffer ( ) ;
3104
+ const aRealBuf = this . data . get ( a . dataId ) . complexTensors . real . bufferSync ( ) ;
3105
+ const bRealBuf = this . data . get ( b . dataId ) . complexTensors . real . bufferSync ( ) ;
3095
3106
for ( let i = 0 ; i < realVals . length ; i ++ ) {
3096
3107
const loc = realResult . indexToLoc ( i ) ;
3097
3108
0 commit comments