WebGPU의 새로운 기능 (Chrome 123)

François Beaufort
François Beaufort

WGSL의 DP4a 기본 제공 함수 지원

DP4a (4개 요소의 내적 및 누적)는 정규화에 관한 딥 러닝 추론에 일반적으로 사용되는 GPU 명령어 집합을 나타냅니다. 8비트 정수 내적을 효율적으로 실행하여 이러한 int8 양자화 모델의 계산을 가속화합니다. 이를 통해 메모리와 네트워크 대역폭을 최대 75% 절약하고 f32 버전과 비교하여 추론에서 머신러닝 모델의 성능을 개선할 수 있습니다. 그 결과 현재 많은 인기 AI 프레임워크에서 널리 사용되고 있습니다.

"packed_4x8_integer_dot_product" WGSL 언어 확장 프로그램navigator.gpu.wgslLanguageFeatures에 있는 경우 이제 8비트 정수의 4개 구성요소 벡터를 패킹하는 32비트 정수 스칼라를 dot4U8Packeddot4I8Packed 내장 함수를 사용하여 WGSL 셰이더 코드의 내적 명령어에 대한 입력으로 사용할 수 있습니다. pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8, unpack4xU8 WGSL 내장 함수를 사용하여 8비트 정수의 4개 구성요소 벡터로 압축된 팩킹 및 unpacking 명령을 사용할 수도 있습니다.

WGSL 셰이더 코드 상단에서 requires packed_4x8_integer_dot_product;의 비이식 가능성을 알리려면 requires-directive를 사용하는 것이 좋습니다. 다음 예시와 issue tint:1497을 참고하세요.

if (!navigator.gpu.wgslLanguageFeatures.has("packed_4x8_integer_dot_product")) {
  throw new Error(`DP4a built-in functions are not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires packed_4x8_integer_dot_product;

  fn main() {
    const result: u32 = dot4U8Packed(0x01020304u, 0x02040405u); // 42
  }`,
});

이 사양과 구현을 완료하기 위해 노력해 주신 상하이의 Intel 웹 그래픽팀에 특별히 감사드립니다.

WGSL의 제한되지 않은 포인터 매개변수

"unrestricted_pointer_parameters" WGSL 언어 확장은 WGSL 함수에 전달할 수 있는 포인터에 대한 제한을 완화합니다.

  • storage, uniform, workgroup의 매개변수 포인터는 사용자 선언 함수의 주소 공간입니다.

  • 구조체 멤버 및 배열 요소 포인터를 사용자 선언 함수에 전달합니다.

자세한 내용은 함수 매개변수로서 포인터 | WGSL 둘러보기를 참고하세요.

이 기능은 navigator.gpu.wgslLanguageFeatures를 사용하여 기능 감지할 수 있습니다. 항상 requires-directive를 사용하여 WGSL 셰이더 코드 상단에 requires unrestricted_pointer_parameters;의 비이식성 가능성을 알리는 것이 좋습니다. 다음 예, WGSL 사양 변경사항, 문제 tint:2053을 참고하세요.

if (!navigator.gpu.wgslLanguageFeatures.has("unrestricted_pointer_parameters")) {
  throw new Error(`Unrestricted pointer parameters are not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires unrestricted_pointer_parameters;

  @group(0) @binding(0) var<storage, read_write> S : i32;

  fn func(pointer : ptr<storage, i32, read_write>) {
    *pointer = 42;
  }

  @compute @workgroup_size(1)
  fn main() {
    func(&S);
  }`
});

WGSL에서 컴포지트 역참조를 위한 문법 슈가

"pointer_composite_access" WGSL 언어 확장 프로그램navigator.gpu.wgslLanguageFeatures에 있으면 이제 WGSL 셰이더 코드가 데이터를 직접 사용하는지 또는 데이터 포인터를 사용하는지에 관계없이 동일한 점 (.) 문법을 사용하여 복잡한 데이터 유형의 구성요소에 대한 액세스를 지원합니다. 방법은 다음과 같습니다.

  • foo가 포인터인 경우: foo.bar(*foo).bar를 작성하는 더 편리한 방법입니다. 별표 (*)는 일반적으로 포인터를 역참조할 수 있는 '참조'로 변환하는 데 필요하지만 이제 포인터와 참조가 훨씬 더 유사해져 거의 상호 교환할 수 있습니다.

  • foo가 포인터가 아닌 경우: 점 (.) 연산자는 멤버에 직접 액세스할 때와 똑같이 작동합니다.

마찬가지로 pa가 배열의 시작 주소를 저장하는 포인터인 경우 pa[i]를 사용하면 배열의 'i번째 요소가 저장된 메모리 위치에 직접 액세스할 수 있습니다.

WGSL 셰이더 코드 상단에서 requires pointer_composite_access;의 비이식 가능성을 알리려면 requires-directive를 사용하는 것이 좋습니다. 다음 예와 issue tint:2113을 참고하세요.

if (!navigator.gpu.wgslLanguageFeatures.has("pointer_composite_access")) {
  throw new Error(`Pointer composite access is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires pointer_composite_access;

  fn main() {
    var a = vec3f();
    let p : ptr<function, vec3f> = &a;
    let r1 = (*p).x; // always valid.
    let r2 = p.x; // requires pointer composite access.
  }`
});

스텐실 및 깊이 측면에 관한 별도의 읽기 전용 상태

이전에는 렌더링 패스의 읽기 전용 깊이 스텐실 어테치먼트는 두 측면 (깊이 및 스텐실)이 모두 읽기 전용 이어야 했습니다. 이 제한은 해제되었습니다. 이제 스텐실 버퍼가 추가 처리를 위한 픽셀을 식별하도록 작성되는 동안 깊이 측정값을 읽기 전용 방식으로 사용할 수 있습니다(예: 접촉 그림자 추적). 문제 dawn:2146을 참고하세요.

Dawn 업데이트

이제 wgpuDeviceSetUncapturedErrorCallback()로 설정된 포착되지 않은 오류 콜백이 오류가 발생하면 즉시 호출됩니다. 이는 개발자가 디버깅을 위해 일관되게 기대하고 원하는 바입니다. change dawn:173620을 참고하세요.

webgpu.h APIwgpuSurfaceGetPreferredFormat() 메서드가 구현되었습니다. issue dawn:1362를 참고하세요.

여기에는 주요 내용 중 일부만 다룹니다. 전체 커밋 목록을 확인하세요.

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