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% 개선되었습니다.

<ph type="x-smartling-placeholder">
</ph> f32 및 f16 Llama 2 7B 모델을 사용한 WebLLM 채팅 데모 스크린샷
f32 (왼쪽) 및 f16 (오른쪽) Llama 2 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 셰이더 모듈 코드에서 f16f32 유형을 모두 지원할 수 있습니다.

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개까지 요청할 수 있습니다. issue dawn:2159를 참고하세요.

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

깊이 스텐실 상태 변경사항

개발자 환경을 개선하기 위해 깊이 스텐실 상태 depthWriteEnableddepthCompare 속성이 더 이상 항상 필요한 것은 아닙니다. depthWriteEnabled는 깊이가 있는 형식에만 필요하고 depthCompare는 심도가 있는 형식에만 필요하지만, 아예 사용하지 않는 경우에는 필요하지 않습니다. issue dawn:2132를 참고하세요.

어댑터 정보 업데이트

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

<ph type="x-smartling-placeholder">
</ph> 백엔드 및 어댑터 정보 유형을 보여주는 https://webgpureport.org의 스크린샷입니다.
https://webgpureport.org에 표시된 어댑터 정보 백엔드 및 유형

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

타임스탬프 쿼리 양자화

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

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

Chrome 126

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