"সিপিইউ বাউন্ড" এবং "আই / ও বাউন্ড" শব্দের অর্থ কী?


উত্তর:


452

এটি বেশ স্বজ্ঞাত:

একটি প্রোগ্রাম সিপিইউ বাউন্ড হয় যদি এটি সিপিইউ দ্রুততর হয় তবে এটি খুব বেশি সময় ব্যয় করে কেবলমাত্র সিপিইউ ব্যবহার করে (গণনা করে)। একটি প্রোগ্রাম যা new এর নতুন অঙ্কগুলির গণনা করে তা সাধারণত সিপিইউ-বাউন্ড হবে, এটি কেবল সংখ্যার ক্রাঞ্চিং।

একটি প্রোগ্রাম I / O সীমাবদ্ধ যদি এটি I / O সাবসিস্টেমটি দ্রুত হয় তবে তা দ্রুত চলে যায়। সঠিক আই / ও সিস্টেমটি বোঝাতে ভিন্ন ভিন্ন হতে পারে; আমি সাধারণত এটি ডিস্কের সাথে সংযুক্ত করি তবে অবশ্যই নেটওয়ার্কিং বা যোগাযোগ সাধারণভাবে সাধারণ। একটি প্রোগ্রাম যা কিছু ডেটার জন্য বিশাল ফাইলের সন্ধান করে তা আই / ও আবদ্ধ হয়ে যেতে পারে, যেহেতু বাধা হ'ল ডিস্ক থেকে ডেটা পড়া (আসলে, এই উদাহরণটি সম্ভবত আজকাল কয়েকশ এমবি / সেকেন্ডের সাথে পুরানো ধাঁচের is এসএসডি থেকে আসা)।


কীভাবে কোনও মোবাইল ডিভাইসে এইচটিটিপি যোগাযোগ বোঝার ক্ষেত্রে এটি যায়? আমি java.nio ক্রিয়াকলাপগুলি ব্যবহার করে সিপিইউ ব্যবহারের স্পাইক দেখেছি ।
ইগোরগানাপলস্কি

আই / ও হ'ল "ইনপুট / আউটপুট"।
কমরেড চে

246

সিপিইউ বাউন্ড মানে সিপিইউর গতিবেগের মাধ্যমে প্রক্রিয়াটি যে প্রগতিতে অগ্রসর হয় তার হার সীমাবদ্ধ। একটি টাস্ক যা সংখ্যার একটি ছোট সংখ্যায় গণনা সম্পাদন করে, উদাহরণস্বরূপ ছোট ম্যাট্রিককে গুণ করা, সম্ভবত সিপিইউ সীমাবদ্ধ।

আই / ও বাউন্ডের অর্থ একটি প্রক্রিয়াটি যে হারে অগ্রসর হয় I / O সাবসিস্টেমের গতি দ্বারা সীমাবদ্ধ। একটি কাজ যা ডিস্ক থেকে ডেটা প্রক্রিয়াকরণ করে, উদাহরণস্বরূপ, কোনও ফাইলের রেখার সংখ্যা গণনা I / O বাউন্ডড হতে পারে।

মেমোরি বাউন্ডের অর্থ একটি প্রক্রিয়া যে পরিমাণে অগ্রসর হয় তা উপলব্ধ পরিমাণ মেমরি এবং সেই মেমরি অ্যাক্সেসের গতি দ্বারা সীমাবদ্ধ থাকে। একটি টাস্ক যা মেমরির ডেটাতে প্রচুর পরিমাণে প্রক্রিয়া করে, উদাহরণস্বরূপ বড় ম্যাট্রিকগুলি গুণ করা, সম্ভবত মেমরি সীমা হতে পারে।

ক্যাশে আবদ্ধ হওয়ার অর্থ হ'ল হারে যেখানে কোনও প্রক্রিয়া অগ্রগতি ক্যাশের পরিমাণ এবং গতি দ্বারা সীমাবদ্ধ থাকে। একটি কাজ যা কেবল ক্যাশে ফিট করার চেয়ে বেশি ডেটা প্রক্রিয়া করে তা ক্যাশে আবদ্ধ হবে।

আই / ও বাউন্ড মেমোরি বাউন্ডের চেয়ে ধীর হবে ক্যাশে বাউন্ডের চেয়ে সিপিইউ বাউন্ডের চেয়ে ধীর হবে।

