চিত্র ফিল্টারিংয়ের জন্য কখন একটি কম্পিউট শেডার পিক্সেল শেডারের চেয়ে বেশি দক্ষ হয়?


37

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

এটি করার আরেকটি উপায় হ'ল কম্পিউট শেডারগুলি। এগুলির একটি শেডার অনুরোধগুলির একটি গ্রুপ জুড়ে অল্প পরিমাণ মেমরি ভাগ করতে সক্ষম হওয়ার সম্ভাব্য সুবিধা রয়েছে। উদাহরণস্বরূপ, আপনি প্রতিটি অনুরোধে একটি করে টেক্সেল আনতে এবং এটি ভাগ করে নেওয়া মেমরিতে সংরক্ষণ করতে পারেন, তারপরে সেখান থেকে ফলাফল গণনা করুন। এটি সম্ভবত বা দ্রুত নাও হতে পারে।

প্রশ্নটি কোন পরিস্থিতিতে (যদি কখনও থাকে) পিক্সেল-শেডার পদ্ধতির তুলনায় কমপিট-শেডার পদ্ধতিটি আসলে দ্রুত হয়? এটি কার্নেলের আকারের উপর নির্ভর করে, এটি কোন ধরণের ফিল্টারিং অপারেশন ইত্যাদি? স্পষ্টতই উত্তরটি জিপিইউর এক মডেলের থেকে অন্যটিতে পরিবর্তিত হতে পারে তবে কোনও সাধারণ প্রবণতা থাকলে আমি শুনতে আগ্রহী।


আমি মনে করি যদি কম্পিউট শেডারটি সঠিকভাবে করা হয় তবে উত্তরটি "সর্বদা" । এটি অর্জন করা তুচ্ছ নয়। ইমেজ প্রসেসিং অ্যালগরিদমগুলির জন্য পিক্সেল শেডারের তুলনায় একটি কমপ্লেট শেডার একটি ভাল মিল। একটি পিক্সেল শেডার তবে কম পারফরম্যান্স সরবরাহ করে যা খারাপভাবে সম্পাদনকারী ফিল্টার লিখতে পারে।
বার্নি

@ বার্নি আপনি কি পরিষ্কার করতে পারেন যে কম্পিউট শেডারকে "সঠিকভাবে" করার জন্য কী প্রয়োজন? উত্তর লিখতে পারে? বিষয়ে আরও দৃষ্টিভঙ্গি পেতে সর্বদা ভাল। :)
নাথান রেড

2
এখন দেখো তুমি আমাকে কী করতে! :)
বার্নি

থ্রেড জুড়ে কাজ ভাগ করে নেওয়ার পাশাপাশি, অ্যাসিঙ্ক কম্পিউট ব্যবহার করার ক্ষমতা কমপ্যাটের শেডারগুলি ব্যবহার করার একটি বড় কারণ।
JarkkoL

উত্তর:


23

চিত্র প্রক্রিয়াকরণের জন্য গণনা শেডারগুলির একটি স্থাপত্য সুবিধা হ'ল তারা আরওপি পদক্ষেপটি এড়িয়ে চলে । এটি খুব সম্ভবত যে পিক্সেল শেডারগুলি থেকে লেখাগুলি আপনি নিয়মিত মিশ্রণকারী হার্ডওয়্যার ব্যবহার না করেও ব্যবহার করেন। সাধারনত গণনা শেডারগুলি মেমোরির বিভিন্ন (এবং প্রায়শই আরও সরাসরি) পথ দিয়ে যায়, তাই আপনি অন্যথায় থাকতে পারে এমন কোনও বাধা এড়াতে পারেন। আমি এর জন্য দায়ী মোটামুটি আকারের পারফরম্যান্সের জয়ের কথা শুনেছি।

কম্পিউট শেডারগুলির একটি আর্কিটেকচারাল অসুবিধা হ'ল জিপিইউ আর কোন কাজ আইটেমগুলি কোন পিক্সেলে অবসর নেয় তা জানে না। আপনি যদি পিক্সেল শেডিং পাইপলাইন ব্যবহার করছেন, জিপিইউতে ওয়ার্প / ওয়েভফ্রন্টে কাজটি প্যাক করার সুযোগ রয়েছে যা রেন্ডার টার্গেটের একটি অংশে লিখে রাখে যা স্মৃতিতে সংলগ্ন (যা জেড-অর্ডার টাইলযুক্ত হতে পারে বা পারফরম্যান্সের জন্য এমন কিছু হতে পারে) কারণ)। আপনি যদি একটি গণনা পাইপলাইন ব্যবহার করছেন, GPU আর অনুকূল ব্যাচে কাজ শুরু করতে পারে না, ফলে আরও বেশি ব্যান্ডউইথ ব্যবহার করতে পারে।

