WebGPU-তে নতুন কী আছে (Chrome 123)

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

WGSL-এ DP4a-এর অন্তর্নির্মিত ফাংশনগুলির সমর্থন

DP4a (ডট প্রোডাক্ট অফ ৪ এলিমেন্টস অ্যান্ড অ্যাকুমুলেট) হলো এক সেট জিপিইউ (GPU) নির্দেশাবলী যা সাধারণত ডিপ লার্নিং ইনফারেন্সে কোয়ান্টাইজেশনের জন্য ব্যবহৃত হয়। এটি এই ধরনের int8-কোয়ান্টাইজড মডেলগুলোর গণনাকে ত্বরান্বিত করার জন্য দক্ষতার সাথে ৮-বিট পূর্ণসংখ্যার ডট প্রোডাক্ট সম্পাদন করে। এটি f32 সংস্করণের তুলনায় মেমরি এবং নেটওয়ার্ক ব্যান্ডউইথ (৭৫% পর্যন্ত) সাশ্রয় করতে পারে এবং ইনফারেন্সিংয়ের ক্ষেত্রে যেকোনো মেশিন লার্নিং মডেলের পারফরম্যান্স উন্নত করতে পারে। ফলস্বরূপ, এটি এখন অনেক জনপ্রিয় এআই (AI) ফ্রেমওয়ার্কের মধ্যে ব্যাপকভাবে ব্যবহৃত হয়।

যখন navigator.gpu.wgslLanguageFeatures"packed_4x8_integer_dot_product" WGSL ল্যাঙ্গুয়েজ এক্সটেনশনটি উপস্থিত থাকে, তখন আপনি এখন dot4U8Packed এবং dot4I8Packed বিল্ট-ইন ফাংশনগুলির সাহায্যে আপনার WGSL শেডার কোডের ডট প্রোডাক্ট নির্দেশাবলীর ইনপুট হিসাবে 8-বিট পূর্ণসংখ্যার 4-উপাদান ভেক্টর প্যাক করা 32-বিট পূর্ণসংখ্যা স্কেলার ব্যবহার করতে পারবেন। এছাড়াও আপনি pack4xI8 , pack4xU8 , pack4xI8Clamp , pack4xU8Clamp , unpack4xI8 , এবং unpack4xU8 WGSL বিল্ট-ইন ফাংশনগুলির সাহায্যে 8-বিট পূর্ণসংখ্যার প্যাক করা 4-উপাদান ভেক্টর সহ প্যাকিং এবং আনপ্যাকিং নির্দেশাবলী ব্যবহার করতে পারেন।

আপনার WGSL শেডার কোডের শুরুতে requires packed_4x8_integer_dot_product; করে নন-পোর্টেবিলিটির সম্ভাবনা বোঝানোর জন্য একটি `requires` ডিরেক্টিভ ব্যবহার করার পরামর্শ দেওয়া হয়। নিম্নলিখিত উদাহরণ এবং `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
  }`,
});

এই স্পেসিফিকেশন এবং এর বাস্তবায়নকে সফলভাবে সম্পন্ন করার জন্য সাংহাইতে অবস্থিত ইন্টেলের ওয়েব গ্রাফিক্স টিমকে বিশেষ ধন্যবাদ!

WGSL-এ অবাধ পয়েন্টার প্যারামিটার

"unrestricted_pointer_parameters" WGSL ল্যাঙ্গুয়েজ এক্সটেনশনটি WGSL ফাংশনে কোন পয়েন্টার পাস করা যাবে তার উপর থেকে বিধিনিষেধ শিথিল করে:

  • ব্যবহারকারী কর্তৃক ঘোষিত ফাংশনগুলোর জন্য storage , uniform এবং workgroup অ্যাড্রেস স্পেসের প্যারামিটার পয়েন্টারসমূহ।

  • ব্যবহারকারী কর্তৃক ঘোষিত ফাংশনে স্ট্রাকচার মেম্বার এবং অ্যারে এলিমেন্টের পয়েন্টার পাস করা।

এ সম্পর্কে আরও জানতে “Pointers As Function Parameters | Tour of WGSL” দেখুন।

