দ্রুত প্রসেসর / ঘড়ি আরও কোড চালায়?


9

আমি এটিএমগা 328 তে চালানোর জন্য একটি প্রোগ্রাম লিখছি যা 16 মেগাহার্টজ (এটির একটি আরডুইনো ডাইমিলানোভ যদি আপনি তাদের জানেন তবে এটি একটি এভিআর চিপ) at

আমার প্রতি 100 মাইক্রোসেকেন্ডে একটি বাধা প্রক্রিয়া চলছে। এটি অসম্ভব, আমি বলব, 100 টি মাইক্রোসেকেন্ডের একটি লুপে আপনি কত "কোড" প্রয়োগ করতে পারেন তা নির্ধারণ করার জন্য (আমি সিতে লিখছি যা সম্ভবত বিধানসভায় রূপান্তরিত হয় তখন একটি বাইনারি চিত্রে?)

এছাড়াও এটি কোডের জটিলতার উপর নির্ভর করবে (উদাহরণস্বরূপ কয়েকটি ছোট লাইনগুলির তুলনায় একটি দৈত্য ওয়ান লাইনার ধীর হতে পারে)।

আমার বোঝাটি কি সঠিক, যেটিতে আমার প্রসেসরের একটি ক্লক রেট বা ১M মেগাহার্টজ প্রতি সেকেন্ডে ১ millions মিলিয়ন চক্র সম্পাদন করে (এর অর্থ মাইক্রোসেকেন্ডে 16,000,000 / 1,000 / 1,000 প্রতি 16 চক্র); এবং তাই, আমি যদি আমার 100 মাইক্রোসেকেন্ড লুপটিতে আরও কিছু করতে চাই, 72 মেগাহার্জ সংস্করণের মতো দ্রুত মডেল কেনা আমাকে মাইক্রোসেকেন্ডে 72 চক্র (72,000,000 / 1,000 / 1,000) দেবে?

বর্তমানে এটি কিছুটা ধীর গতিতে চলেছে, অর্থাৎ লুপটি করতে 100 টি মাইক্রোসেকেন্ডের তুলনায় কিছুটা বেশি সময় লাগবে (ঠিক কতক্ষণ বলা খুব শক্ত, তবে এটি ধীরে ধীরে পিছিয়ে পড়ে) এবং আমি এটি আরও কিছু করাতে চাই, এটি একটি বুদ্ধিমান পদ্ধতির দ্রুত চিপ পেয়েছে বা আমি পাগল হয়েছি?


.... একটি এটিমেগ 328 একটি আর্ম চিপ নয়। এটি একটি এভিআর।
ভিসাতচু

চিয়ার্স, সংশোধন!
jwbensley

উত্তর:


9

সাধারণভাবে ডিভাইসটি প্রতি সেকেন্ডে কার্যকর করতে পারে এমন সমাবেশ নির্দেশনাগুলি নির্দেশনা মিশ্রণের উপর নির্ভর করে এবং প্রতিটি নির্দেশের ধরণটি কতগুলি চক্র কার্যকর করতে (সিপিআই) লাগে takes আপনি তাত্ত্বিকভাবে আপনার কোড কোডটি বিচ্ছিন্ন করা asm ফাইলটি দেখে এবং যে ফাংশনটি সম্পর্কে আপনি উদ্বিগ্ন তা দেখে, এতে সমস্ত বিভিন্ন ধরণের নির্দেশনা গণনা করে এবং আপনার টার্গেট প্রসেসরের জন্য ডেটাশিট থেকে চক্র গণনা করে আপনার কোড গণনা করতে পারেন।

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

ব্যবহারিক বিষয় হিসাবে, একটি এভিআরের মতো সাধারণ ডিভাইসের জন্য, আমার উত্তরটি কম-বেশি "হ্যাঁ" হবে। আপনার ঘড়ির গতি দ্বিগুণ করা কোনও প্রদত্ত ফাংশনের মৃত্যুর সময় অর্ধেক হওয়া উচিত। একটি এভিআরের জন্য, তবে এগুলি 20MHz এর চেয়ে দ্রুত চলবে না, সুতরাং আপনি কেবল নিজের আরডুইনোকে অন্য 4MHz দ্বারা "ওভারক্লাক" করতে পারবেন could

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