আপনি সেই পরিবর্তিত ওয়ার্প / ওয়েভফ্রন্ট প্যাকিংটিকে আবারও একটি সুবিধাতে পরিণত করতে সক্ষম হতে পারেন, যদিও, আপনি যদি জানেন যে আপনার নির্দিষ্ট ক্রিয়াকলাপে এমন একটি কাঠামো রয়েছে যা আপনি একই থ্রেড গ্রুপে সম্পর্কিত কাজগুলি প্যাক করে শোষণ করতে পারেন। যেমনটি আপনি বলেছেন, আপনি তাত্ত্বিকভাবে স্যাম্পলিং হার্ডওয়্যারকে বিরতি দিতে পারেন প্রতি লেনের জন্য একটি মূল্য স্যাম্পলিং করে এবং ফলাফলকে অন্য লেনগুলির জন্য নমুনা ছাড়াই অ্যাক্সেসের জন্য ভাগ করা মেমরির ফলস্বরূপ putting এটি যে জয় তা নির্ভর করে আপনার গোষ্ঠীভুক্ত মেমরিটি কতটা ব্যয়বহুল উপর নির্ভর করে: যদি এটি সর্বনিম্ন স্তরের টেক্সচার ক্যাশে থেকে সস্তা হয় তবে এটি একটি জয় হতে পারে, তবে এর কোনও গ্যারান্টি নেই। জিপিইউগুলি ইতিমধ্যে অত্যন্ত স্থানীয় টেক্সচার ফ্যাচগুলি (প্রয়োজনীয়ভাবে) এর সাথে বেশ ভালভাবে ডিল করে।

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


আমি গুরুতরভাবে সন্দেহ করি যে মিশ্রণ অক্ষম থাকলে আরওপি কোনও কার্যকারিতা ওভারহেড যুক্ত করে।
গ্রোভারম্যানহাইম

@ গ্রোভারম্যানহাইম আর্কিটেকচারের উপর নির্ভরশীল! মিশ্রণ অক্ষম থাকলেও আউটপুট মার্জার / আরওপি পদক্ষেপটি অর্ডার গ্যারান্টি সহও মোকাবেলা করতে হবে। একটি পূর্ণ-স্ক্রিন ত্রিভুজ সহ কোনও প্রকৃত অর্ডারিং বিপত্তি নেই, তবে হার্ডওয়্যার এটি জানেন না। হার্ডওয়্যারে বিশেষ গতিপথ থাকতে পারে তবে আপনি তাদের জন্য যোগ্যতা অর্জন করেছেন তা নিশ্চিতভাবে জেনে
গেছেন

10

জন ইতিমধ্যে একটি দুর্দান্ত উত্তর লিখেছেন তাই এই উত্তরটিকে তার একটি বর্ধন বিবেচনা করুন।

আমি বর্তমানে বিভিন্ন অ্যালগরিদমের জন্য গণনা শেডারগুলির সাথে প্রচুর কাজ করছি। সাধারণভাবে, আমি খুঁজে পেয়েছি যে কম্পিউট শেডারগুলি তাদের সমতুল্য পিক্সেল শেডারের তুলনায় অনেক দ্রুত হতে পারে বা প্রতিক্রিয়া ভিত্তিক বিকল্পগুলি রূপান্তর করতে পারে।

একবার আপনি কীভাবে কম্পিউট শেডারগুলি কাজ করে আপনার মাথাটি গুটিয়ে রাখেন, সেগুলি অনেক ক্ষেত্রে আরও অনেক কিছু বোঝায়। কোনও চিত্র ফিল্টার করতে পিক্সেল শেডারগুলি ব্যবহার করার জন্য ফ্রেমবফার সেটআপ করা, একাধিক শ্যাডার পর্যায় ব্যবহার করা প্রয়োজন, ইত্যাদি কেন ইমেজ ফিল্টার করতে হবে? ইমেজ প্রসেসিংয়ের জন্য পূর্ণ-স্ক্রিনের কোয়াড রেন্ডারিংয়ের জন্য অভ্যস্ত হওয়া অবশ্যই আমার মতে সেগুলি চালিয়ে যাওয়ার একমাত্র "বৈধ" কারণ। আমি নিশ্চিত যে গণনা গ্রাফিক্স ক্ষেত্রের একজন আগত ব্যক্তি টেক্সচারে রেন্ডারিংয়ের চেয়ে চিত্র প্রসেসিংয়ের জন্য কমপ্যাটে শেডারের চেয়ে অনেক বেশি প্রাকৃতিক ফিট খুঁজে পাবেন।

