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

required-directive를 사용하여 WGSL 셰이더 코드 상단에 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를 사용하여 기능을 감지할 수 있습니다. 항상 required-directive를 사용하여 WGSL 셰이더 코드 상단에 requires unrestricted_pointer_parameters;로 이식 불가능성을 알리는 것이 좋습니다. 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에서 복합 요소를 역참조하기 위한 구문 슈가

"pointer_composite_access" WGSL 언어 확장 프로그램navigator.gpu.wgslLanguageFeatures에 있으면 이제 WGSL 셰이더 코드는 데이터로 직접 작업하든 데이터 포인터로 작업하든 동일한 점 (.) 문법을 사용하여 복잡한 데이터 유형의 구성요소에 액세스할 수 있도록 지원합니다. 이는 다음과 같은 방식으로 이루어집니다.

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

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

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

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

여명 업데이트

이제 wgpuDeviceSetUncapturedErrorCallback()로 설정된 캡처되지 않은 오류 콜백이 오류가 발생하는 즉시 호출됩니다. 개발자가 꾸준히 기대하고 디버깅하는 것이 바로 이것입니다. change dawn:173620을 참조하세요.

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

여기에서는 주요 특징 중 일부만 다루었습니다. 전체 커밋 목록을 확인하세요.

WebGPU의 새로운 기능

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

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