হাই, আপনার তথ্যবহুল উত্তরের জন্য ধন্যবাদ! আমি এর মধ্যে একটি ( কুলকম্পোন্ট.ও.কম / ক্যাটালগ / প্রোডাক্ট_ইনফো.ফ্প? প্রোডাক্টস_আইডি=808 ) দেখেছি , আপনি বলেছিলেন যে একটি এভিআর 20 মেগাহার্জের চেয়ে দ্রুত যেতে পারে না, তা কেন? উপরের বোর্ডের চিপ ( uk.farnell.com/stmicroelectronics/stm32f103rbt6/… ) একটি 72 মেগাহার্টজ এআরএম, আমি কি উপরে বর্ণিত পদ্ধতিতে এ থেকে যুক্তিসঙ্গত পারফরম্যান্স বৃদ্ধি আশা করতে পারি?
jwbensley

2
প্রক্রিয়াটির গতি দ্বিগুণ করা আপনার নির্দেশের মধ্য দিয়ে আউটপুট না বাড়িয়ে দিতে পারে কারণ আপনি যে গতিতে ফ্ল্যাশ থেকে নির্দেশনা আনতে পারবেন তার গতি ছাড়িয়ে যেতে শুরু করতে পারেন। এই মুহুর্তে আপনি "ফ্ল্যাশ ওয়েট স্টেটস" মারতে শুরু করেন যেখানে ফ্ল্যাশ থেকে নির্দেশের আগমনের জন্য অপেক্ষা করার সময় সিপিইউ বিরতি দেয়। কিছু মাইক্রোকন্ট্রোলাররা আপনাকে র‌্যাম থেকে কোড এক্সিকিউট করার অনুমতি দেয় যা এফএএলএসএইচ থেকে অনেক দ্রুত।
মাজনকো

@ মাজেঙ্কো: মজার, আমরা দুজন একই সাথে একই পয়েন্ট তৈরি করেছি।
জেসন এস

এটি ঘটে ... আপনার চেয়ে আমার চেয়ে ভাল :)
মাজনকো

1
ঠিক আছে, আমি ভিকাটকুর উত্তরটিকে "উত্তর" হিসাবে চিহ্নিত করেছি। পারফরম্যান্সের সাথে সম্পর্কিত আমার মূল গতির ক্ষেত্রে এটি সবচেয়ে উপযুক্ত ছিল বলে আমি মনে করি যদিও সমস্ত উত্তর দুর্দান্ত এবং আমি প্রত্যেকের উত্তর দিয়ে সত্যই উত্তেজিত। তারা আমাকে দেখিয়েছে যে এটি আমি প্রথমে উপলব্ধি করার চেয়ে একটি বিস্তৃত বিষয়, এবং তাই তারা সবাই আমাকে প্রচুর শিক্ষা দিচ্ছে এবং আমাকে গবেষণার জন্য প্রচুর পরিমাণে দিচ্ছে, তাই সবার ধন্যবাদ: D
jwbensley

8

@ ভিস্যাটাকুর উত্তরটি বেশ বিস্তৃত। একটি অতিরিক্ত বিষয় লক্ষণীয় হ'ল প্রোগ্রাম এবং ডেটা মেমরি সহ আই / ও অ্যাক্সেস করার সময় সিপিইউ ওয়েট স্টেটগুলিতে (স্থবির সিপিইউ চক্র) চলতে পারে ।

