বেশ কয়েকবার, আমি এই শব্দটি মাতলাব, ফোর্টরান ... কিছু অন্যরকম মুখোমুখি হয়েছি ... তবে এর অর্থ কী এবং এর অর্থ কী? সুতরাং আমি এখানে জিজ্ঞাসা করছি, ভেক্টরাইজেশন কী, এবং এর অর্থ কী উদাহরণস্বরূপ, "একটি লুপ ভেক্টরাইজড"?
বেশ কয়েকবার, আমি এই শব্দটি মাতলাব, ফোর্টরান ... কিছু অন্যরকম মুখোমুখি হয়েছি ... তবে এর অর্থ কী এবং এর অর্থ কী? সুতরাং আমি এখানে জিজ্ঞাসা করছি, ভেক্টরাইজেশন কী, এবং এর অর্থ কী উদাহরণস্বরূপ, "একটি লুপ ভেক্টরাইজড"?
উত্তর:
অনেক সিপিইউতে "ভেক্টর" বা "সিমডি" নির্দেশিকা সেট থাকে যা একই সাথে দুটি, চার, বা আরও বেশি টুকরো ডেটাতে প্রয়োগ করে apply আধুনিক x86 চিপগুলিতে এসএসই নির্দেশনা রয়েছে, অনেকগুলি পিপিসি চিপগুলিতে "অ্যালটিভিক" নির্দেশনা রয়েছে, এবং কিছু কিছু এআরএম চিপগুলিতে একটি ভেক্টর নির্দেশিকা সেট রয়েছে, তাকে নিওন বলে।
"ভেক্টরাইজেশন" (সরলীকৃত) হ'ল একটি লুপ পুনর্লিখনের প্রক্রিয়া যাতে একটি অ্যারে N বারের একক উপাদানটি প্রক্রিয়া করার পরিবর্তে এটি অ্যারের 4 উপাদান একসাথে N / 4 বার প্রসেস করে (বলে)।
(আমি 4 টি বেছে নিয়েছি কারণ এটি আধুনিক হার্ডওয়্যারটি সম্ভবত সরাসরি সমর্থন করে; এটি "ভেক্টরাইজেশন" শব্দটি উচ্চ স্তরের সফ্টওয়্যার রূপান্তর বর্ণনা করতে ব্যবহৃত হয় যেখানে আপনি কেবল লুপটি পুরোপুরি বিমূর্ত করতে পারেন এবং উপাদানগুলির পরিবর্তে অ্যারেগুলিতে অপারেটিং বর্ণনা করতে পারেন) যে তাদের অন্তর্ভুক্ত)
ভেক্টরাইজেশন এবং লুপ আনরোলিংয়ের মধ্যে পার্থক্য: নিম্নলিখিত খুব সাধারণ লুপটি বিবেচনা করুন যা দুটি অ্যারের উপাদান যুক্ত করে এবং ফলাফলগুলি তৃতীয় অ্যারে সংরক্ষণ করে।
for (int i=0; i<16; ++i)
C[i] = A[i] + B[i];
এই লুপটি নিবন্ধভুক্ত করা এটিকে এমন কিছুতে রূপান্তরিত করবে:
for (int i=0; i<16; i+=4) {
C[i] = A[i] + B[i];
C[i+1] = A[i+1] + B[i+1];
C[i+2] = A[i+2] + B[i+2];
C[i+3] = A[i+3] + B[i+3];
}
অন্যদিকে, এটি ভেক্টরাইজিং এরকম কিছু তৈরি করে:
for (int i=0; i<16; i+=4)
addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);
যেখানে "addFourThingsAtOnceAndStoreResult" আপনার সংকলক ভেক্টর নির্দেশাবলী নির্দিষ্ট করার জন্য যা কিছু অভ্যন্তরীণ (গুলি) ব্যবহার করে তার স্থানধারক। নোট করুন যে কিছু সংকলক খুব সহজেই একটি কম্পাইল বিকল্পের সাহায্যে সক্ষম হতে পারে এর মতো খুব সাধারণ লুপগুলি স্বয়ংক্রিয়ভাবে ভেক্টরাইজ করতে সক্ষম হয়। আরও জটিল অ্যালগরিদমগুলিকে এখনও ভাল ভেক্টর কোড তৈরি করতে প্রোগ্রামারটির সহায়তা প্রয়োজন।
ভেক্টরাইজেশন হল একটি স্কেলার প্রোগ্রামকে ভেক্টর প্রোগ্রামে রূপান্তর করার শব্দ term ভেক্টরাইজড প্রোগ্রামগুলি একক নির্দেশনা থেকে একাধিক ক্রিয়াকলাপ চালাতে পারে, যেখানে স্কেলার কেবল একবারে কয়েক জোড়া অপারেশনে কাজ করতে পারে।
উইকিপিডিয়া থেকে :
স্কেলার পদ্ধতির:
for (i = 0; i < 1024; i++)
{
C[i] = A[i]*B[i];
}
ভেক্টরাইজড পন্থা:
for (i = 0; i < 1024; i+=4)
{
C[i:i+3] = A[i:i+3]*B[i:i+3];
}
এটি একটি তালিকায় একক গাণিতিক অপারেশন করার ক্ষমতা - বা "ভেক্টর" - একক পদক্ষেপে সংখ্যার উল্লেখ করে। আপনি এটি প্রায়শই ফোর্টরানের সাথে দেখেন কারণ এটি বৈজ্ঞানিক কম্পিউটিংয়ের সাথে সম্পর্কিত, যা সুপার কমপুটিংয়ের সাথে সম্পর্কিত, যেখানে ভেক্টরাইজড পাটিগণিত প্রথম উপস্থিত হয়েছিল। আজকাল প্রায় সব ডেস্কটপ সিপিইউ ইন্টেলের এসএসই-র মতো প্রযুক্তির মাধ্যমে ভেক্টরাইজড পাটিগণিতের কিছু ফর্ম সরবরাহ করে। জিপিইউগুলি ভেক্টরাইজড গাণিতিকগুলির একটি ফর্মও সরবরাহ করে।
ভেক্টরাইজেশন বৈজ্ঞানিক কম্পিউটিংয়ে প্রচুর পরিমাণে ব্যবহৃত হয় যেখানে বিশাল সংখ্যক ডেটা দক্ষতার সাথে প্রক্রিয়া করা প্রয়োজন।
বাস্তব প্রোগ্রামিং অ্যাপ্লিকেশনটিতে, আমি জানি এটি NUMPY- এ ব্যবহৃত হয়েছে (অন্য কোনওটির বিষয়ে নিশ্চিত নয়)।
নম্পি (পাইথনে বৈজ্ঞানিক কম্পিউটিংয়ের জন্য প্যাকেজ), এন-ডাইমেনশনাল অ্যারে দ্রুত ম্যানিপুলেশনের জন্য ভেক্টরাইজেশন ব্যবহার করে, যা অ্যারে পরিচালনার জন্য অন্তর্নির্মিত পাইথন বিকল্পগুলি সম্পন্ন করলে সাধারণত ধীর হয়।
যদিও ব্যাখ্যা টন আছে আউট আছে, এখানে কি VECTORIZATION সংজ্ঞায়িত করা হয় হিসাবে NUMPY ডকুমেন্টেশন পৃষ্ঠাটিতে
ভেক্টরাইজেশন কোডটিতে কোনও স্পষ্ট লুপিং, ইনডেক্সিং ইত্যাদির অনুপস্থিতি বর্ণনা করে - এই বিষয়গুলি অবশ্যই অপটিমাইজড, প্রাক-সংকলিত সি কোডে "পর্দার পিছনে" চলছে। ভেক্টরাইজড কোডের অনেক সুবিধা রয়েছে যার মধ্যে রয়েছে:
ভেক্টরাইজড কোডটি আরও সংক্ষিপ্ত এবং পড়া সহজ
কোডের কম লাইনগুলির অর্থ কম বাগ রয়েছে
কোডটি মানিক গাণিতিক স্বরলিপিটির সাথে আরও ঘনিষ্ঠভাবে সাদৃশ্যযুক্ত (গাণিতিক কাঠামোগুলি সঠিকভাবে কোড করা সহজ করে তোলে)
ভেক্টরাইজেশনের ফলে আরও "পাইথোনিক" কোড আসে। ভেক্টরাইজেশন ছাড়াই আমাদের কোডটি অক্ষম এবং লুপগুলির জন্য পড়তে অসুবিধায় লিপ্ত হবে।
ভেক্টরাইজেশন, সহজ কথায়, অর্থ অ্যালগরিদমকে অনুকূলকরণ করা যাতে এটি প্রসেসরে সিমড নির্দেশাবলী ব্যবহার করতে পারে।
এভিএক্স, এভিএক্স 2 এবং এভিএক্স 512 হ'ল নির্দেশিকা সেট (ইন্টেল) যা এক নির্দেশে একাধিক ডেটাতে একই ক্রিয়াকলাপ সম্পাদন করে। যেমন। AVX512 এর অর্থ আপনি একবারে 16 টি পূর্ণসংখ্যার মান (4 বাইট) পরিচালনা করতে পারেন। এর অর্থ হ'ল যদি আপনার 16 টি সংখ্যার ভেক্টর থাকে এবং আপনি প্রতিটি সংখ্যায় সেই মান দ্বিগুণ করতে চান এবং তারপরে এটি 10 যুক্ত করেন 10 আপনি হয় সাধারণ রেজিস্টার [a, b, c] এ 16 বার মান লোড করতে এবং একই ক্রিয়াকলাপ সম্পাদন করতে পারেন বা সিমড রেজিস্টারগুলিতে [xmm, ymm] এ 16 মানগুলি লোড করে একই অপারেশন করতে পারেন এবং একবার অপারেশন করতে পারেন। এটি ভেক্টর ডেটার গণনা দ্রুত করতে দেয় lets
ভেক্টরাইজেশনে আমরা এটি আমাদের উপাত্তকে পুনরায় তৈরি করে আমাদের সুবিধার জন্য ব্যবহার করি যাতে আমরা এতে সিমডি অপারেশন করতে পারি এবং প্রোগ্রামটিকে গতিশীল করতে পারি।
কেবল ভেক্টরাইজেশনের সমস্যা হ্যান্ডলিং শর্ত। কারণ শর্তগুলি ফাঁসি কার্যকর করে flow এটি মাস্কিং দ্বারা পরিচালনা করা যেতে পারে। পাটিগণিত অপারেশনে শর্তটি মডেলিং করে। যেমন। যদি আমরা 10 এর মানটি যোগ করতে চাই তবে এটি 100 এর চেয়ে বেশি হয় we
if(x[i] > 100) x[i] += 10; // this will branch execution flow.
বা আমরা শর্তটি গাণিতিক অপারেশনে মডেল করতে পারি একটি শর্ত ভেক্টর সি তৈরি করে,
c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask
এটি অত্যন্ত তুচ্ছ উদাহরণ যদিও ... এইভাবে সিটি আমাদের মাস্কিং ভেক্টর যা আমরা এর মানের ভিত্তিতে বাইনারি অপারেশন করতে ব্যবহার করি। এটি কার্যকরভাবে প্রবাহের শাখা প্রশাখা এড়ায় এবং ভেক্টরাইজেশন সক্ষম করে।
ভেক্টরাইজেশন সমান্তরালকরণের মতো গুরুত্বপূর্ণ। সুতরাং, আমাদের এটি যতটা সম্ভব ব্যবহার করা উচিত। সমস্ত আধুনিক দিনের প্রসেসরের ভারী গণনা কাজের চাপের জন্য সিমডি নির্দেশনা রয়েছে। আমরা ভেক্টরাইজেশন ব্যবহার করে এই সিমডি নির্দেশিকাগুলি ব্যবহার করতে আমাদের কোডটি অনুকূল করতে পারি, এটি আধুনিক প্রসেসরের উপর উপলভ্য একাধিক কোরগুলিতে চালনার জন্য আমাদের কোডটিকে সমান্তরাল করার অনুরূপ।
আমি ওপেনএমপি-এর উল্লেখ সহ ছেড়ে যেতে চাই, যা প্রোগমাস ব্যবহার করে আপনি কোডটিকে ভেক্টরাইজ করতে দেয়। আমি এটি একটি ভাল সূচনা পয়েন্ট হিসাবে বিবেচনা। ওপেনসিসির পক্ষেও একই কথা বলা যেতে পারে।
ইন্টেল লোকেদের দ্বারা আমি মনে করি সহজেই বোঝা সহজ।
ভেক্টরাইজেশন হ'ল একক সময়ে একক মানকে অপারেটিং থেকে একবারে মানগুলির সেটগুলিতে অপারেটিং রূপান্তর করার একটি অ্যালগরিদমকে রূপান্তর করার প্রক্রিয়া । আধুনিক সিপিইউগুলি ভেক্টর অপারেশনের জন্য সরাসরি সহায়তা প্রদান করে যেখানে একক নির্দেশ একাধিক ডেটাতে (সিমডি) প্রয়োগ করা হয়।
উদাহরণস্বরূপ, 512 বিট রেজিস্টার সহ একটি সিপিইউ 16 32- বিট একক নির্ভুলতা ডাবলস ধারণ করতে পারে এবং একক গণনা করতে পারে।
একবারে একক নির্দেশনা কার্যকর করার চেয়ে 16 গুণ বেশি দ্রুত। এটি থ্রেডিং এবং মাল্টি-কোর সিপিইউগুলির সাথে একত্রিত করে প্রস্থের পারফরম্যান্স লাভের আদেশ দেয়।
জাভাতে এগুলির একটি বিকল্প রয়েছে 2020 এর 15 জেডিকে বা 2021-এ জেডিকে 16 এ দেরীতে অন্তর্ভুক্ত করা।
উপরের দুটি উত্তর দেখুন। আমি কেবল যুক্ত করতে চেয়েছিলাম যে ভেক্টরাইজেশন করতে চাওয়ার কারণ হ'ল এই কম্পিউটারগুলি সহজেই কম্পিউটারে এবং মাল্টি-প্রসেসরের মাধ্যমে প্যারেলে সঞ্চালিত হতে পারে, যা একটি বড় পারফরম্যান্স লাভ অর্জন করে। একক প্রসেসর কম্পিউটারগুলিতে কোনও কার্যকারিতা লাভ হবে না।