WebGPU의 새로운 기능 (Chrome 120)

François Beaufort
François Beaufort

WGSL에서 16비트 부동 소수점 값 지원

WGSL에서 f16 유형은 IEEE-754 binary16 (절반 정밀도) 형식의 16비트 부동 소수점 값 집합입니다. 즉, 기존의 단일 정밀도 부동 소수점 (f32)에는 32비트가 아닌 16비트를 사용하여 부동 소수점 수를 나타냅니다. 이렇게 크기가 작을수록 특히 많은 양의 데이터를 처리할 때 성능 개선이 크게 향상될 수 있습니다.

비교를 위해 Apple M1 Pro 기기에서 WebLLM 채팅 데모에 사용된 Llama2 7B 모델f16 구현은 f32 구현보다 훨씬 빠릅니다. 다음 스크린샷과 같이 미리 채우기 속도가 28% 개선되고 디코딩 속도가 41% 개선되었습니다.

f32 및 f16 Llama2 7B 모델을 사용한 WebLLM 채팅 데모 스크린샷
f32 (왼쪽)와 f16 (오른쪽) Llama2 7B 모델을 사용한 WebLLM 채팅 데모

일부 GPU는 16비트 부동 소수점 값을 지원하지 않습니다. GPUAdapter에서 "shader-f16" 기능을 사용할 수 있는 경우 이제 이 기능을 사용하여 GPUDevice를 요청하고 절반 정밀도 부동 소수점 유형 f16를 활용하는 WGSL 셰이더 모듈을 만들 수 있습니다. 이 유형은 enable f16;f16 WGSL 확장 프로그램을 사용 설정한 경우에만 WGSL 셰이더 모듈에서 사용할 수 있습니다. 그렇지 않으면 createShaderModule()이 유효성 검사 오류를 생성합니다. 다음의 최소 예시와 issue dawn:1510을 참고하세요.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("shader-f16")) {
  throw new Error("16-bit floating-point value support is not available");
}
// Explicitly request 16-bit floating-point value support.
const device = await adapter.requestDevice({
  requiredFeatures: ["shader-f16"],
});

const code = `
  enable f16;

  @compute @workgroup_size(1)
  fn main() {
    const c : vec3h = vec3<f16>(1.0h, 2.0h, 3.0h);
  }
`;

const shaderModule = device.createShaderModule({ code });
// Create a compute pipeline with this shader module
// and run the shader on the GPU...

다음 스니펫과 같이 "shader-f16" 기능 지원에 따라 alias를 사용하여 WGSL 셰이더 모듈 코드에서 f16 유형과 f32 유형을 모두 지원할 수 있습니다.

const adapter = await navigator.gpu.requestAdapter();
const hasShaderF16 = adapter.features.has("shader-f16");

const device = await adapter.requestDevice({
  requiredFeatures: hasShaderF16 ? ["shader-f16"] : [],
});

const header = hasShaderF16
  ? `enable f16;
     alias min16float = f16;`
  : `alias min16float = f32;`;

const code = `
  ${header}

  @compute @workgroup_size(1)
  fn main() {
    const c = vec3<min16float>(1.0, 2.0, 3.0);
  }
`;

한계를 시험하세요

모든 색상 첨부 파일에서 렌더링 파이프라인 출력 데이터의 샘플 (픽셀 또는 하위 픽셀) 한 개를 보관하는 데 필요한 최대 바이트 수는 기본적으로 32바이트입니다. 이제 maxColorAttachmentBytesPerSample 한도를 사용하여 최대 64까지 요청할 수 있습니다. 다음 예와 issue dawn:2036을 참고하세요.

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

if (adapter.limits.maxColorAttachmentBytesPerSample < 64) {
  // When the desired limit isn't supported, take action to either fall back to
  // a code path that does not require the higher limit or notify the user that
  // their device does not meet minimum requirements.
}

// Request highest limit of max color attachments bytes per sample.
const device = await adapter.requestDevice({
  requiredLimits: { maxColorAttachmentBytesPerSample: 64 },
});

단계 간 통신에 사용되는 maxInterStageShaderVariablesmaxInterStageShaderComponents 제한이 모든 플랫폼에서 늘어났습니다. 자세한 내용은 issue dawn:1448을 참고하세요.

각 셰이더 단계에서 파이프라인 레이아웃 전체에서 스토리지 버퍼인 바인드 그룹 레이아웃 항목의 최대 개수는 기본적으로 8개입니다. 이제 maxStorageBuffersPerShaderStage 한도를 사용하여 최대 10개까지 요청할 수 있습니다. 문제 dawn:2159를 참조하세요.

