WebGPU-তে নতুন কি আছে (Chrome 120)

ফ্রাঁসোয়া বিউফোর্ট
François Beaufort

WGSL-এ 16-বিট ফ্লোটিং-পয়েন্ট মানগুলির জন্য সমর্থন

WGSL-এ, f16 প্রকার হল IEEE-754 বাইনারি16 (অর্ধ নির্ভুলতা) বিন্যাসের 16-বিট ফ্লোটিং-পয়েন্ট মানগুলির সেট। এর মানে হল যে এটি একটি ফ্লোটিং-পয়েন্ট সংখ্যা উপস্থাপন করতে 16 বিট ব্যবহার করে, যা প্রচলিত একক-নির্ভুল ফ্লোটিং-পয়েন্ট ( f32 ) এর জন্য 32 বিটের বিপরীতে। এই ছোট আকারটি উল্লেখযোগ্য কর্মক্ষমতা উন্নতির দিকে নিয়ে যেতে পারে, বিশেষ করে যখন প্রচুর পরিমাণে ডেটা প্রক্রিয়া করা হয়।

তুলনা করার জন্য, একটি Apple M1 Pro ডিভাইসে, WebLLM চ্যাট ডেমোতে ব্যবহৃত Llama2 7B মডেলগুলির f16 বাস্তবায়ন f32 বাস্তবায়নের তুলনায় উল্লেখযোগ্যভাবে দ্রুত, প্রিফিল গতিতে 28% উন্নতি এবং ডিকোডিং গতিতে 41% উন্নতি সহ যেমন দেখানো হয়েছে নিম্নলিখিত স্ক্রিনশট।

f32 এবং f16 Llama2 7B মডেল সহ WebLLM চ্যাট ডেমোগুলির স্ক্রিনশট৷
f32 (বামে) এবং f16 (ডানে) Llama2 7B মডেলের সাথে WebLLM চ্যাট ডেমো।

সমস্ত GPU 16-বিট ফ্লোটিং-পয়েন্ট মান সমর্থন করে না। যখন একটি GPUAdapter"shader-f16" বৈশিষ্ট্যটি উপলব্ধ থাকে, আপনি এখন এই বৈশিষ্ট্যটি সহ একটি GPUDevice অনুরোধ করতে পারেন এবং একটি WGSL shader মডিউল তৈরি করতে পারেন যা অর্ধ-নির্ভুল ফ্লোটিং-পয়েন্ট প্রকার f16 এর সুবিধা নেয়। এই ধরনের WGSL শেডার মডিউলে ব্যবহার করার জন্য বৈধ শুধুমাত্র যদি আপনি f16 সক্ষম করে f16 WGSL এক্সটেনশন enable f16; . অন্যথায়, createShaderModule() একটি বৈধতা ত্রুটি তৈরি করবে। নিচের ন্যূনতম উদাহরণটি দেখুন এবং ভোরের সংখ্যাটি দেখুন: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 শেডার মডিউল কোডে f16 এবং f32 উভয় প্রকারকে সমর্থন করা সম্ভব।

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);
  }