আপনার প্রশ্নটি চিত্রের ফিল্টারিংকে বিশেষত বোঝায় তাই আমি অন্যান্য বিষয়ে খুব বেশি বিস্তৃত করব না। আমাদের কয়েকটি পরীক্ষায়, কেবল কোনও টেক্সচারে রেন্ডার করতে ট্রান্সফর্ম ফিডব্যাক সেটআপ করা বা ফ্রেমবফার অবজেক্টগুলি স্যুইচ করাতে পারফরম্যান্সের ব্যয় 0.2 মিমি হতে পারে। মনে রাখবেন যে এটি কোনও রেন্ডারিং বাদ দেয় না! একটি ক্ষেত্রে, আমরা একই অ্যালগরিদমকে শেডগুলি গণনা করতে রেখেছিলাম এবং একটি পারফরম্যান্সে পারফরম্যান্স বৃদ্ধি পেয়েছি।

কম্পিউট শেডারগুলি ব্যবহার করার সময়, জিপিইউতে থাকা সিলিকনের অনেকগুলি আসল কাজটি করতে ব্যবহার করা যেতে পারে। পিক্সেল শেডার রুটটি ব্যবহার করার সময় এই সমস্ত অতিরিক্ত পদক্ষেপের প্রয়োজন:

  • ভার্টেক্স অ্যাসেমবিলি (ভার্টেক্স অ্যাট্রিবিউটস, ভারটেক্স বিভাজকগুলি পড়ুন, রূপান্তর টাইপ করুন, সেগুলি ভেক 4 এ প্রসারিত করা ইত্যাদি)
  • ভার্টেক্স শ্যাডারটি যত ন্যূনতম হোক তা নির্ধারণ করা দরকার
  • রাস্টারাইজারকে ভার্টেক্সের আউটপুটগুলি ছায়াযুক্ত এবং ইন্টারপোলেট করার জন্য পিক্সেলের একটি তালিকা গণনা করতে হবে (সম্ভবত চিত্রের প্রসেসিংয়ের জন্য কেবল টেক্সচারের কর্ড)
  • সমস্ত বিভিন্ন রাজ্য (গভীরতা পরীক্ষা, আলফা পরীক্ষা, কাঁচি, মিশ্রণ) সেট এবং পরিচালনা করতে হবে

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

ড্রাইভারটি যা করতে পারে না তা হ'ল কমপিউটার শেডার পাইপলাইন দ্বারা প্রদত্ত আরও ভাল সমান্তরালতার সুযোগগুলি খুঁজে পাওয়া। গাউসিয়ান ফিল্টারটির ক্লাসিক উদাহরণ নিন। কম্পিউট শেডারগুলি ব্যবহার করে আপনি এর মতো কিছু করতে পারেন (ফিল্টার পৃথক করে না):

  1. প্রতিটি কাজের গোষ্ঠীর জন্য, উত্সের চিত্রের নমুনাটি কর্ম গ্রুপের আকার জুড়ে ভাগ করুন এবং ফলাফলগুলি ভাগ করে নেওয়া মেমরিতে সংরক্ষণ করুন।
  2. ভাগ করা মেমরিতে সঞ্চিত নমুনা ফলাফলগুলি ব্যবহার করে ফিল্টার আউটপুট গণনা করুন।
  3. আউটপুট জমিন লিখুন

পদক্ষেপ 1 এখানে মূল কী। পিক্সেল শেডার সংস্করণে, উত্স চিত্রটি পিক্সেলটিতে একাধিকবার নমুনা দেওয়া হয়। গণনা শেডার সংস্করণে, প্রতিটি উত্স টেক্সেল কেবলমাত্র একটি কাজের গ্রুপের মধ্যেই একবার পড়ে। টেক্সচার পাঠগুলি সাধারণত একটি টাইল-ভিত্তিক ক্যাশে ব্যবহার করে তবে এই ক্যাশেটি ভাগ করা মেমরির থেকে এখনও অনেক ধীর।

