কেউ কি __global__
এবং এর মধ্যে পার্থক্য বর্ণনা করতে পারে __device__
?
আমি কখন ব্যবহার করব __device__
, কখন ব্যবহার করব __global__
?
কেউ কি __global__
এবং এর মধ্যে পার্থক্য বর্ণনা করতে পারে __device__
?
আমি কখন ব্যবহার করব __device__
, কখন ব্যবহার করব __global__
?
উত্তর:
__device__
এবং __global__
ফাংশনগুলির মধ্যে পার্থক্যগুলি হ'ল :
__device__
ফাংশনগুলি কেবলমাত্র ডিভাইস থেকে কল করা যেতে পারে এবং এটি কেবলমাত্র ডিভাইসে কার্যকর করা হয়।
__global__
হোস্ট থেকে ফাংশন কল করা যেতে পারে এবং এটি ডিভাইসে কার্যকর করা হয়।
অতএব, আপনি __device__
কার্নেল ফাংশন থেকে ফাংশন কল করেন এবং আপনাকে কার্নেল সেটিংস সেট করতে হবে না। আপনি কোনও ফাংশন "ওভারলোড " void foo(void)
ও করতে পারেন, উদাহরণস্বরূপ: আপনি ঘোষণা করতে পারেন এবং __device__ foo (void)
তারপরে একটি হোস্টে মৃত্যুদন্ড কার্যকর করা হয় এবং কেবল কোনও হোস্ট ফাংশন থেকে কল করা যেতে পারে। অন্যটি ডিভাইসে কার্যকর করা হয় এবং কেবল কোনও ডিভাইস বা কার্নেল ফাংশন থেকে কল করা যেতে পারে।
আপনি নিম্নলিখিত লিঙ্কটিও দেখতে পারেন: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFuntions , এটি আমার পক্ষে কার্যকর ছিল।
__global__
- সিপিইউ বা জিপিইউ * থেকে কল করা জিপিইউতে চলে। <<<dim3>>>
যুক্তি দিয়ে কার্যকর করা হয়েছে ।__device__
- জিপিইউ থেকে কল করা জিপিইউতে চলে। ভেরিয়েবাইলগুলির সাথেও ব্যবহার করা যেতে পারে।__host__
- সিপিইউ থেকে কল করা সিপিইউতে চলে।*) __global__
অন্যান্য __global__
ফাংশন থেকে ফাংশন কল করা যেতে পারে
কম্পিউট সক্ষমতা 3.5।
আমি এটি একটি উদাহরণ দিয়ে ব্যাখ্যা করব:
main()
{
// Your main function. Executed by CPU
}
__global__ void calledFromCpuForGPU(...)
{
//This function is called by CPU and suppose to be executed on GPU
}
__device__ void calledFromGPUforGPU(...)
{
// This function is called by GPU and suppose to be executed on GPU
}
অর্থাত্ যখন আমরা কোনও হোস্ট (সিপিইউ) ফাংশনটি কোনও ডিভাইস (জিপিইউ) ফাংশন কল করতে চাই, তখন ' গ্লোবাল ' ব্যবহার করা হয়। এটি পড়ুন: " https://code.google.com/p/stanford-cs193g-sp2010/wiki/Tutorial টি গ্লোবাল ফাংশন "
এবং যখন আমরা একটি ডিভাইস (জিপিইউ) ফাংশন চাই (বরং কার্নেল) অন্য কার্নেল ফাংশনটিকে কল করতে আমরা ' ডিভাইস ' ব্যবহার করি । এটি " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunitions " পড়ুন
পার্থক্যটি বোঝার জন্য এটি যথেষ্ট হওয়া উচিত।
আমি আপাতত এখানে কিছু ভিত্তিহীন অনুমান রেকর্ড করছি (যখন আমি কোনও কর্তৃত্বের উত্স পেলাম আমি পরে এগুলি প্রমাণ করব) ...
__device__
ফাংশনগুলির মধ্যে শূন্যতা ব্যতীত অন্য কোনও রিটার্নের ধরন __global__
থাকতে পারে তবে ফাংশনগুলিতে সর্বদা শূন্য হওয়া উচিত।
__global__
অতিরিক্ত জিপিইউ থ্রেড চালু করতে জিপিইউতে চলমান অন্যান্য কার্নেলগুলির মধ্যে থেকে ফাংশনগুলি কল করা যেতে পারে (সিইউডিএ গতিশীল সমান্তরালতা মডেল (ওরফে সিএনপি) এর অংশ হিসাবে) যখন __device__
কলিং কার্নেলের মতো একই থ্রেডে চালিত হয়।
__global__
ফাংশনটি কার্নেলের সংজ্ঞা। যখনই এটি সিপিইউ থেকে কল করা হয়, সেই কার্নেলটি জিপিইউতে চালু হয়।
তবে প্রতিটি থ্রেড যে কার্নেলটি কার্যকর করে তার জন্য কিছু কোড বারবার প্রয়োগ করা প্রয়োজন, উদাহরণস্বরূপ দুটি সংখ্যার অদলবদল করা। সুতরাং, আমরা এখানে একটি সহায়ক ফাংশন লিখতে পারি, ঠিক যেমন একটি সি প্রোগ্রামে করি। এবং জিপিইউতে চালিত থ্রেডগুলির জন্য, একটি সহায়ক ফাংশন হিসাবে ঘোষণা করা উচিত __device__
।
সুতরাং, কার্নেলের থ্রেড থেকে একটি ডিভাইস ফাংশন কল করা হয় - এক থ্রেডের জন্য একটি উদাহরণ। যখন, সিপিইউ থ্রেড থেকে একটি বিশ্বব্যাপী ফাংশন কল করা হয়।
__global__
একটি CUDA সি কীওয়ার্ড (ঘোষণা নির্দিষ্টকরণকারী) যা ফাংশন বলে যে
হোস্ট কোড ব্যবহার করে গ্লোবাল ফাংশন (কার্নেল) চালু করা হয়েছে <<< no_of_blocks , no_of threads_per_block>>>
। প্রতিটি থ্রেড তার অনন্য থ্রেড আইডি দ্বারা কার্নেল চালায়।
তবে, __device__
হোস্ট কোড থেকে ফাংশনগুলি কল করা যাবে না if যদি আপনার এটি উভয়ই ব্যবহার করা দরকার __host__
__device__
।
গ্লোবাল ফাংশনটি কেবল হোস্টের কাছ থেকে কল করা যেতে পারে এবং তাদের কাছে রিটার্নের ধরণ নেই যদিও ডিভাইস ফাংশনটি কেবলমাত্র অন্য ডিভাইস ফাংশনের কার্নেল ফাংশন থেকে কল করা যেতে পারে তাই কার্নেল সেটিংসের প্রয়োজন নেই
__global__
থেকে সিউডিএ কার্নেল শব্দার্থবিজ্ঞান (<<< ... >>>) ব্যবহার করে ফাংশনগুলিও কল করা যেতে পারে - যদি আপনি গতিশীল সমান্তরালতা ব্যবহার করেন - যার জন্য CUDA 5.0 এবং কম্পিউটারের সামর্থ্য 3.5 বা ততোধিক প্রয়োজন।