Skip to content

Commit ca35b08

Browse files
qjia7annxingyuan
authored andcommitted
webgpu: Don't release the uniform buffer under delayed mode (#1968)
BUG In delayed mode, the command list hasn't been executed actually. So, the uniform buffer can't be recycled. This patch also fixes the issue that PostNet works incorrectly under delayed mode.
1 parent 164ceaa commit ca35b08

File tree

2 files changed

+14
-11
lines changed

2 files changed

+14
-11
lines changed

tfjs-backend-webgpu/src/backend_webgpu.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -459,12 +459,15 @@ export class WebGPUBackend extends KernelBackend {
459459
});
460460
this.commandQueueOwnedIds.add(output.dataId);
461461

462+
const uniformInfo = {
463+
byteSize: uniformData.byteLength,
464+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM,
465+
buffer: uniforms.resource.buffer};
466+
this.disposalQueue.push(uniformInfo);
467+
462468
if (ENV.get('WEBGPU_IMMEDIATE_EXECUTION_ENABLED')) {
463469
this.submitQueue();
464470
}
465-
this.releaseBuffer(
466-
uniforms.resource.buffer, uniformData.byteLength,
467-
GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM);
468471

469472
if (shouldTimeProgram) {
470473
query = this.endTimer(query);

tfjs-backend-webgpu/src/backend_webgpu_test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ describeWebGPU('backend webgpu', () => {
4343

4444
expect(endNumBytes - startNumBytes).toEqual(48);
4545
expect(endNumTensors - startNumTensors).toEqual(2);
46-
expect(endNumBytesInGPU - startNumBytesInGPU).toEqual(48);
46+
expect(endNumBytesInGPU - startNumBytesInGPU).toEqual(24);
4747

4848
tf.test_util.expectArraysClose(
4949
dData, new Float32Array([9, 12, 15, 19, 26, 33]));
@@ -120,7 +120,7 @@ describeWebGPU('backend webgpu', () => {
120120
tf.ENV.set('WEBGPU_IMMEDIATE_EXECUTION_ENABLED', savedFlag);
121121
});
122122

123-
it('should recycle buffers in delayed mode', () => {
123+
it('should not recycle buffers in delayed mode', () => {
124124
const savedFlag = tf.ENV.get('WEBGPU_IMMEDIATE_EXECUTION_ENABLED');
125125
tf.ENV.set('WEBGPU_IMMEDIATE_EXECUTION_ENABLED', false);
126126
const backend = tf.backend() as WebGPUBackend;
@@ -139,8 +139,8 @@ describeWebGPU('backend webgpu', () => {
139139
const freeBuffersAfterFirstMatMul = bufferManager.getNumFreeBuffers();
140140
const usedBuffersAfterFirstMatMul = bufferManager.getNumUsedBuffers();
141141
expect(freeBuffersAfterFirstMatMul - freeBuffersAfterFirstMul)
142-
.toEqual(1); // from released uniform
143-
expect(usedBuffersAfterFirstMatMul - usedBuffersAfterFirstMul).toEqual(2);
142+
.toEqual(0);
143+
expect(usedBuffersAfterFirstMatMul - usedBuffersAfterFirstMul).toEqual(3);
144144

145145
const a2 = tf.tensor2d([2, 4, 6, 8], [2, 2]);
146146
const b2 = tf.tensor2d([0.5, 0.5, 0.5, 0.5], [2, 2]);
@@ -149,15 +149,15 @@ describeWebGPU('backend webgpu', () => {
149149
const freeBuffersAfterSecondMul = bufferManager.getNumFreeBuffers();
150150
const usedBuffersAfterSecondMul = bufferManager.getNumUsedBuffers();
151151
expect(freeBuffersAfterSecondMul - freeBuffersAfterFirstMatMul)
152-
.toEqual(0); // released a uniform buffer and reused a buffer
153-
expect(usedBuffersAfterSecondMul - usedBuffersAfterFirstMatMul).toEqual(3);
152+
.toEqual(0);
153+
expect(usedBuffersAfterSecondMul - usedBuffersAfterFirstMatMul).toEqual(4);
154154

155155
const f2 = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3]);
156156
tf.matMul(c2, f2);
157157
const freeBuffersAfterSecondMatMul = bufferManager.getNumFreeBuffers();
158158
const usedBuffersAfterSecondMatMul = bufferManager.getNumUsedBuffers();
159159
expect(freeBuffersAfterSecondMatMul - freeBuffersAfterSecondMul).toEqual(0);
160-
expect(usedBuffersAfterSecondMatMul - usedBuffersAfterSecondMul).toEqual(2);
160+
expect(usedBuffersAfterSecondMatMul - usedBuffersAfterSecondMul).toEqual(3);
161161
tf.ENV.set('WEBGPU_IMMEDIATE_EXECUTION_ENABLED', savedFlag);
162162
});
163163

@@ -174,4 +174,4 @@ describeWebGPU('backend webgpu', () => {
174174
// Now that data has been downloaded to the CPU, dataSync should work.
175175
expect(() => c.dataSync()).not.toThrow();
176176
});
177-
});
177+
});

0 commit comments

Comments
 (0)