গাউসিয়ান ফিল্টার একটি সহজ উদাহরণ। অন্যান্য ফিল্টারিং অ্যালগরিদমগুলি ভাগ করা মেমরি ব্যবহার করে কাজের গ্রুপগুলির মধ্যে মধ্যবর্তী ফলাফলগুলি ভাগ করে নেওয়ার জন্য অন্যান্য সুযোগগুলি সরবরাহ করে।

তবে একটি ধরা আছে। গণনা শেডারের তাদের আউটপুট সিঙ্ক্রোনাইজ করার জন্য স্পষ্ট মেমরি বাধা প্রয়োজন। ত্রুটিযুক্ত মেমরি অ্যাক্সেস থেকে রক্ষা করার জন্য আরও কম সুরক্ষা রয়েছে। ভাল সমান্তরাল প্রোগ্রামিং জ্ঞান সহ প্রোগ্রামারদের জন্য, গণনা শেডারগুলি আরও অনেক নমনীয়তা সরবরাহ করে। এই নমনীয়তাটির অর্থ হ'ল সাধারণ সি ++ কোডের মতো গণনা শেডারের সাথে চিকিত্সা করা এবং ধীর বা ভুল কোড লিখতে আরও সহজ।

তথ্যসূত্র


আপনার বর্ণিত উন্নত নমুনা সমান্তরালতাটি আকর্ষণীয় - তবে আমি কিছুটা ঝুলিয়েছি - প্রতিবেশী পিক্সেলগুলি যখন অন্য কোনও কার্য গ্রুপে পড়ে তখন আমি কীভাবে অ্যাক্সেস করব? উদাহরণস্বরূপ, যদি আমার কাছে x৪x sim৪ সিমুলেশন ডোমেন থাকে তবে ন্যাথথ্রেডের প্রেরণ (২,২,১) (১,,১,,১) ছড়িয়ে আছে, id.xy == [15,15] এর পিক্সেলটি কীভাবে তার পার্শ্ববর্তী পিক্সেল পেতে পারে ?
টসরক

সেক্ষেত্রে আমি 2 টি প্রধান পছন্দ দেখতে পাচ্ছি। 1) 64 টির উপরে গ্রুপের আকার বাড়ান এবং কেবল 64x64 পিক্সেলের জন্য ফলাফল লিখুন। 2) প্রথম নমুনা +৪ + nX64 + n আপনার 64x64 কার্য গ্রুপে কোনওভাবে বিভক্ত হয়েছে এবং তারপরে গণনার জন্য সেই বৃহত "ইনপুট" গ্রিডটি ব্যবহার করুন। সর্বোত্তম সমাধানটি আপনার নির্দিষ্ট শর্তগুলির উপর নির্ভর করে এবং আমি আপনাকে আরও তথ্যের জন্য আরও একটি প্রশ্ন লেখার পরামর্শ দিচ্ছি কারণ মন্তব্যগুলি এর জন্য কমই উপযুক্ত।
বার্নি

3

আমি এই ব্লগে হোঁচট খেয়েছি : এএমডির জন্য কম্পিউট শেডার অপ্টিমাইজেশন

কম্পিউট শেডারে কী কৌশলগুলি করা যেতে পারে তা প্রদত্ত (এটি কেবলমাত্র গণনা শেডারের ক্ষেত্রে সুনির্দিষ্ট) আমি কৌতূহলী ছিলাম যদি পিক্সেল শেডারের তুলনায় কম্পিউট শেডারে সমান্তরাল হ্রাস দ্রুত হয়। আমি লেখক ওল্ফ এঙ্গেলকে পিক্সেল শেডার চেষ্টা করেছিলাম কিনা তা জানতে ই-মেইল করেছিলাম। তিনি উত্তর দিয়েছিলেন যে হ্যাঁ এবং ফিরে যখন তিনি ব্লগ পোস্টটি লিখেছিলেন তখন পিক্সেল শেডার সংস্করণের তুলনায় কমপিট শেডার সংস্করণ যথেষ্ট দ্রুত ছিল। তিনি আরও যোগ করেছেন যে, আজ পার্থক্য আরও বড়। সুতরাং আপাতদৃষ্টিতে এমন কেস রয়েছে যেখানে কম্পিউট শেডার ব্যবহার করা খুব বেশি সুবিধাজনক হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.