বিস্তৃত ভাষায়, জিপিইউতে দ্রুত সঞ্চালিত অ্যালগরিদমগুলি হ'ল আপনি অনেকগুলি ডেটা পয়েন্টে একই ধরণের নির্দেশনাটি করছেন।
এটি বোঝানোর জন্য একটি সহজ উদাহরণ ম্যাট্রিক্স গুণনের সাথে।
মনে করুন আমরা ম্যাট্রিক্স গণনা করছি
এ × বি = সি
একটি সাধারণ সিপিইউ অ্যালগরিদম এর মতো দেখতে লাগতে পারে
// সি = 0 দিয়ে শুরু হচ্ছে
for (int i = 0; i < C_Width; i++)
{
for (int j = 0; j < C_Height; j++)
{
for (int k = 0; k < A_Width; k++)
{
for (int l = 0; l < B_Height; l++)
{
C[j, i] += A[j, k] * B[l, i];
}
}
}
}
এখানে দেখার মূল বিষয়টি হ'ল লুপগুলির জন্য অনেকগুলি নেস্টেড রয়েছে এবং প্রতিটি পদক্ষেপ একের পর এক কার্যকর করতে হবে।
এর একটি চিত্র দেখুন
লক্ষ্য করুন যে সি এর প্রতিটি উপাদানের গণনা অন্যান্য উপাদানের কোনওটির উপর নির্ভর করে না। সুতরাং গণনাগুলি কী অর্ডারে করা হয়েছে তা বিবেচ্য নয়।
সুতরাং জিপিইউতে এই অপারেশনগুলি একই সাথে করা যেতে পারে।
ম্যাট্রিক্সের গুণনকে গণনা করার জন্য একটি জিপিইউ কার্নেল এর মতো দেখতে হবে
__kernel void Multiply
(
__global float * A,
__global float * B,
__global float * C
)
{
const int x = get_global_id(0);
const int y = get_global_id(1);
for (int k = 0; k < A_Width; k++)
{
for (int l = 0; l < B_Height; l++)
{
C[x, y] += A[x, k] * B[l, y];
}
}
}
এই কার্নেলের দুটি লুপের জন্য কেবল দুটি অভ্যন্তর রয়েছে। জিপিইউতে এই কাজটি প্রেরণকারী একটি প্রোগ্রাম জিপিইউকে সি এর প্রতিটি ডাটা পয়েন্টের জন্য এই কার্নেলটি চালিত করতে বলবে জিপিইউ এই নির্দেশাবলীর প্রতিটি একই সাথে বহু থ্রেডে করবে। পুরানো উক্তিটি যেমন "ডজন দ্বারা সস্তা" জিপিইউগুলি একইভাবে অনেক সময় একই কাজ করার জন্য ডিজাইন করা হয়েছিল।
তবে কিছু অ্যালগরিদম রয়েছে যা জিপিইউকে ধীর করবে। কিছু জিপিইউর জন্য উপযুক্ত নয়।
উদাহরণস্বরূপ, সেখানে ডেটা নির্ভরতা ছিল, যেমন: সি এর প্রতিটি উপাদানগুলির গণনা পূর্ববর্তী উপাদানগুলির উপর নির্ভর করে কল্পনা করুন। প্রোগ্রামারটিকে প্রতিটি পূর্ববর্তী গণনা শেষ হওয়ার জন্য অপেক্ষা করতে কার্নেলে একটি বাধা রাখতে হবে। এটি একটি বড় ধীর গতি হবে।
এছাড়াও, অ্যালগরিদমগুলিতে প্রচুর শাখার যুক্তি রয়েছে যেমন:
__kernel Foo()
{
if (somecondition)
{
do something
}
else
{
do something completely different
}
}
জিপিইউতে ধীর গতিতে প্রবণতা রয়েছে কারণ প্রতিটি থ্রেডে জিপিইউ আর একই কাজ করছে না।
এটি একটি সরল ব্যাখ্যা, কারণ বিবেচনা করার মতো আরও অনেক কারণ রয়েছে। উদাহরণস্বরূপ, সিপিইউ এবং জিপিইউর মধ্যে ডেটা প্রেরণ করাও সময় সাপেক্ষ। কখনও কখনও এটি অতিরিক্ত প্রেরণের সময় (এবং বিপরীতে) এড়াতে সিপিইউতে দ্রুত হওয়া সত্ত্বেও জিপিইউতে একটি গণনা করা উপযুক্ত।
অনেকগুলি আধুনিক সিপিইউ এখন হাইপারথ্রেডেড মাল্টিকোর প্রসেসরের সাথে সামঞ্জস্য সমর্থন করে।
জিপিইউ এর পুনরাবৃত্তির জন্য খুব ভাল বলে মনে হচ্ছে না, এখানে দেখুন যা সম্ভবত কিউআর অ্যালগরিদমের সাথে কিছু সমস্যা ব্যাখ্যা করে। আমি বিশ্বাস করি যে একটির কিছু পুনরাবৃত্ত ডেটা নির্ভরতা রয়েছে।