WebGPU의 새로운 기능 (Chrome 123)

François Beaufort
François Beaufort

WGSL의 DP4a 내장 함수 지원

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

이제 navigator.gpu.wgslLanguageFeatures"packed_4x8_integer_dot_product" WGSL 언어 확장 프로그램이 있으면 dot4U8Packeddot4I8Packed 내장 함수를 사용하여 WGSL 셰이더 코드의 내적 명령어에 8비트 정수의 4컴포넌트 벡터를 패킹하는 32비트 정수 스칼라를 입력으로 사용할 수 있습니다. pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8, unpack4xU8 WGSL 내장 함수를 사용하여 패킹된 8비트 정수의 4컴포넌트 벡터로 패킹 및 언패킹 명령어를 사용할 수도 있습니다.

WGSL 셰이더 코드 상단에서 requires-directive를 사용하여 requires packed_4x8_integer_dot_product;와의 비호환성 가능성을 알리는 것이 좋습니다. 다음 예시와 문제 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에서 컴포지트의 참조를 해제하기 위한 구문 설탕

navigator.gpu.wgslLanguageFeatures"pointer_composite_access" WGSL 언어 확장 프로그램이 있으면 이제 데이터를 직접 사용하든 데이터 포인터를 사용하든 동일한 점 (.) 구문을 사용하여 복잡한 데이터 유형의 구성요소에 액세스할 수 있습니다. 방법은 다음과 같습니다.

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

  • foo가 포인터가 아닌 경우: 점 (.) 연산자는 멤버에 직접 액세스하는 데 익숙한 방식과 정확히 동일하게 작동합니다.

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

WGSL 셰이더 코드 상단에서 requires-directive를 사용하여 requires pointer_composite_access;와의 비호환성 가능성을 알리는 것이 좋습니다. 다음 예시와 문제 색조: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을 참고하세요.

새벽 업데이트

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

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

여기에서는 몇 가지 주요 사항만 다룹니다. 전체 커밋 목록을 확인하세요.

WebGPU의 새로운 기능

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

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

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