উদাহরণস্বরূপ, আমরা একটি টিআই F28335 ডিএসপি ব্যবহার করছি; র‌্যামের কিছু অঞ্চল প্রোগ্রাম এবং ডেটা মেমরির জন্য 0-অপেক্ষার স্থিতি থাকে, সুতরাং আপনি যখন র‌্যামে কোড চালাবেন, তখন এটি প্রতি নির্দেশ 1 টি চক্রের সাথে চালিত হয় (সেই নির্দেশিকাগুলি যা 1 টির বেশি চক্র গ্রহণ করে except আপনি যখন FLASH মেমরি থেকে কোড নির্বাহ করেন (অন্তর্নির্মিত EEPROM, আরও কম), তবে, এটি পুরো 150MHz এ চালাতে পারে না এবং এটি বেশ কয়েকগুণ ধীর হয়।


উচ্চ-গতির বিঘ্নিত কোডের প্রতি সম্মান সহ, আপনাকে অবশ্যই বেশ কয়েকটি জিনিস শিখতে হবে।

প্রথমত, আপনার সংকলকটির সাথে খুব পরিচিত হন। যদি সংকলকটি একটি ভাল কাজ করে তবে বেশিরভাগ জিনিসের জন্য এটি হ্যান্ড-কোডেড অ্যাসেমব্লির চেয়ে ধীর হওয়া উচিত নয়। (যেখানে "এত ধীর গতিতে": আমার দ্বারা 2 এর একটি ফ্যাক্টর ঠিক হয়ে যাবে; 10 এর একটি ফ্যাক্টর গ্রহণযোগ্য হবে না) আপনাকে কীভাবে (এবং কখন) সংকলক অপ্টিমাইজেশন পতাকা ব্যবহার করতে হবে তা শিখতে হবে এবং একবারে একবারে আপনাকে দেখতে হবে এটি কীভাবে হয় তা দেখতে কম্পাইলারের আউটপুট এ।

স্পিডআপ কোডের জন্য আপনার সংকলকটি করতে পারেন এমন আরও কিছু জিনিস:

  • ইনলাইন ফাংশনগুলি ব্যবহার করুন (সি এটি সমর্থন করে কিনা তা মনে করতে পারে না বা এটি কেবলমাত্র একটি সি ++ - আইএসএম) উভয়ই ছোট ফাংশনের জন্য এবং কেবল একবার বা দু'বার কার্যকর করা হবে এমন ফাংশনগুলির জন্য। ডাউনসাইড হ'ল ইনলাইন ফাংশনগুলি ডিবাগ করা শক্ত, বিশেষত যদি সংকলক অপ্টিমাইজেশন চালু থাকে। তবে তারা আপনাকে অপ্রয়োজনীয় কল / রিটার্ন সিকোয়েন্সগুলি সংরক্ষণ করে, বিশেষত যদি "ফাংশন" বিমূর্ততা কোড প্রয়োগের পরিবর্তে ধারণাগত ডিজাইনের উদ্দেশ্যে হয়।

  • এটির অভ্যন্তরীণ ফাংশন রয়েছে কিনা তা দেখতে আপনার সংকলকের ম্যানুয়ালটি দেখুন - এটি সংকলক-নির্ভর অন্তর্নির্মিত ফাংশন যা প্রসেসরের সমাবেশ নির্দেশিকায় সরাসরি ম্যাপ করে; কিছু প্রসেসরের সমাবেশ সংক্রান্ত নির্দেশনা রয়েছে যা দরকারী জিনিসগুলি যেমন ন্যূনতম / সর্বোচ্চ / বিট বিপরীত করে এবং আপনি এটি করে সময় সাশ্রয় করতে পারেন।

  • আপনি যদি সংখ্যার গণনা করছেন, তা নিশ্চিত করুন যে আপনি অকারণে গণিত-গ্রন্থাগার ফাংশন কল করছেন না। আমাদের একটি কেস ছিল যেখানে কোডটি এমন y = (y+1) % 4কাউন্টারের মতো ছিল যা 4 পিরিয়ড ছিল, সংকলকটি 4 মডেলটিকে বিটওয়াইস-এন্ড হিসাবে বাস্তবায়ন করবে বলে আশা করেছিল। পরিবর্তে এটি গণিত গ্রন্থাগার বলা হয়। তাই আমরা y = (y+1) & 3যা চেয়েছিলাম তা করার জন্য প্রতিস্থাপন করেছি।

  • বিট-টুইডলিং হ্যাক্স পৃষ্ঠাটির সাথে পরিচিত হন । আমি গ্যারান্টি দিচ্ছি আপনি প্রায়শই এর মধ্যে কমপক্ষে একটি ব্যবহার করবেন।

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

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

আমাদের ছোট কার্যকারিতা সম্পর্কে ভুলে যাওয়া উচিত, সময়ের প্রায় 97% বলুন: অকাল অনুকূলতা হ'ল সমস্ত মন্দের মূল

তবে আপনি এমন পরিস্থিতিতে আছেন যেখানে আপনি জানেন যে আপনাকে কোনও ধরণের অপ্টিমাইজেশন করতে হবে, তাই বুলেটটি কামড়ানোর এবং অনুকূলিতকরণের (বা একটি দ্রুত প্রসেসর বা উভয়ই পেতে হবে) সময় এসেছে। না না সমাবেশ আপনার পুরো ISR লিখুন। এটি প্রায় একটি গ্যারান্টিযুক্ত দুর্যোগ - যদি আপনি এটি করেন তবে কয়েক মাস বা সপ্তাহের মধ্যে আপনি কী করেছেন এবং কেন কিছু করেছেন তা ভুলে যাবেন এবং কোডটি সম্ভবত খুব ভঙ্গুর এবং পরিবর্তন হতে পারে। সেখানে আপনার কোড অংশ হওয়ার সম্ভাবনা যে, তবে, হয় সমাবেশ জন্য ভাল প্রার্থী।

আপনার কোডের অংশগুলি সমাবেশ-কোডিংয়ের জন্য উপযুক্ত Sign

  • ফাংশনগুলি যা ভালভাবে অন্তর্ভুক্ত রয়েছে, ভাল-সংজ্ঞায়িত ছোট রুটিনগুলি পরিবর্তনের সম্ভাবনা নেই
  • সুনির্দিষ্ট সমাবেশ নির্দেশাবলী (ন্যূনতম / সর্বাধিক / ডান শিফট ইত্যাদি) ব্যবহার করতে পারে এমন ফাংশন
  • যে ফাংশনগুলি বহুবার কল করা হয় (আপনি একটি গুণক পাবেন: আপনি যদি প্রতিটি কলটিতে 0.5 ইউসেক সংরক্ষণ করেন এবং এটি 10 ​​বার কল করা হয় যা আপনাকে 5 ব্যবহারকারের সাশ্রয় করে যা আপনার ক্ষেত্রে গুরুত্বপূর্ণ)

আপনার সংকলকের ফাংশন কলিং কনভেনশনগুলি শিখুন (যেমন এটি নিবন্ধগুলিতে আর্গুমেন্ট রাখে এবং কোনটি এটি সংরক্ষণ / পুনরুদ্ধারগুলিতে নিবন্ধভুক্ত করে) যাতে আপনি সি-কলযোগ্য সমাবেশের রুটিন লিখতে পারেন।

আমার বর্তমান প্রকল্পে, আমাদের কাছে সমালোচনামূলক কোড সহ একটি চমত্কার বৃহত কোডবেস রয়েছে যা 10 কেএইচজেড বিঘ্নিতভাবে চালাতে হবে (100 কাস্ক - পরিচিত শব্দ?) এবং অ্যাসেমব্লিতে লেখা অনেকগুলি ফাংশন নেই। সেগুলি হ'ল সিআরসি গণনা, সফ্টওয়্যার সারি, এডিসি লাভ / অফসেট ক্ষতিপূরণের মতো জিনিস।

শুভকামনা!


অভিজ্ঞতা প্রয়োগের সময় পরিমাপ কৌশলগুলি সম্পর্কে ভাল পরামর্শ
21

আমার প্রশ্নের আরও একটি দুর্দান্ত উত্তর, জ্ঞানের এই দুর্দান্ত অংশটির জন্য জেসন এসকে অনেক ধন্যবাদ! এটি পড়ার পরে দুটি বিষয় প্রকাশিত; প্রথমত, কোডটি কার্যকর করার জন্য আরও সময় দেওয়ার জন্য আমি প্রতি 100uS থেকে 500uS এ বাধা বাড়াতে পারি, আমি বুঝতে পেরেছি যে এই দ্রুত হওয়ার ফলে এটি আসলে আমার উপকার করছে না। দ্বিতীয়ত আমার মনে হয় আমার কোডটি খুব অকার্যকর হতে পারে, দীর্ঘতর বাধা সময় এবং আরও ভাল কোডের সাথে এটি সব ভাল হতে পারে। কোড পোস্ট করার জন্য স্ট্যাকওভারফ্লো একটি ভাল জায়গা, সুতরাং আমি এটি এখানে পোস্ট করব এবং এটিতে এখানে একটি লিঙ্ক রেখে দেব, যদি কেউ দেখতে চান এবং কোনও সুপারিশ করতে চান তবে দয়া করে করুন: ডি
jwbensley

5

আরেকটি বিষয় লক্ষণীয় - সম্ভবত কিছু অপ্টিমাইজেশন রয়েছে যা আপনি আপনার কোডটিকে আরও দক্ষ করতে পারেন।

উদাহরণস্বরূপ - আমার একটি রুটিন রয়েছে যা টাইমার বিঘ্নের মধ্যে থেকে চলে। রুটিনটি 52µS এর মধ্যে শেষ করতে হয় এবং এটি করার সময় প্রচুর পরিমাণে মেমরি দিয়ে যেতে হয়।

আমি প্রধান কাউন্টার ভেরিয়েবলটিকে একটি রেজিস্ট্রারে লক করে (আমার µ সি এবং কম্পাইলারে - আপনার জন্য আলাদা) লক করে বড় গতি বৃদ্ধি পরিচালনা করেছি:

register unsigned int pointer asm("W9");

আমি আপনার সংকলকটির ফর্ম্যাটটি জানি না - আরটিএফএম, তবে সমাবেশে স্যুইচ না করে আপনার রুটিনটি আরও দ্রুত করার জন্য আপনি কিছু করতে পারেন।

এই কথাটি বলার পরে, আপনি কমপাইলারের তুলনায় আপনার রুটিনকে অনুকূলকরণের ক্ষেত্রে আপনি সম্ভবত আরও ভাল কাজ করতে পারেন, সুতরাং সমাবেশে স্যুইচ করা আপনাকে বেশ কিছুটা গতি বাড়িয়ে দিতে পারে।


লল আমি "একযোগে" এসেম্বলার টিউন সম্পর্কে আমার নিজের উত্তরে মন্তব্য করেছি এবং বরাদ্দকে রেজিস্টার করি :)
ভিস্যাটাকু