I / O সীমাবদ্ধ হওয়ার সমাধানটি আরও মেমরি পাওয়ার জন্য অগত্যা নয়। কিছু পরিস্থিতিতে অ্যাক্সেস অ্যালগরিদম I / O, মেমরি বা ক্যাশে সীমাবদ্ধতার আশেপাশে নকশা করা যেতে পারে। দেখুন ক্যাশে অন্যমনস্ক আলগোরিদিম


72

মাল্টি থ্রেডিং

এই উত্তরে আমি সিপিইউ বনাম আইও বাউন্ডেড কাজের মধ্যে পার্থক্য করার একটি গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে তদন্ত করব: মাল্টি-থ্রেডেড কোড লেখার সময়।

র‌্যাম I / O বাউন্ড উদাহরণ: ভেক্টর যোগফল

এমন একটি প্রোগ্রাম বিবেচনা করুন যা একক ভেক্টরের সমস্ত মানকে যোগ করে:

#define SIZE 1000000000
unsigned int is[SIZE];
unsigned int sum = 0;
size_t i = 0;
for (i = 0; i < SIZE; i++)
    /* Each one of those requires a RAM access! */
    sum += is[i]

আপনার প্রতিটি কোরের জন্য সমানভাবে অ্যারে বিভক্ত করার সাথে সমান্তরাল করে তোলা সাধারণ আধুনিক ডেস্কটপগুলিতে সীমিত উপযোগিতা।

উদাহরণস্বরূপ, আমার উবুন্টু 19.04-তে, সিপিইউ সহ লেনোভো থিংকপ্যাড পি 51 ল্যাপটপ: ইন্টেল কোর আই 7-7820HQ সিপিইউ (4 কোর / 8 থ্রেড), র‌্যাম: 2x স্যামসাং এম 471 এ 2 কে 43 বিবি 1-সিআরসি (2x 16 জিআইবি) আমি এর মতো ফলাফল পেয়েছি:

এখানে চিত্র বর্ণনা লিখুন

প্লট ডেটা

দ্রষ্টব্য যে তবে রানের মধ্যে অনেক বৈচিত্র রয়েছে। আমি ইতিমধ্যে 8 জিআইবিতে আছি বলে আমি অ্যারের আকারটি আরও বেশি বাড়িয়ে তুলতে পারি না, এবং আমি আজ একাধিক রানের পরিসংখ্যানের মুডে নেই। এটি অনেকগুলি ম্যানুয়াল রান করার পরেও একটি সাধারণ রানের মতো মনে হয়েছিল।

বেঞ্চমার্ক কোড:

আমি বক্ররেখাটির আকৃতিটি পুরোপুরি ব্যাখ্যা করার জন্য পর্যাপ্ত কম্পিউটার আর্কিটেকচার জানি না, তবে একটি জিনিস স্পষ্ট: আমার 8 টি থ্রেড ব্যবহার করার কারণে আমার কাছে অনায়াসে প্রত্যাশা করা হিসাবে গণনা 8x দ্রুত হয় না! কোনও কারণে, 2 এবং 3 টি থ্রেডই সর্বোত্তম ছিল এবং আরও যুক্ত করা বিষয়গুলিকে অনেক ধীর করে তোলে।

এটি সিপিইউ বাউন্ড কাজের সাথে তুলনা করুন যা আসলে 8 গুণ দ্রুত পায়: সময়ের আউটপুটে 'রিয়েল', 'ব্যবহারকারী' এবং 'সিজ' বলতে কী বোঝায়?

এটির কারণেই সমস্ত প্রসেসর একটি একক মেমোরি বাস র‌্যামের সাথে যুক্ত করে:

CPU 1   --\    Bus    +-----+
CPU 2   ---\__________| RAM |
...     ---/          +-----+
CPU N   --/

সুতরাং মেমোরি বাসটি দ্রুত সিপিইউ নয়, বাধা হয়ে দাঁড়ায়।

এটি ঘটে কারণ দুটি সংখ্যা যুক্ত করা একক সিপিইউ চক্র নেয়, মেমরির পাঠাগুলি 2016 হার্ডওয়্যারে প্রায় 100 সিপিইউ চক্র নেয়।

সুতরাং ইনপুট ডেটার বাইট অনুসারে করা সিপিইউ কাজটি খুব ছোট, এবং আমরা এটিকে আইও-বাউন্ড প্রক্রিয়া বলি।

সেই গণনার আরও গতি বাড়ানোর একমাত্র উপায় হ'ল নতুন মেমরি হার্ডওয়ারের সাথে পৃথক মেমরির অ্যাক্সেসগুলি গতিময় করা, যেমন মাল্টি-চ্যানেল মেমরি

