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에 있으면 이제 dot4U8Packeddot4I8Packed 기본 제공 함수를 사용하여 WGSL 셰이더 코드의 내적 명령어에 대한 입력으로 8비트 정수의 4 구성요소 벡터를 패킹하는 32비트 정수 스칼라를 사용할 수 있습니다. 또한 pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8, unpack4xU8 WGSL 내장 함수와 함께 8비트 정수로 구성된 패킹된 4개 구성요소 벡터와 함께 패킹 및 압축 해제 명령을 사용할 수 있습니다.

WGSL 셰이더 코드 상단에 있는 requires packed_4x8_integer_dot_product;required-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를 사용하여 특성을 감지할 수 있습니다. WGSL 셰이더 코드 상단에 있는 requires unrestricted_pointer_parameters;로 항상 required-directive를 사용하여 비이동성 가능성을 알리는 것이 좋습니다. 다음 예, WGSL 사양 변경사항issue 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 언어 확장 프로그램이 있으면 이제 WGSL 셰이더 코드에서 데이터로 직접 작업하는지 아니면 데이터로 직접 작업하든 동일한 점 (.) 문법을 사용하여 복잡한 데이터 유형의 구성요소에 액세스할 수 있습니다. 방법은 다음과 같습니다.

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

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

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

WGSL 셰이더 코드 상단에 있는 requires pointer_composite_access;required-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.
  }`
});

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

이전에는 렌더 패스의 읽기 전용 깊이 스텐실 첨부 시 두 측면 (깊이 및 스텐실)이 모두 읽기 전용이어야 했습니다. 이 제한은 해제되었습니다. 이제 접촉 그림자 추적에 읽기 전용 방식으로 깊이 측면을 사용할 수 있으며, 추가 처리를 위해 픽셀을 식별하기 위해 스텐실 버퍼가 작성됩니다. issue dawn:2146을 참고하세요.

Dawn 업데이트

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

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

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

WebGPU의 새로운 기능

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

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