এটি একটি 16 MHz প্রসেসর উপর 100us নিচ্ছে তাহলে - এটি সম্ভবত, চমত্কার বিশাল তাই যে দর্শন নিখুত কোডের। আমি শুনেছি যে আজকের সংকলকরা হ্যান্ড-অপ্টিমাইজড অ্যাসেমব্লিংয়ের চেয়ে কোডটির প্রায় 1.1 গুণ বেশি উত্পাদন করে। সম্পূর্ণরূপে এত বিশাল রুটিনের জন্য এটি মূল্যবান নয়। 6% লাইনের কার্যক্রমে 20% শেভ করার জন্য, সম্ভবত ...
DefenestrationDay

1
অগত্যা নয় ... এটি একটি লুপে কোডের 5 টি লাইন হতে পারে। এবং এটি কোড আকার সম্পর্কে নয় তবে কোড দক্ষতার বিষয়ে । আপনি কোডটি এটিকে দ্রুত চালিত করে ভিন্নভাবে লিখতে সক্ষম হতে পারেন। আমি আমার বাধা রুটিনের জন্য জানি did উদাহরণস্বরূপ, গতির জন্য আকার ত্যাগ। ধারাবাহিকভাবে 10 বার একই কোড চালিয়ে আপনি লুপটি করার কোড থাকার সময় এবং তার সাথে সম্পর্কিত কাউন্টার ভেরিয়েবল সাশ্রয় করেন। হ্যাঁ, কোডটি 10 ​​গুণ দীর্ঘ, তবে এটি দ্রুত চলে।
মাজনকো

হাই মাজেঙ্কো, আমি অ্যাসেমব্লিকে জানি না তবে আমি এটি শিখার বিষয়ে ভাবছিলাম, এবং ভাবছিলাম যে আরডুইনো আমার ডেস্কটপ কম্পিউটারের চেয়ে কম জটিল হয়ে উঠবে তাই শেখার জন্য এটি একটি ভাল সময় হতে পারে, বিশেষত যেমনটি আমি জানতে চাই কি চলছে এবং নিম্ন স্তরের সম্পর্কে আরও। অন্যরা যেমন বলেছে, আমি পুরো বিষয়টিকে কেবল কিছু নির্দিষ্ট অংশে আবার লিখব না। আমার বোধগম্যতা হল আমি সি এর মধ্যে এএসএম এড়াতে এবং আউট করতে পারি, এটি কি সঠিক, এটি কীভাবে সি এবং এএসএমের এই মিশ্রণটি অর্জন করতে পারে? আমি স্ট্যাকওভারফ্লোতে সুনির্দিষ্ট জন্য একটি সাধারণ ধারণা পরে পোস্ট করব।
jwbensley

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