উদাহরণস্বরূপ দ্রুত সিপিইউ ঘড়িতে আপগ্রেড করা খুব কার্যকর হবে না।

অন্যান্য উদাহরণ

  • ম্যাট্রিক্সের গুণটি র‌্যাম এবং জিপিইউতে সিপিইউ-আবদ্ধ। ইনপুটটিতে রয়েছে:

    2 * N**2
    

    সংখ্যা, কিন্তু:

    N ** 3
    

    গুণগুলি সম্পন্ন হয়, এবং এটি ব্যবহারিক বৃহত এন এর পক্ষে সমান্তরালতার পক্ষে যথেষ্ট is

    এই কারণেই নীচের মতো সমান্তরাল সিপিইউ ম্যাট্রিক্স গুণিত লাইব্রেরি বিদ্যমান:

    ক্যাশে ব্যবহার বাস্তবায়নের গতিতে একটি বড় পার্থক্য করে। উদাহরণস্বরূপ দেখুন এই প্রাসঙ্গিক জিপিইউ তুলনা উদাহরণ

    আরো দেখুন:

  • নেটওয়ার্কিং হ'ল প্রোটোটাইপিকাল আইও-বাউন্ড উদাহরণ।

    এমনকি যখন আমরা একক বাইট ডেটা প্রেরণ করি, তবুও এটির গন্তব্যে পৌঁছাতে বড় সময় লাগে।

    ছোট নেটওয়ার্ক অনুরোধগুলির সমান্তরালকরণ যেমন এইচটিটিপি অনুরোধগুলি একটি বিশাল পারফরম্যান্স লাভের প্রস্তাব দিতে পারে।

    যদি নেটওয়ার্কটি ইতিমধ্যে সম্পূর্ণ সক্ষমতায় রয়েছে (যেমন টরেন্ট ডাউনলোড করা) তবে প্যারালালাইজেশন বিলম্বিত উন্নতি বাড়িয়ে তুলতে পারে (যেমন আপনি "একই সময়ে" একটি ওয়েব পৃষ্ঠা লোড করতে পারেন)।

  • একটি ডামি সি ++ সিপিইউ বাউন্ড অপারেশন যা একটি নম্বর নেয় এবং এটি অনেকটা সঙ্কুচিত করে:

  • বাছাই করা নিম্নলিখিত পরীক্ষার উপর ভিত্তি করে সিপিইউ হিসাবে উপস্থিত হয়: সি ++ 17 সমান্তরাল অ্যালগরিদমগুলি ইতিমধ্যে কার্যকর করা হয়েছে? যা সমান্তরাল বাছাইয়ের জন্য 4x পারফরম্যান্সের উন্নতি দেখিয়েছে, তবে আমি আরও তাত্ত্বিক নিশ্চিতকরণও চাই

আপনি সিপিইউ বা আইও আবদ্ধ কিনা তা কীভাবে সন্ধান করবেন

ডিস্ক, নেটওয়ার্কের মতো নন-র‌্যাম আইও আবদ্ধ থাকে ps aux, তবে যদি চেক হয় CPU% / 100 < n threads। যদি হ্যাঁ, আপনি আইও আবদ্ধ, উদাহরণস্বরূপ ব্লক করা readএস কেবলমাত্র ডেটার জন্য অপেক্ষা করছেন এবং শিডিয়ুলার সেই প্রক্রিয়াটি বাদ দিচ্ছেন। তারপরে আরও সরঞ্জাম ব্যবহার করুন sudo iotopঠিক কোন আইওটি সমস্যাটি ঠিক তা ঠিক করতে চান।

অথবা, যদি এক্সিকিউশনটি দ্রুত হয় এবং আপনি থ্রেডের সংখ্যাটিকে প্যারাম্যাট্রাইজ করেন তবে timeসিপিইউ বাউন্ড কাজের জন্য থ্রেডের সংখ্যা বাড়ার সাথে আপনি এই পারফরম্যান্স থেকে সহজেই দেখতে পাবেন : 'রিয়েল', 'ইউজার' এবং 'সিজ' এর অর্থ কী? সময়ের আউটপুট (1)?

র‌্যাম-আইও আবদ্ধ: বলা শক্ত, র‌্যাম অপেক্ষা সময়ের হিসাবে এটি CPU%পরিমাপের অন্তর্ভুক্ত রয়েছে , এটিও দেখুন:

