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` +

Reply via email to