প্রশ্ন:
সফ্টওয়্যার শিল্পের sensকমত্যটি হল যে পরিষ্কার এবং সহজ কোডটি কোড বেস এবং এটির মালিকানাধীন সংস্থার দীর্ঘমেয়াদী বাস্তবের জন্য মৌলিক। এই বৈশিষ্ট্যগুলি রক্ষণাবেক্ষণের ব্যয়কে কম করে এবং কোড বেসটি চালিয়ে যাওয়ার সম্ভাবনা বাড়িয়ে তোলে।
তবে সিমডি কোডটি সাধারণ অ্যাপ্লিকেশন কোডের চেয়ে আলাদা এবং আমি জানতে চাই যে সিমড কোডে বিশেষভাবে প্রয়োগ করা পরিষ্কার এবং সাধারণ কোড সম্পর্কিত কোনও অনুরূপ আছে কিনা।
আমার প্রশ্নের পটভূমি।
আমি বিভিন্ন চিত্র প্রক্রিয়াকরণ এবং বিশ্লেষণ কাজের জন্য প্রচুর সিমডি (একক-নির্দেশনা, একাধিক ডেটা) কোড লিখি। সম্প্রতি আমাকে একটি আর্কিটেকচার (এসএসই 2) থেকে অন্য একটি এআরএম নিওনে এই ফাংশনগুলির একটি ছোট সংখ্যাও পোর্ট করতে হয়েছিল।
কোডটি সঙ্কুচিত মোড়কযুক্ত সফ্টওয়্যারের জন্য রচিত, অতএব এটি ম্যাটল্যাবের মতো সীমাহীন পুনরায় বিতরণ অধিকার ছাড়া মালিকানাধীন ভাষার উপর নির্ভর করতে পারে না।
সাধারণ কোড কাঠামোর একটি উদাহরণ:
- ব্যবহার OpenCV এর ম্যাট্রিক্স টাইপ (
Mat
) সব মেমরির জন্য, বাফার এবং জীবনকাল ব্যবস্থাপনা। - ইনপুট আর্গুমেন্টের আকার (মাত্রা) যাচাই করার পরে, পিক্সেলের প্রতিটি সারিটির সূচনার ঠিকানার পয়েন্টার নেওয়া হয়।
- প্রতিটি ইনপুট ম্যাট্রিক্স থেকে পিক্সেলের প্রতিটি সারিটির পিক্সেল গণনা এবং সূচনা ঠিকানাগুলি কয়েকটি নিম্ন-স্তরের সি ++ ফাংশনে স্থানান্তরিত হয়।
- এই নিম্ন-স্তরের সি ++ ফাংশনগুলি সিমড ইন্টার্নিকগুলি ( ইন্টেল আর্কিটেকচার , এবং এআরএম নিওনের জন্য ) ব্যবহার করে, কাঁচা পয়েন্টার ঠিকানাগুলি থেকে লোড করা এবং সংরক্ষণ করা।
- এই নিম্ন-স্তরের সি ++ ফাংশনের বৈশিষ্ট্য:
- একচেটিয়াভাবে এক-মাত্রিক (ক্রমাগত স্মৃতিতে)
- মেমরি বরাদ্দ নিয়ে কাজ করে না।
(টেম্পোরারি সহ প্রতিটি বরাদ্দই ওপেনসিভি সুবিধা ব্যবহার করে বাইরের কোড দ্বারা পরিচালিত হয়)) - প্রতীকগুলির নাম দৈর্ঘ্যের পরিসীমা (অভ্যন্তরীণ নামগুলি, পরিবর্তনশীল নামগুলি ইত্যাদি) মোটামুটি 10 - 20 অক্ষর, যা যথেষ্ট অতিরিক্ত is
(টেকনো-ব্যাবলের মতো পড়ে)) - SIMD ভেরিয়েবল পুনঃব্যবহার নিরুৎসাহিত করা হয়, কারণ কম্পাইলার সঠিকভাবে কোড যে পার্স বেশ বগী হয় না "একক নিয়োগ" শৈলী কোডিং লেখা।
(আমি বেশ কয়েকটি সংকলক বাগ রিপোর্ট দায়ের করেছি))
সিমডি প্রোগ্রামিংয়ের কোন দিকগুলি আলোচনার সাধারণ ক্ষেত্রে থেকে পৃথক হতে পারে? বা, সিমডি আলাদা কেন?
প্রাথমিক উন্নয়ন ব্যয়ের ক্ষেত্রে
- এটি সুপরিচিত যে ভাল পারফরম্যান্স সহ সি ++ সিমডি কোডের প্রাথমিক উন্নয়ন ব্যয় আনুষাঙ্গিকভাবে লিখিত সি ++ কোডের তুলনায় প্রায় 10x - 100x (বিস্তৃত মার্জিন সহ) is
- পারফরম্যান্স বনাম পঠনযোগ্য / ক্লিনার কোডের মধ্যে বাছাই করার উত্তরে উল্লিখিত হিসাবে ? , বেশিরভাগ কোড (ক্যাজুয়াল-লিখিত কোড এবং সিমডি কোড সহ) প্রাথমিকভাবে পরিষ্কার বা দ্রুত নয় ।
- কোড পারফরম্যান্সে বিবর্তনীয় উন্নতি (উভয় স্কেলার এবং সিমডি কোডে) নিরুৎসাহিত করা হয় (কারণ এটি এক ধরণের সফ্টওয়্যার পুনর্নির্মাণ হিসাবে দেখা হয় ), এবং ব্যয় এবং সুবিধা ট্র্যাক করা হয়নি।
প্রপেনসিটির ক্ষেত্রে
(যেমন পেরিটো নীতিটি, উর্ধ্বতন ৮০-২০ বিধি )
- এমনকি যদি ইমেজ প্রসেসিংয়ে কেবলমাত্র একটি সফ্টওয়্যার সিস্টেমের 20% (কোডের আকার এবং কার্যকারিতা উভয়ই) থাকে, তবে চিত্র প্রক্রিয়াকরণ তুলনামূলকভাবে ধীর হয় (যখন সিপিইউর সময় ব্যয় করার শতাংশ হিসাবে দেখা হয়), 80% এরও বেশি সময় নেয়।
- এটি ডেটা আকারের প্রভাবের কারণে হয়: একটি সাধারণ চিত্রের আকার মেগাবাইটে পরিমাপ করা হয়, যেখানে অ-চিত্রের ডেটাগুলির সাধারণ আকার কিলোবাইটে পরিমাপ করা হয়।
- ইমেজ প্রসেসিং কোডের মধ্যে, একটি সিমড প্রোগ্রামার সি ++ কোডে লুপ কাঠামো সনাক্ত করে হটস্পটগুলি সমন্বিত 20% কোডটি স্বয়ংক্রিয়ভাবে সনাক্ত করতে প্রশিক্ষিত হয়। সুতরাং, একটি সিমডি প্রোগ্রামারের দৃষ্টিকোণ থেকে, "গুরুত্বপূর্ণ কোডগুলি" এর 100% পারফরম্যান্সের বাধা bottle
- প্রায়শই একটি চিত্র প্রক্রিয়াকরণ সিস্টেমে একাধিক হটস্পট বিদ্যমান এবং সময়ের তুলনামূলক অনুপাত গ্রহণ করে। উদাহরণস্বরূপ, মোট সময়ের পাঁচটি হটস্পট থাকতে পারে (20%, 18%, 16%, 14%, 12%) উচ্চ কার্যকারিতা অর্জনের জন্য, সমস্ত হটস্পটগুলিকে সিমডে নতুন করে লেখা দরকার।
- এটি বেলুন-পপিংয়ের নিয়ম হিসাবে সংক্ষেপে বলা হয়েছে : একটি বেলুন দু'বার পপ করা যায় না।
- মনে করুন কিছু বেলুন রয়েছে, তার মধ্যে 5 টি বলুন। এগুলিকে হ্রাস করার একমাত্র উপায় হ'ল একে একে পপ করা।
- একবার প্রথম বেলুনটি পপ করা হয়ে গেলে, বাকি 4 টি বেলুনগুলি এখন মোট বাস্তবায়ন সময়ের একটি উচ্চতর শতাংশ নিয়ে গঠিত।
- আরও উপার্জন করতে, প্রথমে অন্য একটি বেলুনটি পপ করতে হবে।
(এই জন্য অবাধ্যতা অপ্টিমাইজেশান এর 80-20 নিয়ম: একটি ভাল লাভজনক ফলাফল সর্বনিম্ন ঝুলন্ত ফল 20% বাছাই করা হয়েছে পরে অর্জন করা যেতে পারে।)
পাঠযোগ্যতা এবং রক্ষণাবেক্ষণের ক্ষেত্রে
সিমডি কোডটি পড়তে পটেন্টলি শক্ত।
- এটি প্রত্যেকটি সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের সেরা অনুশীলন যেমন নামকরণ, এনক্যাপসুলেশন, কনস্ট-সঠিকতা (এবং পার্শ্ব-প্রতিক্রিয়া সুস্পষ্ট করে তোলা), ফাংশন পচে যাওয়া ইত্যাদি অনুসরণ করে এমনকি সত্য is
- অভিজ্ঞ সিমডি প্রোগ্রামারদের ক্ষেত্রেও এটি সত্য।
সর্বোত্তম সিমডি কোডটি এর সমতুল্য সি ++ প্রোটোটাইপ কোডের সাথে তুলনা করে খুব মন্তব্যযুক্ত (মন্তব্য দেখুন) ।
- সিমডি কোডের কনটোর্ট করার অনেকগুলি উপায় রয়েছে তবে এই জাতীয় 10 টির মধ্যে 1 জনই গ্রহণযোগ্যভাবে দ্রুত ফলাফল অর্জন করতে পারে।
- (এটি, উচ্চ বিকাশের ব্যয়কে ন্যায়সঙ্গত করতে 4x-10x পারফরম্যান্স লাভের সুরে higher এমনকি উচ্চতর লাভটি বাস্তবে দেখা গেছে))
(মন্তব্য)
এটি এমআইটি হ্যালাইড প্রকল্পের মূল থিসিস- কাগজের শিরোনাম ভারব্যাটিমের উদ্ধৃতি দিয়ে:
"চিত্র প্রক্রিয়াকরণ পাইপলাইনগুলির সহজতর অপ্টিমাইজেশনের জন্য সময়সূচী থেকে অ্যালগরিদমগুলি ডিকোপলিং"
ফরওয়ার্ড আবেদনের ক্ষেত্রে
- সিমডি কোড কঠোরভাবে একটি একক স্থাপত্যের সাথে আবদ্ধ। প্রতিটি নতুন আর্কিটেকচার (বা সিমডি রেজিস্টারগুলির প্রতিটি প্রশস্তকরণ) এর জন্য একটি পুনর্লিখনের প্রয়োজন।
- বেশিরভাগ সফ্টওয়্যার বিকাশের বিপরীতে, সিমডি কোডের প্রতিটি অংশ সাধারণত একক উদ্দেশ্যে লেখা হয় যা কখনই পরিবর্তন হয় না।
(অন্যান্য স্থাপত্যে পোর্টিং ব্যতীত)) - কিছু আর্কিটেকচার নিখুঁত পিছনে সামঞ্জস্য বজায় রাখে (ইন্টেল); একটি তুচ্ছ পরিমাণ (এআরএম AArch64 দ্বারা প্রতিস্থাপিত কিছু পতনের সংক্ষিপ্ত
vtbl
সঙ্গেvtblq
) কিন্তু যা যথেষ্ট কিছু কোড কম্পাইল করার বিফল হওয়ার সম্ভাবনা রয়েছে।
দক্ষতা এবং প্রশিক্ষণের ক্ষেত্রে
- সিমড কোড লিখতে ও বজায় রাখতে কোনও নতুন প্রোগ্রামারকে সঠিকভাবে প্রশিক্ষণের জন্য কোন জ্ঞানের পূর্বশর্ত প্রয়োজন তা পরিষ্কার নয়।
- স্কুলে সিমড প্রোগ্রামিং শিখেছে এমন কলেজ স্নাতকরা এটিকে অবৈজ্ঞানিক ক্যারিয়ারের ট্র্যাক হিসাবে তুচ্ছ ও বরখাস্ত বলে মনে করছেন।
- ডিসঅ্যাসাব্ল্যাস-রিডিং এবং লো-লেভেল পারফরম্যান্স প্রোফাইলিং উচ্চ-পারফরম্যান্স সিমডি কোড লেখার জন্য দুটি মৌলিক দক্ষতা হিসাবে চিহ্নিত করা হয়। তবে এই দুটি দক্ষতায় প্রোগ্রামারদের কীভাবে প্রশিক্ষণ দেওয়া যায় তা স্পষ্ট নয়।
- আধুনিক সিপিইউ আর্কিটেকচার (যা পাঠ্যপুস্তকে যা শেখানো হয় তার থেকে তা উল্লেখযোগ্যভাবে বিচ্যুত হয়) প্রশিক্ষণকে আরও কঠিন করে তোলে।
নির্ভুলতা এবং ত্রুটি-সংক্রান্ত ব্যয়ের ক্ষেত্রে
- একটি একক সিমডি প্রসেসিং ফাংশন আসলে যথেষ্ট সংহত হয় যে কোনও ব্যক্তি এই দ্বারা নির্ভুলতা প্রতিষ্ঠা করতে পারে:
- আনুষ্ঠানিক পদ্ধতি প্রয়োগ (কলম এবং কাগজ সহ) , এবং
- আউটপুট পূর্ণসংখ্যার ব্যাপ্তি যাচাই করা হচ্ছে (প্রোটোটাইপ কোড সহ এবং রান-টাইমের বাইরে সম্পাদিত) ।
- যাচাইকরণ প্রক্রিয়াটি যদিও খুব ব্যয়বহুল (কোড পর্যালোচনার জন্য 100% সময় এবং প্রোটোটাইপ মডেল চেকিংয়ে 100% সময় ব্যয় করে) যা সিমড কোডের ইতিমধ্যে ব্যয়বহুল উন্নয়ন ব্যয়কে তিনগুণ করে।
- যদি কোনও বাগ এই যাচাইকরণ প্রক্রিয়াটির মধ্যে কোনওভাবে পিছলে যায় তবে সন্দেহজনক ত্রুটিযুক্ত ফাংশন প্রতিস্থাপন (পুনর্লিখন) ব্যতীত "মেরামত" (ফিক্স) করা প্রায় অসম্ভব।
- সিমড কোড সি ++ সংকলক (কোড জেনারেটর অনুকূলকরণ) এর ত্রুটিগুলি ভুগছে।
- সি ++ এক্সপ্রেশন টেমপ্লেটগুলি ব্যবহার করে তৈরি সিমডি কোডগুলিও সংকলকটির ত্রুটিগুলি থেকে ভোগে।
বিঘ্নজনক উদ্ভাবনের ক্ষেত্রে
একাডেমিয়া থেকে অনেকগুলি সমাধান প্রস্তাব করা হয়েছে, তবে কয়েকটি বাণিজ্যিক ব্যবসায়ের ব্যাপক ব্যবহার দেখছেন are
- এমআইটি হ্যালিড
- স্ট্যানফোর্ড ডার্করুম
- এনটি 2 (সংখ্যাসূচক টেম্পলেট সরঞ্জামবক্স) এবং সম্পর্কিত বুস্ট.এসআইএমডি
বিস্তৃত বাণিজ্যিক ব্যবহার সহ গ্রন্থাগারগুলি সিমড-সক্ষমিতভাবে সক্রিয় বলে মনে হচ্ছে না।
- ওপেন সোর্স লাইব্রেরিগুলি সিমডকে হালকা মনে হয়।
- ভার্সন ২.৪.৯ অনুসারে বিপুল সংখ্যক ওপেনসিভি এপিআই ফাংশন প্রোফাইল করার পরে আমার এই প্রথম হাতের পর্যবেক্ষণ আছে।
- আমার প্রোফাইল করা অন্যান্য অনেক চিত্র প্রক্রিয়াকরণ গ্রন্থাগারগুলিও সিমডির ভারী ব্যবহার করে না, বা তারা সত্যিকারের হটস্পটগুলি মিস করে।
- বাণিজ্যিক গ্রন্থাগারগুলি পুরোপুরি সিমডি এড়িয়ে চলেছে।
- কয়েকটি ক্ষেত্রে, আমি এমনকি চিত্র প্রক্রিয়াকরণ গ্রন্থাগারগুলি পূর্ববর্তী সংস্করণে সিমড-অনুকূলিত কোডগুলি পরবর্তী সংস্করণে সিমড-নন কোডে রূপান্তরিত করতে দেখেছি, এর ফলে গুরুতর কর্মক্ষমতা পর্যবেক্ষণের ফলাফল হয়।
(বিক্রেতার প্রতিক্রিয়া হ'ল সংকলক বাগগুলি এড়ানো প্রয়োজন ছিল))
- কয়েকটি ক্ষেত্রে, আমি এমনকি চিত্র প্রক্রিয়াকরণ গ্রন্থাগারগুলি পূর্ববর্তী সংস্করণে সিমড-অনুকূলিত কোডগুলি পরবর্তী সংস্করণে সিমড-নন কোডে রূপান্তরিত করতে দেখেছি, এর ফলে গুরুতর কর্মক্ষমতা পর্যবেক্ষণের ফলাফল হয়।
- ওপেন সোর্স লাইব্রেরিগুলি সিমডকে হালকা মনে হয়।
এই প্রোগ্রামারটির প্রশ্ন: লো লেটেন্সি কোডটি কি কখনও কখনও "কুশ্রী" হতে হয়? সম্পর্কিত, এবং কয়েক বছর আগে আমার ভিউ পয়েন্টগুলি ব্যাখ্যা করতে আমি আগে এই প্রশ্নের উত্তর লিখেছিলাম।
তবে, এই উত্তরটি "অকাল অপ্টিমাইজেশন" দৃষ্টিভঙ্গির পক্ষে, অর্থাৎ দৃষ্টিভঙ্গির পক্ষে যথেষ্ট "তুষ্ট" ease
- সমস্ত অপ্টিমাইজেশান সংজ্ঞা দ্বারা অকাল (বা, প্রকৃতির দ্বারা স্বল্প-মেয়াদী ), এবং
- দীর্ঘমেয়াদী সুবিধার একমাত্র অপটিমাইজেশন হ'ল সরলতার দিকে।
তবে এই জাতীয় দৃষ্টিভঙ্গি এই এসিএম নিবন্ধে প্রতিদ্বন্দ্বিতা করা হয় ।
এগুলি সবই আমাকে জিজ্ঞাসা করতে পরিচালিত করে: সিমড কোডটি সাধারণ অ্যাপ্লিকেশন কোডের চেয়ে আলাদা এবং আমি জানতে চাই যে সিমড কোডের জন্য পরিষ্কার এবং সাধারণ কোডের মান সম্পর্কিত কোনও অনুরূপ শিল্প সম্মতি আছে কিনা।