কিছু বিকল্প:

  • ইন্টেল অ্যাডভাইজার ছাদলাইন (নিখরচায়): https://software.intel.com/en-us/articles/intel-advisor-roofline ( সংরক্ষণাগার ) "একটি ছাদ লাইন চার্ট হার্ডওয়্যার সীমাবদ্ধতার ক্ষেত্রে অ্যাপ্লিকেশন কর্মক্ষমতা একটি দৃশ্য উপস্থাপনা, মেমরি ব্যান্ডউইথ এবং গণ্য পিক সহ "

জিপিইউ

আপনি প্রথমে নিয়মিত সিপিইউ পঠনযোগ্য র‌্যাম থেকে জিপিইউতে ইনপুট ডেটা স্থানান্তর করার সময় জিপিইউগুলির একটি আইও বাধা রয়েছে।

অতএব, জিপিইউগুলি কেবল সিপিইউযুক্ত অ্যাপ্লিকেশনগুলির জন্য সিপিইউর চেয়ে ভাল হতে পারে।

তবে একবার জিপিইউতে ডেটা স্থানান্তরিত হয়ে গেলে, এটি সিপিইউর তুলনায় সেই বাইটগুলিতে দ্রুত পরিচালনা করতে পারে, কারণ জিপিইউ:

  • বেশিরভাগ সিপিইউ সিস্টেমের চেয়ে বেশি ডেটা লোকালাইজেশন রয়েছে এবং তাই অন্যের চেয়ে কিছু কোরের জন্য ডেটা দ্রুত অ্যাক্সেস করা যায়

  • তাত্ক্ষণিকভাবে চালিত হওয়ার জন্য প্রস্তুত নয় এমন কোনও ডেটা বাদ দিয়ে ডেটা প্যারালালিজম এবং ত্যাগের বিলম্বকে কাজে লাগায়।

    যেহেতু জিপিইউকে বৃহত সমান্তরাল ইনপুট ডেটাতে পরিচালনা করতে হবে, কেবলমাত্র পরবর্তী তথ্যগুলি ছেড়ে যাওয়া ভাল যে বর্তমান তথ্যটি আসার অপেক্ষা রাখার পরিবর্তে উপলব্ধ হতে পারে এবং সিপিইউর মতো অন্যান্য সমস্ত ক্রিয়াকলাপ অবরুদ্ধ করে দেয় block

সুতরাং আপনার অ্যাপ্লিকেশন যদি জিপিইউ দ্রুততর হয় তবে সিপিইউ হতে পারে:

  • অত্যন্ত সমান্তরাল হতে পারে: একই সাথে একই সাথে একে অপরের থেকে পৃথকভাবে চিকিত্সা করা যেতে পারে
  • প্রতি ইনপুট বাইটে প্রচুর পরিমাণে ক্রিয়াকলাপ প্রয়োজন (উদাহরণস্বরূপ ভেক্টর সংযোজন নয় যা কেবল প্রতি বাইটে একটি সংযোজন করে)
  • এখানে প্রচুর সংখ্যক ইনপুট বাইট রয়েছে

এই নকশাগুলির পছন্দগুলি মূলত থ্রিডি রেন্ডারিংয়ের প্রয়োগকে লক্ষ্যযুক্ত করে, যার মূল পদক্ষেপগুলি ওপেনগিএলে শেডারগুলি কীভাবে দেখানো হয়েছে এবং সেগুলির জন্য আমাদের কী দরকার?

  • ভার্টেক্স শ্যাডার: 4x4 ম্যাট্রিক্স দ্বারা 1x4 ভেক্টরগুলির একটি গুচ্ছকে গুণ করা হচ্ছে
  • খণ্ড শেডার: ত্রিভুজের সাথে সম্পর্কিত তার অবস্থানের উপর ভিত্তি করে একটি ত্রিভুজের প্রতিটি পিক্সেলের রঙ গণনা করুন

এবং তাই আমরা উপসংহারে পৌঁছেছি যে এই অ্যাপ্লিকেশনগুলি সিপিইউ-আবদ্ধ।

প্রোগ্রামেবল জিপিজিপিইউয়ের আগমনের সাথে সাথে আমরা বেশ কয়েকটি জিপিজিপিইউ অ্যাপ্লিকেশন পর্যবেক্ষণ করতে পারি যা সিপিইউ বাউন্ড অপারেশনের উদাহরণ হিসাবে কাজ করে:

আরো দেখুন:

সিপথন গ্লোবাল ইন্টারপ্রেটার লক (জিআইএল)

দ্রুত কেস স্টাডি হিসাবে, আমি পাইথন গ্লোবাল ইন্টারপ্রেটার লক (জিআইএল) এর দিকে ইঙ্গিত করতে চাই: সিপিথনে গ্লোবাল ইন্টারপ্রেটার লক (জিআইএল) কী?

