MCPcopy Index your code
hub / github.com/apache/tvm / detectGPUDevice

Function detectGPUDevice

web/src/webgpu.ts:36–154  ·  view source on GitHub ↗
(powerPreference: "low-power" | "high-performance" = "high-performance")

Source from the content-addressed store, hash-verified

34 * DetectGPU device in the environment.
35 */
36export async function detectGPUDevice(powerPreference: "low-power" | "high-performance" = "high-performance"): Promise<GPUDeviceDetectOutput | undefined> {
37 if (typeof navigator !== "undefined" && navigator.gpu !== undefined) {
38 const adapter = await navigator.gpu.requestAdapter({ powerPreference });
39 if (adapter == null) {
40 throw Error(
41 "Unable to find a compatible GPU. This issue might be because your computer doesn't have a GPU, or your system settings are not configured properly. " +
42 "Please check if your device has a GPU properly set up and if your your browser supports WebGPU. " +
43 "You can also consult your browser's compatibility chart to see if it supports WebGPU. " +
44 "For more information about WebGPU support in your browser, visit https://webgpureport.org/"
45 );
46 }
47 const computeMB = (value: number) => {
48 return Math.ceil(value / (1 << 20)) + "MB";
49 }
50
51 // more detailed error message
52 let requiredMaxBufferSize = 1 << 30; // 1GB
53 if (requiredMaxBufferSize > adapter.limits.maxBufferSize) {
54 // If 1GB is too large, try 256MB (default size stated in WebGPU doc)
55 const backupRequiredMaxBufferSize = 1 << 28; // 256MB
56 console.log(
57 `Requested maxBufferSize exceeds limit. \n` +
58 `requested=${computeMB(requiredMaxBufferSize)}, \n` +
59 `limit=${computeMB(adapter.limits.maxBufferSize)}. \n` +
60 `WARNING: Falling back to ${computeMB(backupRequiredMaxBufferSize)}...`
61 );
62 requiredMaxBufferSize = backupRequiredMaxBufferSize;
63 if (backupRequiredMaxBufferSize > adapter.limits.maxBufferSize) {
64 // Fail if 256MB is still too big
65 throw Error(
66 `Cannot initialize runtime because of requested maxBufferSize ` +
67 `exceeds limit. requested=${computeMB(backupRequiredMaxBufferSize)}, ` +
68 `limit=${computeMB(adapter.limits.maxBufferSize)}. ` +
69 `Consider upgrading your browser.`
70 );
71 }
72 }
73
74 let requiredMaxStorageBufferBindingSize = 1 << 30; // 1GB
75 if (requiredMaxStorageBufferBindingSize > adapter.limits.maxStorageBufferBindingSize) {
76 // If 1GB is too large, try 128MB (default size stated in WebGPU doc)
77 const backupRequiredMaxStorageBufferBindingSize = 1 << 27; // 128MB
78 console.log(
79 `Requested maxStorageBufferBindingSize exceeds limit. \n` +
80 `requested=${computeMB(requiredMaxStorageBufferBindingSize)}, \n` +
81 `limit=${computeMB(adapter.limits.maxStorageBufferBindingSize)}. \n` +
82 `WARNING: Falling back to ${computeMB(backupRequiredMaxStorageBufferBindingSize)}...`
83 );
84 requiredMaxStorageBufferBindingSize = backupRequiredMaxStorageBufferBindingSize;
85 if (backupRequiredMaxStorageBufferBindingSize > adapter.limits.maxStorageBufferBindingSize) {
86 // Fail if 128MB is still too big
87 throw Error(
88 `Cannot initialize runtime because of requested maxStorageBufferBindingSize ` +
89 `exceeds limit. requested=${computeMB(backupRequiredMaxStorageBufferBindingSize)}, ` +
90 `limit=${computeMB(adapter.limits.maxStorageBufferBindingSize)}. `
91 );
92 }
93 }

Callers 1

asyncInitServerMethod · 0.90

Calls 3

computeMBFunction · 0.85
hasMethod · 0.80
logMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…