WebGPU 개발자 기능

François Beaufort
François Beaufort

게시일: 2025년 6월 3일

Chrome의 WebGPU API 구현에는 개발 및 테스트 전용 기능이 포함되어 있습니다. 이러한 기능은 표준 WebGPU 사양에 해당하지 않으며 프로덕션에서 사용해서는 안 됩니다.

이 문서에서는 WebGPU 개발자 기능을 사용 설정하는 방법을 자세히 설명하고 포괄적인 목록을 제공합니다.

기본 요건

Chrome에서 WebGPU 개발자 기능을 사용 설정하려면 다음 단계를 따르세요.

  1. chrome://flags/#enable-webgpu-developer-features에서 'WebGPU 개발자 기능' 플래그를 사용 설정합니다.
  2. Chrome 브라우저를 다시 시작합니다.

타임스탬프 쿼리 정량화 사용 중지

타임스탬프 쿼리를 사용하면 WebGPU 애플리케이션이 컴퓨팅 및 렌더링 패스 중에 GPU 명령의 실행 시간을 나노초 단위로 정확하게 측정할 수 있습니다. 이러한 쿼리는 GPU 워크로드 성능 및 동작을 분석하는 데 필수적입니다. 자세한 내용은 컴퓨팅 및 렌더링 패스의 타임스탬프 쿼리를 참고하세요.

타이밍 공격 문제로 인해 타임스탬프 쿼리는 100마이크로초의 해상도로 정규화되므로 정확성과 보안 간에 적절한 절충점을 제공합니다. 이 정수는 'WebGPU 개발자 기능' 플래그가 사용 설정되면 자동으로 사용 중지됩니다.

확장된 어댑터 정보

사용 중인 어댑터를 더 자세히 이해할 수 있도록 GPUAdapterInfo는 다음 속성을 노출합니다.

  • device 속성 (표준화됨)은 공급업체별 어댑터 식별자입니다.
  • description 속성 (표준화됨)은 어댑터 세부정보를 제공하는 사람이 읽을 수 있는 문자열입니다.
  • driver 속성 (표준화되지 않음)은 사람이 읽을 수 있는 드라이버 설명 문자열입니다.
  • backend 속성 (표준화되지 않음)은 "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES", "null"과 같은 그래픽 백엔드를 나타냅니다.
  • type 속성(표준화되지 않음)은 GPU 유형("discrete GPU", "integrated GPU", "CPU" 또는 "unknown")을 식별합니다.
  • d3dShaderModel 속성 (표준화되지 않음)은 지원되는 최대 D3D 셰이더 모델 번호를 지정합니다. 예를 들어 62는 HLSL SM 6.2 지원을 나타냅니다.
  • vkDriverVersion 속성 (표준화되지 않음)은 공급업체가 지정한 Vulkan 드라이버 버전입니다.
  • powerPreference 속성 (표준화되지 않음)은 GPURequestAdapterOptions의 GPUPowerPreference에 따라 "low-power" 또는 "high-performance"입니다.

앱 개발 중에 대량을 할당할 때 메모리 제한을 예상하기 위해 GPUAdapterInfo는 어댑터에서 사용할 수 있는 메모리 힙의 크기 및 유형과 같은 표준화되지 않은 memoryHeaps 정보를 노출합니다.

const adapter = await navigator.gpu.requestAdapter();

for (const { size, properties } of adapter.info.memoryHeaps) {
  console.log(size); // memory heap size in bytes
  if (properties & GPUHeapProperty.DEVICE_LOCAL)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_VISIBLE)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_CACHED)   { /* ... */ }
}

셰이더 모듈 컴파일 옵션 엄격한 수학

GPUShaderModuleDescriptor에는 셰이더 모듈 컴파일 중에 엄격한 수학적 정밀도를 사용 설정하거나 사용 중지하는 비표준 불리언 옵션 strictMath가 포함되어 있습니다. 이 옵션은 Metal 및 Direct3D에서 지원됩니다. strictMath가 사용 설정되면 컴파일러는 정확한 수학적 규칙을 준수합니다. 반대로 사용 중지하면 컴파일러가 다음과 같이 셰이더를 최적화할 수 있습니다.

  • NaN 및 무한대 값의 가능성을 무시합니다.
  • -0을 +0으로 취급합니다.
  • 나눗셈을 배수의 역수를 사용한 더 빠른 곱셈으로 대체합니다.
  • 결합 및 배급 속성을 기반으로 연산을 재정렬합니다.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

제로 카피로 동영상 가져오기

GPUExternalTexture isZeroCopy 비표준 불리언 속성을 사용하면 importExternalTexture()로 가져온 동영상이 중간 사본 없이 GPU에서 직접 액세스되었는지 알 수 있습니다.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const video = document.querySelector('video');
const externalTexture = device.importExternalTexture({ source: video });

if (externalTexture.isZeroCopy) {
  console.log('Video frame was accessed directly by the GPU');
}