এই সিপথন বাস্তবায়ন বিশদটি একাধিক পাইথন থ্রেডগুলি দক্ষতার সাথে সিপিইউ-আবদ্ধ কাজের ব্যবহার থেকে বাধা দেয়। CPython ডক্স বলে,

সিপিথন বাস্তবায়নের বিশদ: সিপিথনে, গ্লোবাল ইন্টারপ্রেটার লকের কারণে, কেবলমাত্র একটি থ্রেড পাইথন কোড একবারে কার্যকর করতে পারে (যদিও কিছু নির্দিষ্ট কর্মক্ষমতা-ভিত্তিক গ্রন্থাগারগুলি এই সীমাবদ্ধতাটি অতিক্রম করতে পারে)। আপনি যদি নিজের অ্যাপ্লিকেশনটি মাল্টি-কোর মেশিনগুলির গণ্য সংস্থানগুলির আরও ভাল ব্যবহার করতে চান তবে আপনাকে multiprocessingবা ব্যবহার করার পরামর্শ দেওয়া হচ্ছে concurrent.futures.ProcessPoolExecutor। তবে আপনি যদি একসাথে একাধিক আই / ও-বাউন্ড কার্য চালাতে চান তবে থ্রেডিং এখনও উপযুক্ত মডেল।

অতএব, এখানে আমাদের সিপিইউ-বাউন্ড সামগ্রী উপযুক্ত নয় এবং আমি / হে বাউন্ড একটি উদাহরণ আছে।


1
ম্যান, আপনি কীভাবে এত দক্ষ হতে এবং এই জাতীয় একটি লেখার ব্যবস্থা করেন?
মিকায়েল আবদুললেভ

1
@ মিকায়েলএবদুল্লাইভ ধন্যবাদ! আমি কেবল "গুরুত্বপূর্ণ প্রশ্নগুলির" জবাব দেই এবং আমি নতুন প্রাসঙ্গিক জিনিসগুলি শিখার সাথে সাথে আমি তাদের কাছে ফিরে আসার প্রবণতা রাখি।
সিরো সান্তিলি 法轮功 冠状 病 六四 事件 法轮功

2
এটি আরও upvotes প্রাপ্য

31

সিপিইউ বাউন্ড মানে প্রোগ্রামটি সিপিইউ বা সেন্ট্রাল প্রসেসিং ইউনিট দ্বারা বাধা হয়, যখন আই / ও বাউন্ড মানে প্রোগ্রামটি আই / ও, বা ইনপুট / আউটপুট যেমন ডিস্কে পড়া বা লিখন ইত্যাদিতে লেখা বা আটকানো bottle

সাধারণভাবে, কম্পিউটার প্রোগ্রামগুলি অনুকূলকরণ করার সময়, কেউ বাধাটি খুঁজে বের করার চেষ্টা করে এবং এটি নির্মূল করে। আপনার প্রোগ্রামটি সিপিইউ বাউন্ডড তা জেনে সাহায্য করে, যাতে অপ্রয়োজনীয়ভাবে অন্য কিছুকে অনুকূলিত করা যায় না।

[এবং "বাধা" দ্বারা, আমি বলতে চাইছি যা আপনার প্রোগ্রামটিকে অন্যথায় যা করা হবে তার চেয়ে ধীর করে দেয়]]


21

একই ধারণাটি বাক্যাংশের আরেকটি উপায়:

  • যদি সিপিইউতে গতি বাড়ানো আপনার প্রোগ্রামকে গতি দেয় না, তবে এটি I / O সীমাবদ্ধ হতে পারে ।

  • যদি I / O (যেমন একটি দ্রুত ডিস্ক ব্যবহার করে) গতি বাড়িয়ে দেয় তবে আপনার প্রোগ্রামটি সিপিইউ আবদ্ধ হতে পারে।

(আমি "হতে পারে" ব্যবহার করেছি কারণ আপনার অন্যান্য সংস্থানগুলি আমলে নেওয়া দরকার Mem স্মৃতি একটি উদাহরণ)


11

যখন আপনার প্রোগ্রামটি I / O (যেমন একটি ডিস্ক রিড / রাইট বা নেটওয়ার্ক রিড / রাইটিং ইত্যাদি) এর জন্য অপেক্ষা করছে, আপনার প্রোগ্রামটি বন্ধ হয়ে গেলেও সিপিইউ অন্যান্য কাজগুলি করতে নিখরচায়। আপনার প্রোগ্রামটির গতি বেশিরভাগের উপর নির্ভর করবে যে কত দ্রুত আইও ঘটতে পারে, এবং আপনি যদি এটির গতি বাড়িয়ে নিতে চান তবে আপনাকে I / O গতি বাড়িয়ে তুলতে হবে।

