গ্লোবাল এবং ডিভাইস ফাংশন মধ্যে পার্থক্য


108

কেউ কি __global__এবং এর মধ্যে পার্থক্য বর্ণনা করতে পারে __device__?

আমি কখন ব্যবহার করব __device__, কখন ব্যবহার করব __global__?

উত্তর:


136

গ্লোবাল ফাংশনগুলিকে "কার্নেলস "ও বলা হয়। এটি সিউডিএ কার্নেল কল শব্দার্থক ( <<<...>>>) ব্যবহার করে আপনি হোস্ট পক্ষ থেকে কল করতে পারেন এমন ফাংশন ।

ডিভাইস ফাংশনগুলি কেবলমাত্র অন্য ডিভাইস বা গ্লোবাল ফাংশন থেকে কল করা যেতে পারে। __device__হোস্ট কোড থেকে ফাংশনগুলি কল করা যায় না।


14
সংযোজন হিসাবে, ডিআইডি __global__থেকে সিউডিএ কার্নেল শব্দার্থবিজ্ঞান (<<< ... >>>) ব্যবহার করে ফাংশনগুলিও কল করা যেতে পারে - যদি আপনি গতিশীল সমান্তরালতা ব্যবহার করেন - যার জন্য CUDA 5.0 এবং কম্পিউটারের সামর্থ্য 3.5 বা ততোধিক প্রয়োজন।
টম

39

__device__এবং __global__ফাংশনগুলির মধ্যে পার্থক্যগুলি হ'ল :

__device__ ফাংশনগুলি কেবলমাত্র ডিভাইস থেকে কল করা যেতে পারে এবং এটি কেবলমাত্র ডিভাইসে কার্যকর করা হয়।

__global__ হোস্ট থেকে ফাংশন কল করা যেতে পারে এবং এটি ডিভাইসে কার্যকর করা হয়।

অতএব, আপনি __device__কার্নেল ফাংশন থেকে ফাংশন কল করেন এবং আপনাকে কার্নেল সেটিংস সেট করতে হবে না। আপনি কোনও ফাংশন "ওভারলোড " void foo(void)ও করতে পারেন, উদাহরণস্বরূপ: আপনি ঘোষণা করতে পারেন এবং __device__ foo (void)তারপরে একটি হোস্টে মৃত্যুদন্ড কার্যকর করা হয় এবং কেবল কোনও হোস্ট ফাংশন থেকে কল করা যেতে পারে। অন্যটি ডিভাইসে কার্যকর করা হয় এবং কেবল কোনও ডিভাইস বা কার্নেল ফাংশন থেকে কল করা যেতে পারে।

আপনি নিম্নলিখিত লিঙ্কটিও দেখতে পারেন: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFuntions , এটি আমার পক্ষে কার্যকর ছিল।


31
  1. __global__- সিপিইউ বা জিপিইউ * থেকে কল করা জিপিইউতে চলে। <<<dim3>>>যুক্তি দিয়ে কার্যকর করা হয়েছে ।
  2. __device__- জিপিইউ থেকে কল করা জিপিইউতে চলে। ভেরিয়েবাইলগুলির সাথেও ব্যবহার করা যেতে পারে।
  3. __host__ - সিপিইউ থেকে কল করা সিপিইউতে চলে।

*) __global__অন্যান্য __global__ফাংশন থেকে ফাংশন কল করা যেতে পারে
কম্পিউট সক্ষমতা 3.5।


5
এই উত্তরটি কিছুটা দেরিতে - প্রশ্নটি জিজ্ঞাসা করার সময়ে এটি সঠিক ছিল, কিন্তু গতিশীল সমান্তরালতার আবিষ্কারের পরে এটি আর সঠিক নয় ।
তের

16

আমি এটি একটি উদাহরণ দিয়ে ব্যাখ্যা করব:

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 " পড়ুন

পার্থক্যটি বোঝার জন্য এটি যথেষ্ট হওয়া উচিত।


13

__global__চুদা কার্নেলগুলির জন্য, ফাংশনগুলি যা হোস্ট থেকে সরাসরি কলযোগ্য। __device__ফাংশনগুলি কল হতে পারে __global__এবং __device__ফাংশনগুলি হোস্ট থেকে নয়।


7

আমি আপাতত এখানে কিছু ভিত্তিহীন অনুমান রেকর্ড করছি (যখন আমি কোনও কর্তৃত্বের উত্স পেলাম আমি পরে এগুলি প্রমাণ করব) ...

  1. __device__ফাংশনগুলির মধ্যে শূন্যতা ব্যতীত অন্য কোনও রিটার্নের ধরন __global__থাকতে পারে তবে ফাংশনগুলিতে সর্বদা শূন্য হওয়া উচিত।

  2. __global__অতিরিক্ত জিপিইউ থ্রেড চালু করতে জিপিইউতে চলমান অন্যান্য কার্নেলগুলির মধ্যে থেকে ফাংশনগুলি কল করা যেতে পারে (সিইউডিএ গতিশীল সমান্তরালতা মডেল (ওরফে সিএনপি) এর অংশ হিসাবে) যখন __device__কলিং কার্নেলের মতো একই থ্রেডে চালিত হয়।


7

__global__ফাংশনটি কার্নেলের সংজ্ঞা। যখনই এটি সিপিইউ থেকে কল করা হয়, সেই কার্নেলটি জিপিইউতে চালু হয়।

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

সুতরাং, কার্নেলের থ্রেড থেকে একটি ডিভাইস ফাংশন কল করা হয় - এক থ্রেডের জন্য একটি উদাহরণ। যখন, সিপিইউ থ্রেড থেকে একটি বিশ্বব্যাপী ফাংশন কল করা হয়।


7

__global__ একটি CUDA সি কীওয়ার্ড (ঘোষণা নির্দিষ্টকরণকারী) যা ফাংশন বলে যে

  1. ডিভাইসে কার্যকর (জিপিইউ)
  2. হোস্ট (সিপিইউ) কোড থেকে কল।

হোস্ট কোড ব্যবহার করে গ্লোবাল ফাংশন (কার্নেল) চালু করা হয়েছে <<< no_of_blocks , no_of threads_per_block>>>। প্রতিটি থ্রেড তার অনন্য থ্রেড আইডি দ্বারা কার্নেল চালায়।

তবে, __device__হোস্ট কোড থেকে ফাংশনগুলি কল করা যাবে না if যদি আপনার এটি উভয়ই ব্যবহার করা দরকার __host__ __device__


2

গ্লোবাল ফাংশনটি কেবল হোস্টের কাছ থেকে কল করা যেতে পারে এবং তাদের কাছে রিটার্নের ধরণ নেই যদিও ডিভাইস ফাংশনটি কেবলমাত্র অন্য ডিভাইস ফাংশনের কার্নেল ফাংশন থেকে কল করা যেতে পারে তাই কার্নেল সেটিংসের প্রয়োজন নেই

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