এই ফিচারটি navigator.gpu.wgslLanguageFeatures ব্যবহার করে শনাক্ত করা যায়। আপনার WGSL শেডার কোডের শুরুতে requires unrestricted_pointer_parameters; ব্যবহার করে নন-পোর্টেবিলিটির সম্ভাবনা বোঝানোর জন্য সর্বদা একটি requires-directive ব্যবহার করার পরামর্শ দেওয়া হয়। নিম্নলিখিত উদাহরণ, 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 ল্যাঙ্গুয়েজ এক্সটেনশনটি উপস্থিত থাকে, তখন আপনার WGSL শেডার কোড জটিল ডেটা টাইপের কম্পোনেন্টগুলো অ্যাক্সেস করার জন্য একই ডট ( . ) সিনট্যাক্স ব্যবহার করতে পারে, আপনি সরাসরি ডেটা নিয়ে কাজ করুন বা সেটির কোনো পয়েন্টার ব্যবহার করুন। এটি যেভাবে কাজ করে তা নিচে দেওয়া হলো:

  • যদি foo একটি পয়েন্টার হয়, তাহলে (*foo).bar লেখার চেয়ে foo.bar লেখাটা বেশি সুবিধাজনক। সাধারণত, পয়েন্টারটিকে ডি-রেফারেন্সযোগ্য একটি 'রেফারেন্স'-এ পরিণত করার জন্য অ্যাস্টারিস্ক ( * ) চিহ্নটির প্রয়োজন হতো, কিন্তু এখন পয়েন্টার এবং রেফারেন্স উভয়ই অনেক বেশি সাদৃশ্যপূর্ণ এবং প্রায় বিনিময়যোগ্য।

  • যদি foo একটি পয়েন্টার না হয়: তাহলে ডট ( . ) অপারেটরটি সরাসরি মেম্বার অ্যাক্সেস করার মতোই কাজ করে।

একইভাবে, যদি pa একটি পয়েন্টার হয় যা একটি অ্যারের শুরুর ঠিকানা সংরক্ষণ করে, তাহলে pa[i] ব্যবহার করে আপনি সরাসরি সেই মেমরি অবস্থানে অ্যাক্সেস করতে পারবেন যেখানে সেই অ্যারের 'i ' তম উপাদানটি সংরক্ষিত আছে।

আপনার WGSL শেডার কোডের শুরুতে requires pointer_composite_access; করে নন-পোর্টেবিলিটির সম্ভাবনা বোঝানোর জন্য একটি `requires-directive` ব্যবহার করার পরামর্শ দেওয়া হয়। নিম্নলিখিত উদাহরণ এবং `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 দেখুন।

ভোরের আপডেট

wgpuDeviceSetUncapturedErrorCallback() দিয়ে সেট করা আনক্যাপচারড এরর কলব্যাকটি এখন এরর ঘটার সাথে সাথেই কল করা হয়। ডিবাগিংয়ের জন্য ডেভেলপাররা সবসময় এটাই আশা করেন এবং চান। dawn:173620 পরিবর্তনটি দেখুন।

webgpu.h API- এর wgpuSurfaceGetPreferredFormat() মেথডটি বাস্তবায়ন করা হয়েছে। dawn:1362 ইস্যুটি দেখুন।

এখানে কেবল কয়েকটি মূল বিষয় তুলে ধরা হয়েছে। কমিটগুলোর বিস্তারিত তালিকাটি দেখুন।

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

'What's New in WebGPU' সিরিজে যা যা আলোচনা করা হয়েছে, তার একটি তালিকা।

ক্রোম ১৪৭-১৪৮

ক্রোম ১৪৬

ক্রোম ১৪৫

ক্রোম ১৪৪

ক্রোম ১৪৩

ক্রোম ১৪২

ক্রোম ১৪১

ক্রোম ১৪০

ক্রোম ১৩৯

ক্রোম ১৩৮

ক্রোম ১৩৭

ক্রোম ১৩৬

ক্রোম ১৩৫

ক্রোম ১৩৪

ক্রোম ১৩৩

ক্রোম ১৩২

ক্রোম ১৩১

ক্রোম ১৩০

ক্রোম ১২৯

ক্রোম ১২৮

ক্রোম ১২৭

ক্রোম ১২৬

ক্রোম ১২৫

ক্রোম ১২৪

ক্রোম ১২৩

ক্রোম ১২২

ক্রোম ১২১

ক্রোম ১২০

ক্রোম ১১৯

ক্রোম ১১৮

ক্রোম ১১৭

ক্রোম ১১৬

ক্রোম ১১৫

ক্রোম ১১৪

ক্রোম ১১৩