যদি আপনার প্রোগ্রামটি প্রচুর প্রোগ্রামের নির্দেশাবলী চালিয়ে চলেছে এবং I / O এর জন্য অপেক্ষা না করছে, তবে এটি সিপিইউ বাউন্ডড বলে। সিপিইউতে গতি বাড়ানো প্রোগ্রামটি আরও দ্রুত চালিত করবে।

উভয় ক্ষেত্রেই, প্রোগ্রামটি দ্রুত করার মূল চাবিকাঠিটি হার্ডওয়ারকে গতিময় করা নাও হতে পারে, তবে প্রয়োজনীয় আইও বা সিপিইউর পরিমাণ হ্রাস করার জন্য প্রোগ্রামটি অনুকূলকরণ করা উচিত, বা এটি সিপিইউ নিবিড়ভাবে করার সময় I / O করারও প্রয়োজন জিনিসপত্র.


6

আই / ও বাউন্ড এমন শর্তটিকে বোঝায় যেখানে গণনা শেষ হতে সময় লাগে মূলত ইনপুট / আউটপুট ক্রিয়াকলাপের জন্য অপেক্ষা করার সময় ব্যয় করে নির্ধারিত হয়।

এটি কোনও কাজের সিপিইউ বাউন্ডের বিপরীত। এই পরিস্থিতি তখনই দেখা দেয় যখন যে হারে ডেটা অনুরোধ করা হয় তা হারানো হারের চেয়ে ধীর হয় বা অন্য কথায়, তথ্য প্রক্রিয়াকরণের চেয়ে বেশি সময় ব্যয় করা হয়।


6

আইও আবদ্ধ প্রক্রিয়া: গণনা তুলনায় আইও করতে বেশি সময় ব্যয় করে, অনেকগুলি সংক্ষিপ্ত সিপিইউ বিস্ফোরিত হয়। সিপিইউবেড প্রক্রিয়া: গণনা করতে বেশি সময় ব্যয় করুন, খুব কম দীর্ঘ সিপিইউ ফেটে গেছে


2

মাইক্রোসফ্ট কি বলে দেখুন।

অ্যাসিঙ্ক প্রোগ্রামিংয়ের মূল হ'ল টাস্ক এবং টাস্ক অবজেক্টস, যা অ্যাসিঙ্ক্রোনাস অপারেশনকে মডেল করে। তারা async দ্বারা সমর্থিত এবং কীওয়ার্ডের জন্য অপেক্ষা করে। বেশিরভাগ ক্ষেত্রে মডেলটি মোটামুটি সহজ:

  • আই / ও-বাউন্ড কোডের জন্য, আপনি এমন একটি অপারেশনের জন্য অপেক্ষা করছেন যা কোনও অ্যাসিঙ্ক পদ্ধতির অভ্যন্তরে কোনও কার্য বা কার্য দেয় returns

  • সিপিইউ-বাউন্ড কোডের জন্য, আপনি একটি অপারেশনের জন্য অপেক্ষা করছেন যা একটি কার্যপ্রণালী.রুন পদ্ধতিতে একটি পটভূমি থ্রেডে শুরু হয়েছিল।

অপেক্ষার কীওয়ার্ডটি যেখানে যাদুটি ঘটে। এটি অপেক্ষা করায় এমন পদ্ধতিটির কলারের কাছে নিয়ন্ত্রণ দেয়, এবং এটি শেষ পর্যন্ত কোনও ইউআইকে প্রতিক্রিয়াশীল বা কোনও পরিষেবাকে স্থিতিস্থাপক হতে দেয়।

আই / ও-বাউন্ড উদাহরণ: একটি ওয়েব পরিষেবা থেকে ডেটা ডাউনলোড করা

private readonly HttpClient _httpClient = new HttpClient();

downloadButton.Clicked += async (o, e) =>
{
    // This line will yield control to the UI as the request
    // from the web service is happening.
    //
    // The UI thread is now free to perform other work.
    var stringData = await _httpClient.GetStringAsync(URL);
    DoSomethingWithData(stringData);
};

সিপিইউ-বাউন্ড উদাহরণ: একটি গেমের জন্য গণনা সম্পাদন করা

private DamageResult CalculateDamageDone()
{
    // Code omitted:
    //
    // Does an expensive calculation and returns
    // the result of that calculation.
}