새로운 maxBindGroupsPlusVertexBuffers 한도가 추가되었습니다. 동시에 사용되는 최대 바인드 그룹과 꼭짓점 버퍼 슬롯 수로 구성되며, 가장 높은 인덱스 아래의 빈 슬롯을 계산합니다. 기본값은 24입니다. 문제 dawn:1849를 참조하세요.

깊이 스텐실 상태 변경사항

개발자 환경을 개선하기 위해 깊이 스텐실 상태 depthWriteEnableddepthCompare 속성이 더 이상 필요하지 않을 때도 있습니다. depthWriteEnabled는 깊이가 있는 형식에만 필요하며 깊이가 전혀 사용되지 않는 경우 깊이가 있는 형식에 depthCompare는 필요하지 않습니다. 문제 dawn:2132를 참조하세요.

어댑터 정보 업데이트

이제 사용자가 chrome://flags/#enable-webgpu-developer-features에서 'WebGPU 개발자 기능' 플래그를 사용 설정한 경우 requestAdapterInfo()를 호출할 때 비표준 typebackend 어댑터 정보 속성을 사용할 수 있습니다. type는 '개별 GPU', '통합 GPU', 'CPU' 또는 '알 수 없음'일 수 있습니다. backend는 'WebGPU', 'D3D11', 'D3D12', 'metal', 'vulkan', 'openGL', 'openGLES' 또는 'null'입니다. 문제 dawn:2112문제 dawn:2107을 참조하세요.

어댑터 정보를 입력하고 백엔드를 입력하는 https://webgpureport.org의 스크린샷
어댑터 정보 백엔드 및 유형은 https://webgpureport.org에 표시됩니다.

requestAdapterInfo()의 선택적 unmaskHints 목록 매개변수가 삭제되었습니다. 문제 dawn:1427을 참조하세요.

타임스탬프 쿼리 양자화

타임스탬프 쿼리를 사용하면 애플리케이션에서 GPU 명령어의 실행 시간을 나노초 정밀도로 측정할 수 있습니다. 하지만 WebGPU 사양은 타이밍 공격 문제로 인해 타임스탬프 쿼리를 선택사항으로 설정합니다. Chrome팀은 타임스탬프 쿼리를 양자화하는 것이 해상도를 100마이크로초로 줄여서 정밀도와 보안 사이에서 적절한 절충점을 제공한다고 믿습니다. 문제 dawn:1800을 참조하세요.

Chrome에서 사용자는 chrome://flags/#enable-webgpu-developer-features에서 'WebGPU 개발자 기능' 플래그를 사용 설정하여 타임스탬프 양자화를 사용 중지할 수 있습니다. 이 플래그만으로는 "timestamp-query" 기능이 사용 설정되지 않습니다. 구현은 아직 실험 단계이므로 chrome://flags/#enable-unsafe-webgpu에 '안전하지 않은 WebGPU 지원' 플래그가 필요합니다.

Dawn에서 'timestamp_quantization'이라는 새로운 기기 전환이 추가되었으며 기본적으로 사용 설정됩니다. 다음 스니펫은 기기를 요청할 때 타임스탬프 양자화 없이 실험용 'timestamp-query' 기능을 허용하는 방법을 보여줍니다.

wgpu::DawnTogglesDescriptor deviceTogglesDesc = {};

const char* allowUnsafeApisToggle = "allow_unsafe_apis";
deviceTogglesDesc.enabledToggles = &allowUnsafeApisToggle;
deviceTogglesDesc.enabledToggleCount = 1;

const char* timestampQuantizationToggle = "timestamp_quantization";
deviceTogglesDesc.disabledToggles = &timestampQuantizationToggle;
deviceTogglesDesc.disabledToggleCount = 1;

wgpu::DeviceDescriptor desc = {.nextInChain = &deviceTogglesDesc};

// Request a device with no timestamp quantization.
myAdapter.RequestDevice(&desc, myCallback, myUserData);

봄맞이 청소 기능

실험용 'timestamp-query-inside-passes' 기능의 이름을 'chromium-experimental-timestamp-query-inside-passes'로 바꾸어 이 기능이 실험용이며 현재 Chromium 기반 브라우저에서만 사용할 수 있음을 개발자에게 명확히 합니다. Issue dawn:1193을 참조하세요.

부분적으로만 구현된 실험용 'pipeline-statistics-query' 기능은 더 이상 개발되지 않아 삭제되었습니다. 문제 chromium:1177506을 참고하세요.

여기에서는 주요 특징 중 일부만 다루었습니다. 전체 커밋 목록을 확인하세요.

WebGPU의 새로운 기능

WebGPU의 새로운 기능 시리즈에서 다룬 모든 사항의 목록

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113