`;

সীমা ধাক্কা

রেন্ডার পাইপলাইন আউটপুট ডেটার একটি নমুনা (পিক্সেল বা সাবপিক্সেল) ধরে রাখতে প্রয়োজনীয় সর্বাধিক সংখ্যক বাইট, সমস্ত রঙের সংযুক্তি জুড়ে, ডিফল্টরূপে 32 বাইট। maxColorAttachmentBytesPerSample সীমা ব্যবহার করে 64 পর্যন্ত অনুরোধ করা সম্ভব। নিম্নলিখিত উদাহরণ দেখুন এবং ইস্যুর ডন: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 },
});

আন্তঃ-পর্যায় যোগাযোগের জন্য ব্যবহৃত maxInterStageShaderVariables এবং maxInterStageShaderComponents সীমা সমস্ত প্ল্যাটফর্মে বৃদ্ধি করা হয়েছে। বিস্তারিত জানার জন্য ভোরের সংখ্যা: 1448 দেখুন।

প্রতিটি শেডার পর্যায়ের জন্য, একটি পাইপলাইন লেআউট জুড়ে বাইন্ড গ্রুপ লেআউট এন্ট্রির সর্বাধিক সংখ্যা যা স্টোরেজ বাফারগুলি ডিফল্টরূপে 8। maxStorageBuffersPerShaderStage সীমা ব্যবহার করে এখন 10 পর্যন্ত অনুরোধ করা সম্ভব। দেখুন ভোরের সংখ্যা: 2159

একটি নতুন maxBindGroupsPlusVertexBuffers সীমা যোগ করা হয়েছে। এটি সর্বোচ্চ সংখ্যক বাইন্ড গ্রুপ এবং ভার্টেক্স বাফার স্লটগুলি নিয়ে একযোগে ব্যবহৃত হয়, সর্বোচ্চ সূচকের নীচে যে কোনও খালি স্লট গণনা করে। এর ডিফল্ট মান হল 24। দেখুন ইস্যুর ডন:1849

গভীরতা-স্টেনসিল অবস্থায় পরিবর্তন

বিকাশকারীর অভিজ্ঞতা উন্নত করতে, ডেপথ-স্টেনসিল স্টেট depthWriteEnabled এবং depthCompare অ্যাট্রিবিউট সব সময় আর প্রয়োজন হয় না: depthWriteEnabled শুধুমাত্র গভীরতা সহ ফরম্যাটের জন্য প্রয়োজন, এবং একেবারে ব্যবহার না করা হলে depthCompare প্রয়োজন হয় না। দেখুন ভোরের সংখ্যা: 2132

অ্যাডাপ্টারের তথ্য আপডেট

যখন ব্যবহারকারী chrome://flags/#enable-webgpu-developer-features এ "WebGPU বিকাশকারী বৈশিষ্ট্য" পতাকা সক্ষম করে তখন নন-স্ট্যান্ডার্ড type এবং backend অ্যাডাপ্টারের তথ্য বৈশিষ্ট্যগুলি এখন requestAdapterInfo() কল করার সময় উপলব্ধ। type হতে পারে "বিচ্ছিন্ন GPU", "একীভূত GPU", "CPU", বা "অজানা"। backend হয় "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES", অথবা "null"। দেখুন প্রভাত সংখ্যা: 2112 এবং সংখ্যা ভোর: 2107

https://webgpureport.org-এর স্ক্রিনশট ব্যাকএন্ড সমন্বিত এবং অ্যাডাপ্টারের তথ্য টাইপ করুন।
অ্যাডাপ্টারের তথ্য ব্যাকএন্ড এবং টাইপ https://webgpureport.org এ দেখানো হয়েছে।

requestAdapterInfo() এ ঐচ্ছিক unmaskHints তালিকা প্যারামিটারটি সরানো হয়েছে। দেখুন ভোরের সংখ্যা: 1427

টাইমস্ট্যাম্প ক্যোয়ান্টাইজেশন

টাইমস্ট্যাম্প প্রশ্নগুলি অ্যাপ্লিকেশনগুলিকে ন্যানোসেকেন্ড নির্ভুলতার সাথে GPU কমান্ডের কার্যকর করার সময় পরিমাপ করার অনুমতি দেয়৷ যাইহোক, WebGPU স্পেসিফিকেশন টাইমস্ট্যাম্প প্রশ্নগুলিকে টাইমিং অ্যাটাকের উদ্বেগের কারণে ঐচ্ছিক করে তোলে। ক্রোম টিম বিশ্বাস করে যে টাইমস্ট্যাম্প ক্যোয়ান্টাইজিং 100 মাইক্রোসেকেন্ডে রেজোলিউশন কমিয়ে নির্ভুলতা এবং নিরাপত্তার মধ্যে একটি ভাল সমঝোতা প্রদান করে৷ দেখুন ভোরের সংখ্যা: 1800

ক্রোমে, ব্যবহারকারীরা chrome://flags/#enable-webgpu-developer-features এ "WebGPU বিকাশকারী বৈশিষ্ট্য" পতাকা সক্ষম করে টাইমস্ট্যাম্প কোয়ান্টাইজেশন অক্ষম করতে পারেন। মনে রাখবেন যে এই পতাকা একা "timestamp-query" বৈশিষ্ট্য সক্রিয় করে না। এটির বাস্তবায়ন এখনও পরীক্ষামূলক এবং তাই chrome://flags/#enable-unsafe-webgpu এ "অনিরাপদ WebGPU সমর্থন" পতাকা প্রয়োজন।

ডন-এ, "টাইমস্ট্যাম্প_কোয়ান্টাইজেশন" নামে একটি নতুন ডিভাইস টগল যোগ করা হয়েছে এবং ডিফল্টরূপে সক্রিয় করা হয়েছে। নিম্নলিখিত স্নিপেট আপনাকে দেখায় কিভাবে একটি ডিভাইসের অনুরোধ করার সময় টাইমস্ট্যাম্প পরিমাপ ছাড়াই পরীক্ষামূলক "টাইমস্ট্যাম্প-কোয়েরি" বৈশিষ্ট্যটিকে অনুমতি দিতে হয়৷

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-ভিত্তিক ব্রাউজারগুলিতে উপলব্ধ। . দেখুন ভোরের সংখ্যা: 1193

পরীক্ষামূলক "পাইপলাইন-পরিসংখ্যান-ক্যোয়ারী" বৈশিষ্ট্য, যা শুধুমাত্র আংশিকভাবে প্রয়োগ করা হয়েছিল, সরিয়ে দেওয়া হয়েছে কারণ এটি আর বিকাশ করা হচ্ছে না। ক্রোমিয়াম সংখ্যা দেখুন:1177506

এটি শুধুমাত্র কিছু মূল হাইলাইট কভার করে। কমিটের সম্পূর্ণ তালিকা দেখুন।

WebGPU-তে নতুন কি আছে

ওয়েবজিপিইউ সিরিজে নতুন কী কভার করা হয়েছে তার একটি তালিকা।

ক্রোম 131

ক্রোম 130

ক্রোম 129

ক্রোম 128

ক্রোম 127

ক্রোম 126

ক্রোম 125

ক্রোম 124

ক্রোম 123

ক্রোম 122

ক্রোম 121

ক্রোম 120

ক্রোম 119

ক্রোম 118

ক্রোম 117

ক্রোম 116

ক্রোম 115

ক্রোম 114

ক্রোম 113