calculateButton.Clicked += async (o, e) =>
{
    // This line will yield control to the UI while CalculateDamageDone()
    // performs its work.  The UI thread is free to perform other work.
    var damageResult = await Task.Run(() => CalculateDamageDone());
    DisplayDamage(damageResult);
};

উপরের উদাহরণগুলি দেখিয়েছে যে কীভাবে আপনি async ব্যবহার করতে পারেন এবং I / O- বাউন্ড এবং সিপিইউ-বাউন্ড কাজের জন্য অপেক্ষা করতে পারেন। এটি কী যেটি আপনি যখন চিহ্নিত করতে পারবেন তা যখন আপনি / আই-বাউন্ড বা সিপিইউ-বাউন্ড করা প্রয়োজন তখন এটি সনাক্ত করতে পারবেন কারণ এটি আপনার কোডের কার্যকারিতাকে ব্যাপকভাবে প্রভাবিত করতে পারে এবং কিছু নির্দিষ্ট নির্মাণের অপব্যবহারের সম্ভাব্য কারণ হতে পারে।

কোনও কোড লেখার আগে আপনার দুটি প্রশ্ন জিজ্ঞাসা করা উচিত:

আপনার কোড কি কোনও ডাটাবেসের ডেটার মতো কোনও কিছুর জন্য "অপেক্ষা" করবে?

  • যদি আপনার উত্তরটি "হ্যাঁ" হয় তবে আপনার কাজটি I / O- সীমাবদ্ধ।

আপনার কোডটি কি খুব ব্যয়বহুল গণনা সম্পাদন করবে?

  • আপনি যদি "হ্যাঁ" উত্তর দিয়ে থাকেন তবে আপনার কাজটি সিপিইউ-আবদ্ধ।

কাজ আপনি ইনপুট / আউটপুট-বাউন্ড, ব্যবহার ASYNC এবং অপেক্ষা থাকে তবে ছাড়া Task.Run । আপনার টাস্ক সমান্তরাল গ্রন্থাগার ব্যবহার করা উচিত নয়। এর কারণটি গভীরতা নিবন্ধে অ্যাসিঙ্কে বর্ণিত হয়েছে ।

যদি আপনার কাছে কাজটি সিপিইউ-বাউন্ড হয় এবং আপনি প্রতিক্রিয়াশীলতার বিষয়ে যত্নশীল হন, অ্যাসিঙ্কটি ব্যবহার করুন এবং অপেক্ষা করুন তবে টাস্ক.রুনের সাথে অন্য থ্রেডে কাজটি বন্ধ করে দিন। যদি কাজটি সমঝোতা এবং সমান্তরালতার জন্য উপযুক্ত হয় তবে আপনার কার্য টানা সমান্তরাল গ্রন্থাগারটিও বিবেচনা করা উচিত ।


2

এক্সিকিউশন চলাকালীন পাটিগণিত / লজিকাল / ফ্লোটিং পয়েন্ট (এ / এল / এফপি) কর্মক্ষমতা বেশিরভাগ প্রসেসরের তাত্ত্বিক শিখর-পারফরম্যান্সের নিকটে থাকে (নির্মাতার দ্বারা সরবরাহিত ডেটা এবং এর বৈশিষ্ট্যগুলি দ্বারা নির্ধারিত ডেটা প্রসেসর: কোরের সংখ্যা, ফ্রিকোয়েন্সি, রেজিস্টার, এএলইউ, এফপিইউ, ইত্যাদি)।

অসম্ভব বলে না বলে বাস্তবের অ্যাপ্লিকেশনগুলিতে পিকের অভিনয় অর্জন করা খুব কঠিন। বেশিরভাগ অ্যাপ্লিকেশনগুলি এক্সিকিউশনের বিভিন্ন অংশে মেমরি অ্যাক্সেস করে এবং প্রসেসর বিভিন্ন চক্র চলাকালীন A / L / FP অপারেশন করে না। স্মৃতি এবং প্রসেসরের মধ্যবর্তী দূরত্বের কারণে একে ভন নিউম্যান সীমাবদ্ধতা বলা হয় ।

