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 채팅 데모의 스크린샷
Llama2 7B 모델 f32 (왼쪽) 및 f16 (오른쪽)을 사용한 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);
  }
`;

한계를 뛰어넘어라

모든 색상 첨부파일에서 렌더링 파이프라인 출력 데이터의 샘플 1개 (픽셀 또는 하위 픽셀)를 보유하는 데 필요한 최대 바이트 수는 기본적으로 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 한도가 증가했습니다. 자세한 내용은 문제 dawn:1448을 참고하세요.

각 셰이더 단계의 경우 파이프라인 레이아웃에서 저장소 버퍼인 바인딩 그룹 레이아웃 항목의 최대 개수는 기본적으로 8개입니다. 이제 maxStorageBuffersPerShaderStage 한도를 사용하여 최대 10개를 요청할 수 있습니다. issue dawn:2159를 참고하세요.

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

깊이 스텐실 상태 변경

개발자 환경을 개선하기 위해 이제 깊이 스텐실 상태 depthWriteEnableddepthCompare 속성이 더 이상 항상 필요하지는 않습니다. depthWriteEnabled는 깊이가 있는 형식에만 필요하며 depthCompare는 전혀 사용되지 않는 경우 깊이가 있는 형식에 필요하지 않습니다. issue 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마이크로초로 줄여 정확성과 보안 간의 균형을 잘 맞출 수 있다고 생각합니다. issue 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 131

Chrome 130

Chrome 129

Chrome 128

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