From bb54c5fe11ea9568a43c71e271f34e7e48cfd469 Mon Sep 17 00:00:00 2001 From: Yulong Wang <7679871+fs-eire@users.noreply.github.com> Date: Mon, 21 Jul 2025 19:35:16 -0700 Subject: [PATCH 1/2] [webgpu] fix runtime error caused by buffer release too early --- onnxruntime/core/providers/webgpu/buffer_manager.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/onnxruntime/core/providers/webgpu/buffer_manager.cc b/onnxruntime/core/providers/webgpu/buffer_manager.cc index 113a3f31be7f9..df146b971137d 100644 --- a/onnxruntime/core/providers/webgpu/buffer_manager.cc +++ b/onnxruntime/core/providers/webgpu/buffer_manager.cc @@ -199,12 +199,20 @@ class BucketCacheManager : public IBufferCacheManager { if (it != buckets_.end() && it->second.size() < buckets_limit_[buffer_size]) { it->second.emplace_back(buffer); } else { - wgpuBufferRelease(buffer); + pending_buffers.emplace_back(buffer, buffer_size); } } void OnRefresh(GraphCaptureState /*graph_capture_state*/) override { - // no-op + for (auto& [buffer, buffer_size] : pending_buffers) { + auto it = buckets_.find(buffer_size); + if (it != buckets_.end() && it->second.size() < buckets_limit_[buffer_size]) { + it->second.emplace_back(buffer); + } else { + wgpuBufferRelease(buffer); + } + } + pending_buffers.clear(); } ~BucketCacheManager() { @@ -236,6 +244,7 @@ class BucketCacheManager : public IBufferCacheManager { } std::unordered_map buckets_limit_; std::unordered_map> buckets_; + std::vector> pending_buffers; std::vector buckets_keys_; }; From 3d9570daa37410302e83e0f15c1df6b865bf7650 Mon Sep 17 00:00:00 2001 From: Yulong Wang <7679871+fs-eire@users.noreply.github.com> Date: Mon, 21 Jul 2025 19:43:14 -0700 Subject: [PATCH 2/2] resolve comments --- onnxruntime/core/providers/webgpu/buffer_manager.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/onnxruntime/core/providers/webgpu/buffer_manager.cc b/onnxruntime/core/providers/webgpu/buffer_manager.cc index df146b971137d..ae00581a89b11 100644 --- a/onnxruntime/core/providers/webgpu/buffer_manager.cc +++ b/onnxruntime/core/providers/webgpu/buffer_manager.cc @@ -199,12 +199,12 @@ class BucketCacheManager : public IBufferCacheManager { if (it != buckets_.end() && it->second.size() < buckets_limit_[buffer_size]) { it->second.emplace_back(buffer); } else { - pending_buffers.emplace_back(buffer, buffer_size); + pending_buffers_.emplace_back(buffer, buffer_size); } } void OnRefresh(GraphCaptureState /*graph_capture_state*/) override { - for (auto& [buffer, buffer_size] : pending_buffers) { + for (auto& [buffer, buffer_size] : pending_buffers_) { auto it = buckets_.find(buffer_size); if (it != buckets_.end() && it->second.size() < buckets_limit_[buffer_size]) { it->second.emplace_back(buffer); @@ -212,7 +212,7 @@ class BucketCacheManager : public IBufferCacheManager { wgpuBufferRelease(buffer); } } - pending_buffers.clear(); + pending_buffers_.clear(); } ~BucketCacheManager() { @@ -244,7 +244,7 @@ class BucketCacheManager : public IBufferCacheManager { } std::unordered_map buckets_limit_; std::unordered_map> buckets_; - std::vector> pending_buffers; + std::vector> pending_buffers_; std::vector buckets_keys_; };