আপনি যদি সিপিইউ শিখর-পারফরম্যান্সের কাছাকাছি থাকতে চান তবে একটি কৌশল হ'ল মূল স্মৃতি থেকে ডেটা প্রয়োজন না এড়ানোর জন্য ক্যাশে মেমরির বেশিরভাগ ডেটা পুনরায় ব্যবহার করার চেষ্টা করা যেতে পারে। একটি অ্যালগরিদম যা এই বৈশিষ্ট্যটি ব্যবহার করে তা হ'ল ম্যাট্রিক্স-ম্যাট্রিক্স গুণন (যদি উভয় ম্যাট্রিক্স ক্যাশে স্মৃতিতে সঞ্চয় করা যায়)। এটি ঘটে কারণ ম্যাট্রিকগুলি যদি আকারের হয় n x nতবে 2 n^3কেবলমাত্র 2 n^2FP সংখ্যক ডেটা ব্যবহার করে আপনাকে অপারেশন করতে হবে । অন্যদিকে ম্যাট্রিক্স সংযোজন, উদাহরণস্বরূপ, ম্যাট্রিক্স গুণনের চেয়ে কম সিপিইউ-বাউন্ড বা একটি বেশি মেমরি-সীমাবদ্ধ অ্যাপ্লিকেশন কারণ এটি n^2একই ডেটা সহ কেবলমাত্র এফএলওপি প্রয়োজন ।

নিম্নলিখিত চিত্রটিতে ম্যাট্রিক্স সংযোজন এবং একটি ইন্টেল i5-9300H এ ম্যাট্রিক্সের গুণনের জন্য একটি নিষ্পাপ আলগোরিদিম সহ প্রাপ্ত এফএলওপিগুলি দেখানো হয়েছে:

ম্যাট্রিক্স সংযোজন এবং ম্যাট্রিক্স গুণণের মধ্যে FLOPs তুলনা

নোট করুন যে ম্যাট্রিক্স সংযোজনের চেয়ে ম্যাট্রিক্স গুণনের কর্মক্ষমতা প্রত্যাশিত হিসাবে। এই ফলাফলগুলি চালনা করে test/gemmএবং পুনরায় সংগ্রহস্থলেtest/matadd উপলব্ধ দ্বারা পুনরুত্পাদন করা যেতে পারে ।

আমি এই প্রভাব সম্পর্কে জে ডোঙ্গারার দেওয়া ভিডিওটি দেখতেও পরামর্শ দিই ।


1

আই / ও বাউন্ড প্রক্রিয়া: - যদি কোনও প্রক্রিয়াটির আজীবন বেশিরভাগ অংশ i / o রাজ্যে ব্যয় করা হয় তবে প্রক্রিয়াটি আইআই / ও বাউন্ড প্রক্রিয়া হয় ample উদাহরণ: -ক্যালকুলেটর, ইন্টারনেট এক্সপ্লোরার

সিপিইউ বাউন্ড প্রক্রিয়া: - প্রক্রিয়া জীবনের বেশিরভাগ অংশ যদি সিপিইউতে ব্যয় করে তবে এটি সিপিইউ বাউন্ড প্রক্রিয়া।


8
ক্যালকুলেটরটি কীভাবে আইও বাউন্ড প্রক্রিয়া হবে? অবশ্যই এটি সিপিইউ আবদ্ধ হবে। যদি আপনার ক্যালকুলেটরটি নেটওয়ার্ক বা ডিস্ক অ্যাক্সেসের মাধ্যমে অবরুদ্ধ সময়ের বেশিরভাগ সময় ব্যয় করে তবে আমি প্রস্তাব দিচ্ছি যে এটিতে কোনও সমস্যা আছে।
রিকার্ভ

6
আমি ভেবেছিলাম ক্যালকুলেটর উদাহরণটি পরিষ্কার ছিল: বেশিরভাগ সময় ব্যবহারকারী তার বোতাম টিপানোর জন্য অপেক্ষা করে, এইভাবে I / O এর জন্য অপেক্ষা করে।
পিএসপি

1
@ পিএসপি ঠিক আছে তবে ক্যালকুলেটর উদাহরণটি আইও আবদ্ধ হিসাবে এর নাম হিসাবে দেখা শক্তিশালী এখনও শক্ত, "ক্যালকুলেটর।" এর থেকে বোঝা যায় যে প্রোগ্রামটির মূল উদ্দেশ্যটি দীর্ঘ সিপিইউ গণনা করা, তবে আপনি যদি আপনার ডেস্কটপে আপনার ক্যালকুলেটরটি দেখেন তবে এটি খুব সাধারণ একটি যা কেবল গণনা করে যা সম্পূর্ণ করতে ন্যানোসেকেন্ডগুলি লাগে। সুতরাং বেশিরভাগ সময় এটি ব্যবহারকারী ইনপুটটির জন্য অপেক্ষা করে যা আইও।
ক্যালিকোডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.