This is an automated email from the ASF dual-hosted git repository.
ruihangl pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 32e9a48b1f [WebGPU] Fall back to 256MB for maxBufferSize if needed
(#17150)
32e9a48b1f is described below
commit 32e9a48b1fbc78a58447f392f2530c98553eb3dc
Author: Charlie Ruan <[email protected]>
AuthorDate: Wed Jul 10 21:48:31 2024 -0400
[WebGPU] Fall back to 256MB for maxBufferSize if needed (#17150)
By default, we request 1GB of `maxStorageBufferBindingSize`
and `maxBufferSize` when detecting a WebGPU device.
However, low-resource devices such as iOS and Android may
not be able to support 1GB.
A previous PR falls back `maxStorageBufferBindingSize` to 128MB,
the default values stated in WGSL doc, motivated by Android Chrome.
This PR falls back `maxBufferSize` to 256MB, the default value,
motivated by iOS Safari.
---
web/src/webgpu.ts | 27 +++++++++++++++++++--------
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/web/src/webgpu.ts b/web/src/webgpu.ts
index bd8d236974..284d6d3887 100644
--- a/web/src/webgpu.ts
+++ b/web/src/webgpu.ts
@@ -49,20 +49,31 @@ export async function detectGPUDevice():
Promise<GPUDeviceDetectOutput | undefin
}
// more detailed error message
- const requiredMaxBufferSize = 1 << 30;
+ let requiredMaxBufferSize = 1 << 30; // 1GB
if (requiredMaxBufferSize > adapter.limits.maxBufferSize) {
- throw Error(
- `Cannot initialize runtime because of requested maxBufferSize ` +
- `exceeds limit. requested=${computeMB(requiredMaxBufferSize)}, ` +
- `limit=${computeMB(adapter.limits.maxBufferSize)}. ` +
- `This error may be caused by an older version of the browser (e.g.
Chrome 112). ` +
- `You can try to upgrade your browser to Chrome 113 or later.`
+ // If 1GB is too large, try 256MB (default size stated in WebGPU doc)
+ const backupRequiredMaxBufferSize = 1 << 28; // 256MB
+ console.log(
+ `Requested maxBufferSize exceeds limit. \n` +
+ `requested=${computeMB(requiredMaxBufferSize)}, \n` +
+ `limit=${computeMB(adapter.limits.maxBufferSize)}. \n` +
+ `WARNING: Falling back to ${computeMB(backupRequiredMaxBufferSize)}...`
);
+ requiredMaxBufferSize = backupRequiredMaxBufferSize;
+ if (backupRequiredMaxBufferSize > adapter.limits.maxBufferSize) {
+ // Fail if 256MB is still too big
+ throw Error(
+ `Cannot initialize runtime because of requested maxBufferSize ` +
+ `exceeds limit. requested=${computeMB(backupRequiredMaxBufferSize)},
` +
+ `limit=${computeMB(adapter.limits.maxBufferSize)}. ` +
+ `Consider upgrading your browser.`
+ );
+ }
}
let requiredMaxStorageBufferBindingSize = 1 << 30; // 1GB
if (requiredMaxStorageBufferBindingSize >
adapter.limits.maxStorageBufferBindingSize) {
- // If 1GB is too large, try 128MB (default size for Android)
+ // If 1GB is too large, try 128MB (default size stated in WebGPU doc)
const backupRequiredMaxStorageBufferBindingSize = 1 << 27; // 128MB
console.log(
`Requested maxStorageBufferBindingSize exceeds limit. \n` +