সমাবেশ যখন সি এর চেয়ে দ্রুত হয়?


474

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

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

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


17
সংকলিত কোডটি উন্নত করা আসলে এটি বেশ তুচ্ছ ial এসেম্বলি ভাষা এবং সি সম্পর্কে দৃ knowledge় জ্ঞান সহ যে কেউ উত্পন্ন কোডটি পরীক্ষা করে এটি দেখতে পারেন। সংকলিত সংস্করণে ডিসপোজেবল রেজিস্টারগুলি শেষ হয়ে গেলে আপনি যে কোনও প্রথম কাজ সম্পাদন করতে পারেন easy গড়ে তুলনামূলকভাবে একটি বড় প্রকল্পের জন্য মানুষের তুলনায় আরও অনেক ভাল কাজ করবে, তবে সংকলিত কোডটিতে পারফরম্যান্সের সমস্যাগুলি খুঁজে পাওয়া কোনও শালীন আকারের প্রকল্পে শক্ত নয়।
old_timer

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

11
আমি দৃ strongly়ভাবে একমত নই যে এই প্রশ্নের জবাবগুলি "মতামত ভিত্তিক" হওয়া দরকার - তারা বেশিরভাগ উদ্দেশ্যমূলক হতে পারে - এটি প্রিয় পোষা ভাষার ভাষাগুলির পারফরম্যান্সের তুলনা করার চেষ্টা করার মতো কিছু নয়, যার জন্য প্রত্যেকটির দৃ strong় পয়েন্ট থাকবে এবং পিঠ আঁকবে। সংকলকগণ আমাদের কতদূর নিতে পারে এবং কোন দিক থেকে এটি গ্রহণ করা ভাল তা বোঝার বিষয়টি।
jsbueno

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

3
আপনার মস্তিষ্কের -O3পতাকা না থাকলে আপনি সম্ভবত সি
সংকলকটিতে

উত্তর:


271

এখানে একটি বাস্তব বিশ্বের উদাহরণ: পুরানো সংকলকগুলিতে স্থির পয়েন্টের গুণগুলি।

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


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


সি-তে একটি পূর্ণ-গুণক অপারেটর নেই (এন-বিট ইনপুট থেকে 2N-বিট ফলাফল)। সি তে প্রকাশ করার স্বাভাবিক উপায় হ'ল ইনপুটগুলি আরও বিস্তৃত প্রকারে ফেলে দেওয়া এবং আশা করি যে সংকলকটি বুঝতে পারে যে ইনপুটগুলির উপরের বিটগুলি আকর্ষণীয় নয়:

// on a 32-bit machine, int can hold 32-bit fixed-point integers.
int inline FixedPointMul (int a, int b)
{
  long long a_long = a; // cast to 64 bit.

  long long product = a_long * b; // perform multiplication

  return (int) (product >> 16);  // shift by the fixed point bias
}

এই কোডটির সমস্যাটি হ'ল আমরা এমন কিছু করি যা সি-ভাষায় সরাসরি প্রকাশ করা যায় না। আমরা দুটি 32 বিট সংখ্যাকে গুণ করতে এবং একটি 64 বিটের ফলাফল পেতে চাই যার মধ্যবর্তী 32 বিটকে আমরা ফিরিয়ে আনব। তবে সি তে এই গুণটির কোন অস্তিত্ব নেই। আপনি যা করতে পারেন তা হ'ল ইন্টিজারগুলি 64 বিটে প্রচার করা এবং একটি 64 * 64 = 64 গুণ করা।

x86 (এবং এআরএম, এমআইপিএস এবং অন্যান্য) তবে একক নির্দেশায় গুণ করতে পারে। কিছু সংকলক এই সত্যটিকে উপেক্ষা করে কোড তৈরি করে যা একটি রানটাইম লাইব্রেরি ফাংশনকে গুণিত করতে ডাকে। ১ by-এর শিফটটি প্রায়শই একটি লাইব্রেরি রুটিন দ্বারাও করা হয় (এছাড়াও x86 এ জাতীয় শিফট করতে পারে)

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

আপনি যদি একই কোডটি (ইনলাইন) এসেম্বলারে পুনরায় লিখেন তবে আপনি একটি গতিময় গতি বৃদ্ধি করতে পারেন।

এগুলি ছাড়াও: এএসএম ব্যবহার করা সমস্যা সমাধানের সর্বোত্তম উপায় নয়। বেশিরভাগ সংকলক আপনাকে সিগুলিতে প্রকাশ করতে না পারলে অভ্যন্তরীণ আকারে কিছু সংযোজক নির্দেশাবলী ব্যবহারের অনুমতি দেয় VS.NET2008 সংকলক উদাহরণস্বরূপ 32 * 32 = 64 বিট মুলকে __emul হিসাবে এবং thell_rsift হিসাবে bit৪ বিট শিফটটি প্রকাশ করে।

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

রেফারেন্সের জন্য: ভিএস.এনইটি সংকলকের স্থির-পয়েন্ট মুলের শেষ ফলাফলটি হ'ল:

int inline FixedPointMul (int a, int b)
{
    return (int) __ll_rshift(__emul(a,b),16);
}

ফিক্সড পয়েন্ট বিভাজনের পারফরম্যান্স পার্থক্য আরও বড়। আমার বেশ কয়েকটি এসএম-লাইন লিখে ডিভিশন ভারী ফিক্সড পয়েন্ট কোডের জন্য দশমিক 10 গুণমান পর্যন্ত উন্নতি হয়েছিল।


ভিজ্যুয়াল সি ++ 2013 ব্যবহার করে উভয় উপায়ে একই সমাবেশ কোড দেয়।

2007 থেকে gcc4.1 এছাড়াও খাঁটি সি সংস্করণটিকে সুন্দরভাবে অনুকূল করে। (গডবোল্ট সংকলক এক্সপ্লোরার জিসিসির কোনও পূর্ববর্তী সংস্করণ ইনস্টল করেনি, তবে সম্ভবত সম্ভবত পুরানো জিসিসি সংস্করণগুলিও অন্তর্নিহিত ছাড়াই এটি করতে পারে))

গডবোল্ট সংকলক এক্সপ্লোরার এক্স x86 (32-বিট) এবং এআরএমের জন্য উত্স + asm দেখুন । (দুর্ভাগ্যক্রমে এটি সাধারণ খাঁটি সি সংস্করণ থেকে খারাপ কোড তৈরি করার মতো পুরানো কোনও সংকলক নেই))


আধুনিক CPU- র জিনিষ সি জন্য অপারেটরদের নেই কি করতে পারেন এ সব মত, popcntবা বিট-স্ক্যানের প্রথম অথবা শেষ সেট বিট এটি । (পসিক্সের একটি ffs()ফাংশন রয়েছে তবে এর শব্দার্থকগুলি x86 bsf/ এর সাথে মেলে না bsrHttps://en.wikedia.org/wiki/Find_first_set দেখুন )।

কিছু সংকলক কখনও কখনও এমন একটি লুপ সনাক্ত করতে পারে যা একটি পূর্ণসংখ্যায় সেট বিটের সংখ্যা গণনা করে এটি একটি popcntনির্দেশিকায় সংকলন করে (সংকলনের সময় সক্ষম করা থাকে) তবে এটি __builtin_popcntGNU C, বা x86 এ ব্যবহার করা আরও নির্ভরযোগ্য যদি আপনি কেবলমাত্র এসএসই 4.2 দিয়ে হার্ডওয়্যারকে লক্ষ্য করে: _mm_popcnt_u32থেকে<immintrin.h>

অথবা সি ++ এ একটি std::bitset<32>ব্যবহার করুন .count()। (এটি এমন একটি ক্ষেত্রে যেখানে ভাষাটি স্ট্যান্ডার্ড লাইব্রেরির মাধ্যমে পপকাউন্টের একটি অনুকূলিতকরণ বাস্তবায়ন বহন করার উপায় খুঁজে পেয়েছে, এমন একটি উপায়ে যা সর্বদা সঠিক কিছু সংকলন করে, এবং লক্ষ্যটি যা সমর্থন করে তাতে সুবিধা নিতে পারে)) আরও দেখুন https : //en.wikedia.org/wiki/ হ্যামিং_ওয়েট # ল্যাঙ্গুয়েজ_সুপোর্ট

তেমনি কিছু সি বাস্তবায়নের ntohlক্ষেত্রে bswap(এন্ডিয়ান রূপান্তরকরণের জন্য x86 32-বিট বাইট স্যুপ) সংকলন করতে পারেন ।


অন্তর্নিহিত বা হস্ত লিখিত asm জন্য আর একটি বড় ক্ষেত্র হ'ল সিমডি নির্দেশাবলী সহ ম্যানুয়াল ভেক্টরাইজেশন। সংযোজকগুলি সরল লুপগুলির মতো খারাপ হয় না dst[i] += src[i] * 10.0;তবে জিনিসগুলি যখন আরও জটিল হয় তখন প্রায়শই খারাপভাবে কাজ করে বা অটো-ভেক্টরাইজ করে না। উদাহরণস্বরূপ, সিমড ব্যবহার করে আটোয় কীভাবে বাস্তবায়ন করবেন এর মতো কিছু পাওয়ার সম্ভাবনা আপনার নেই ? স্কেলার কোড থেকে সংকলক দ্বারা স্বয়ংক্রিয়ভাবে উত্পাদিত।


6
{X = c% d এর মতো জিনিসগুলি সম্পর্কে কীভাবে; y = c / d;}, সংকলকরা কি একক ডিভ বা আইডিভি তৈরি করতে যথেষ্ট চালাক?
জেনস বিজার্নহাগার

4
আসলে, একটি ভাল সংকলক প্রথম ফাংশন থেকে সর্বোত্তম কোড উত্পাদন করতে পারে। একেবারে কোনও উপকারের সাথে ইন্টারনসিকস বা ইনলাইন অ্যাসেমব্লির সাহায্যে সোর্স কোডটিকে অস্পষ্ট করা সবচেয়ে ভাল কাজ নয়।
স্ল্যাকার

65
হাই স্ল্যাকার, আমি মনে করি এর আগে আপনাকে কখনই সময়-সমালোচনামূলক কোডে কাজ করতে হবে না ... ইনলাইন এসেম্বলি একটি * বিশাল পার্থক্য আনতে পারে। সংকলকটির জন্যও একটি অন্তর্নিহিত সি এর মতো সাধারণ গাণিতিকের সমান That's এটি আন্তঃব্যক্তির মূল বিষয়। ত্রুটিগুলি মোকাবেলা না করে তারা আপনাকে একটি আর্কিটেকচার বৈশিষ্ট্যটি ব্যবহার করতে দেয়।
নীল পিপেনব্রিংক

6
@ স্ল্যাকার আসলে, এখানে কোডটি বেশ পঠনযোগ্য: ইনলাইন কোডটি একটি অনন্য অপারেশন করে, যা অবিলম্বে পদ্ধতিটির স্বাক্ষরটি পড়ার ক্ষেত্রে অযোগ্য করে তোলা যায়। যখন কোনও অস্পষ্ট নির্দেশিকা ব্যবহার করা হয় তখন কোডটি পাঠযোগ্যতার মধ্যে কেবল ধীরে ধীরে হারিয়ে যায়। এখানে গুরুত্বপূর্ণ বিষয়গুলি হল আমাদের কাছে এমন একটি পদ্ধতি রয়েছে যা কেবলমাত্র একটি স্পষ্টভাবে চিহ্নিতযোগ্য অপারেশন করে এবং এ পারমাণবিক ক্রিয়াকলাপগুলি পাঠযোগ্য কোড তৈরির পক্ষে সত্যই সেরা উপায়। যাইহোক, এটি / * (a * b) >> 16 * / এর সাথে সাথে এটি ব্যাখ্যা করতে পারে না এমন একটি ছোট মন্তব্য এতটাই অস্পষ্ট নয়।
ডেরিকসন

5
সত্যি কথা বলতে, এই উদাহরণটি একটি দরিদ্র, কমপক্ষে আজ। সি সংকলকগুলি দীর্ঘকাল 32x32 -> 64৪ গুণ করতে সক্ষম হয়েছে যদিও ভাষাটি সরাসরি এটি সরবরাহ করে না: তারা বুঝতে পারে যে আপনি যখন -২-বিট যুক্তিগুলি 64৪-বিটে প্রেরণ করেন এবং তখন তাদেরকে গুন করেন তখন এটি করার দরকার হয় না একটি পূর্ণ 64৪-বিট গুণটি করুন, তবে এটি একটি 32x32 -> 64 কেবল ঠিক করবে। আমি চেক করেছি এবং তাদের বর্তমান সংস্করণে সমস্ত ঝনঝন, জিসিসি এবং এমএসভিসি এই অধিকার পেয়েছি । এটি নতুন নয় - আমার মনে আছে এক দশক আগে সংকলক আউটপুটটি দেখে এবং এটি লক্ষ্য করা।
BeeOnRope

143

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

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

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


3
হ্যাঁ এটি একটি বিট মনোক্রোম সিস্টেম ছিল, বিশেষত এটি একটি আটারি এসটি-তে একরঙা চিত্রের ব্লক ছিল।
লিলবার্ন

16
অনুকূলকরণ সংকলকটি কি মূল প্রোগ্রামটি বা আপনার সংস্করণটি সংকলন করেছে?
থোরবজর্ন রাভন অ্যান্ডারসন

কোন প্রসেসরে? 8086-তে, আমি প্রত্যাশা করেছিলাম যে 8x8 রোটেটের জন্য সর্বোত্তম কোডটি এসআই ব্যবহার করে 16 বিট ডেটা দিয়ে ডিআই লোড করবে, add di,di / adc al,al / add di,di / adc ah,ahআট আট বিট রেজিস্টারের জন্য পুনরায় পুনরায় পুনরায় পুনঃস্থাপন করবে এবং তারপরে সমস্ত 8 টি রেজিষ্টার পুনরায় করুন এবং তারপরে সম্পূর্ণ প্রক্রিয়াটি তিনটি পুনরাবৃত্তি করুন আরও বার, এবং অবশেষে ax / bx / cx / dx এ চারটি শব্দ সংরক্ষণ করুন। কোনও উপাহ্যকারী এর কাছাকাছি আসতে পারে না।
সুপারক্যাট

1
আমি সত্যিই এমন কোনও প্ল্যাটফর্মের কথা ভাবতে পারি না যেখানে একটি সংকলক 8x8 ঘোরানোর জন্য অনুকূল কোডের একটি ফ্যাক্টর বা দুটির মধ্যে আসতে পারে।
সুপারক্যাট

65

খুব সুন্দর যে কোনও সময় সংকলকটি ভাসমান পয়েন্ট কোডটি দেখেন, আপনি যদি কোনও পুরানো খারাপ সংকলক ব্যবহার করেন তবে একটি হাতের লিখিত সংস্করণটি দ্রুততর হবে। ( 2019 আপডেট: আধুনিক সংকলকগুলির ক্ষেত্রে এটি সাধারণভাবে সত্য নয় Especially বিশেষত x87 ব্যতীত অন্য যে কোনও কিছুর জন্য সংকলন করার সময়; সংকলকগুলির স্কেলার গণিতের জন্য এসএসই 2 বা অ্যাভিএক্সের সাথে সহজ সময় থাকে বা এক্স 87 এর বিপরীতে ফ্ল্যাট এফপি রেজিস্টার সেট সহ কোনও নন- x86 থাকে) স্ট্যাক নিবন্ধন করুন।)

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

#include "stdafx.h"
#include <windows.h>

float KahanSum(const float *data, int n)
{
   float sum = 0.0f, C = 0.0f, Y, T;

   for (int i = 0 ; i < n ; ++i) {
      Y = *data++ - C;
      T = sum + Y;
      C = T - sum - Y;
      sum = T;
   }

   return sum;
}

float AsmSum(const float *data, int n)
{
  float result = 0.0f;

  _asm
  {
    mov esi,data
    mov ecx,n
    fldz
    fldz
l1:
    fsubr [esi]
    add esi,4
    fld st(0)
    fadd st(0),st(2)
    fld st(0)
    fsub st(0),st(3)
    fsub st(0),st(2)
    fstp st(2)
    fstp st(2)
    loop l1
    fstp result
    fstp result
  }

  return result;
}

int main (int, char **)
{
  int count = 1000000;

  float *source = new float [count];

  for (int i = 0 ; i < count ; ++i) {
    source [i] = static_cast <float> (rand ()) / static_cast <float> (RAND_MAX);
  }

  LARGE_INTEGER start, mid, end;

  float sum1 = 0.0f, sum2 = 0.0f;

  QueryPerformanceCounter (&start);

  sum1 = KahanSum (source, count);

  QueryPerformanceCounter (&mid);

  sum2 = AsmSum (source, count);

  QueryPerformanceCounter (&end);

  cout << "  C code: " << sum1 << " in " << (mid.QuadPart - start.QuadPart) << endl;
  cout << "asm code: " << sum2 << " in " << (end.QuadPart - mid.QuadPart) << endl;

  return 0;
}

এবং আমার পিসি থেকে কিছু নম্বর একটি ডিফল্ট রিলিজ বিল্ড * চালাচ্ছে :

  C code: 500137 in 103884668
asm code: 500137 in 52129147

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

ওফস, আমি কোডটির কিছুটা আলাদা সংস্করণ চালিয়ে যাচ্ছিলাম এবং এটি নম্বরগুলি ভুল উপায়ে আউটপুট করেছিল (অর্থাত সি দ্রুত ছিল!)। স্থির এবং ফলাফল আপডেট।


20
বা জিসিসিতে, আপনি ফ্ল্যাগিং পয়েন্ট অপটিমাইজেশনে সংকলকটির হাতগুলি মুক্ত করতে পারেন (যতক্ষণ আপনি প্রতিশ্রুতি বা এনএএনএস দিয়ে কিছু না করার প্রতিশ্রুতি দিচ্ছেন) পতাকা ব্যবহার করে -ffast-math। তাদের একটি অপ্টিমাইজেশন স্তর রয়েছে, -Ofastএটি বর্তমানে সমতুল্য -O3 -ffast-math, তবে ভবিষ্যতে আরও অনুকূলিতকরণ অন্তর্ভুক্ত থাকতে পারে যা কোণার ক্ষেত্রে ভুল কোড জেনারেশন করতে পারে (যেমন কোড যা আইইইইএনএন এর উপর নির্ভর করে)।
ডেভিড স্টোন

2
হ্যাঁ, ফ্লোটগুলি কমটিভেটিভ নয়, সংকলককে অবশ্যই আপনি যা লিখেছিলেন তা করতে হবে, মূলত @ ডেভিডস্টোন যা বলেছিল।
অ্যালেক টিল

2
আপনি এসএসই গণিত চেষ্টা করেছেন?
এমএসএস

4
@ প্রক্সিওলিটিক: এফপি যুক্তটি কমিউটিভ ( a+b == b+a), তবে সংঘবদ্ধ নয় (ক্রিয়াকলাপকে পুনরায় সাজানো, সুতরাং মধ্যস্থতাকারীদের বৃত্তাকারটি আলাদা)। পুনরায়: এই কোড: আমি মনে করি না যে uncommented x87 এবং একটি loopনির্দেশ দ্রুত অ্যাসেমের খুব ভয়ঙ্কর বিক্ষোভ। loopস্পষ্টতই এফপি বিলম্বের কারণে আসলে কোনও বাধা নয়। আমি নিশ্চিত নই যে তিনি এফপি কার্যক্রম চালাচ্ছেন কিনা; x87 মানুষের পক্ষে পড়া শক্ত। fstp resultsশেষে দুটি insns স্পষ্টত অনুকূল নয়। স্ট্যাক থেকে অতিরিক্ত ফলাফল পপিং একটি নন-স্টোর দিয়ে আরও ভাল করা হবে। fstp st(0)আইআইআরসি'র মতো ।
পিটার কর্ডেস

2
@ পিটারকর্ডস: সংযোজনকে পরিবহণ করার একটি আকর্ষণীয় পরিণতি হ'ল 0 + x এবং x + 0 একে অপরের সমতুল্য, উভয়ই সর্বদা x এর সমতুল্য নয়।
সুপারক্যাট

58

কোনও নির্দিষ্ট উদাহরণ বা প্রোফাইলের প্রমাণ না দিয়ে, আপনি যখন সংকলকটির চেয়ে বেশি জানেন তখন আপনি সংকলকটির চেয়ে আরও ভাল এসেমব্লার লিখতে পারেন।

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

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

অন্যরা বিশেষ উদ্দেশ্যে নির্দেশাবলী উল্লেখ করেছেন, যা আমি উপরের অনুচ্ছেদে বলছি - যে নির্দেশাবলী সংকলকটিতে সীমিত বা কোনও জ্ঞান থাকতে পারে না, তা দিয়ে দ্রুত মানুষের পক্ষে কোড লেখা সম্ভব হয়।


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

1
@ লাইডম্যান: "এটি একটি মানুষের চেয়ে দ্রুত নির্দেশকে পুনরায় অর্ডার করার চেষ্টা করতে পারে"। ওসিএএমএল দ্রুত এবং আশ্চর্যজনকভাবে, এর নেটিভ-কোড সংকলক ocamloptx86-তে নির্দেশের সময়সূচী এড়িয়ে যায় এবং পরিবর্তে এটি সিপিইউতে ফেলে দেয় কারণ রান-টাইমে এটি আরও কার্যকরভাবে পুনরায় অর্ডার করতে পারে।
জন হ্যারোপ

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

48

আমার চাকরিতে, আমার কাছে সমাবেশ জানতে এবং ব্যবহার করার জন্য তিনটি কারণ রয়েছে। গুরুত্ব অনুসারে:

  1. ডিবাগিং - আমি প্রায়শই লাইব্রেরি কোড পাই যাতে বাগ বা অসম্পূর্ণ ডকুমেন্টেশন রয়েছে। আমি সমাবেশ পর্যায়ে পদক্ষেপে এটি কী করছে তা বুঝতে পারি। আমাকে সপ্তাহে একবারে এটি করতে হবে। আমি এটির সমস্যাগুলি ডিবাগ করার জন্য একটি সরঞ্জাম হিসাবেও ব্যবহার করি যাতে আমার চোখগুলি সি / সি ++ / সি # তে অভিহিত ত্রুটি চিহ্নিত করে না। বিধানসভার দিকে তাকিয়ে যে অতীত হয়।

  2. অপ্টিমাইজ করা - সংকলক অনুকূলকরণে মোটামুটি ভাল কাজ করে তবে আমি বেশিরভাগের চেয়ে আলাদা বলপাড়কে খেলি। আমি চিত্র প্রক্রিয়াকরণ কোডটি লিখি যা সাধারণত এমন কোড দিয়ে শুরু হয় যা দেখে মনে হয়:

    for (int y=0; y < imageHeight; y++) {
        for (int x=0; x < imageWidth; x++) {
           // do something
        }
    }

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

  3. ভাষা কিছু করতে আমাকে দেয় না। এর মধ্যে রয়েছে - প্রসেসরের আর্কিটেকচার এবং নির্দিষ্ট প্রসেসরের বৈশিষ্ট্য পাওয়া, সিপিইউতে নয় পতাকাগুলি অ্যাক্সেস করা (মানুষ, আমি সত্যিই সি আপনাকে ক্যারি পতাকাটিতে অ্যাক্সেস দিয়েছি) ইত্যাদি ইত্যাদি আমি সম্ভবত বছর বা দু'বছরে একবার এটি করি।


আপনি আপনার লুপ টাইল না? :-)
জন হ্যারোপ

1
@ প্লিন্থ: আপনি কীভাবে "স্ক্র্যাপিং সাইকেল" বলতে চাচ্ছেন?
lang2

@ ল্যাং 2: এর অর্থ অভ্যন্তরীণ লুপে যতটা সম্ভব ব্যয় করা ততটুকু সময় থেকে মুক্তি পাওয়া - সংকলকটি যা টানতে পারেনি, যার মধ্যে একটি লুপ থেকে বহুগুণ উত্তোলনের জন্য বীজগণিত ব্যবহার করা যেতে পারে মধ্যে ভেতরের ইত্যাদি
থামাল

1
লুপ টাইলিং অপ্রয়োজনীয় বলে মনে হয় যদি আপনি কেবলমাত্র ডেটা দিয়ে একটি পাস করেন।
জেমস এম। লে

@ জেমসএম.লে: আপনি যদি কেবলমাত্র প্রতিটি উপাদান একবার স্পর্শ করেন, একটি উত্তম ট্র্যাভার্সাল ক্রম আপনাকে স্থানিক লোকাল দিতে পারে। (উদাহরণস্বরূপ, ক্যাশে লাইনের প্রতি একটি উপাদান ব্যবহার করে ম্যাট্রিক্সের কলামগুলি লুপিংয়ের পরিবর্তে আপনি যে ক্যাশে লাইনের স্পর্শ করেছেন তার সমস্ত বাইট ব্যবহার করুন))
পিটার

42

কিছু বিশেষ উদ্দেশ্যে নির্দেশ ব্যবহার করার সময় কেবল সংকলকটি সমর্থন করে না।

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

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


4
+1, যদিও সর্বশেষ বাক্যটি সত্যই এই আলোচনার সাথে সম্পর্কিত নয় - কেউ ধারণা করবেন যে অ্যালগোরিদম ইত্যাদির সমস্ত সম্ভাব্য উন্নতিগুলি উপলব্ধি হওয়ার পরেই এসেম্বলার খেলতে আসবে।
mghie

18
@ ম্যাট: হাতের লিখিত এএসএম প্রায়শই কিছু ক্ষুদ্র সিপিইউ ইই-র কাজের সাথে ক্রেপি বিক্রেতার সংকলক সমর্থন পাওয়ার ক্ষেত্রে অনেক ভাল।
Zan Lynx

5
"শুধুমাত্র কিছু বিশেষ উদ্দেশ্য নির্দেশাবলী সেট ব্যবহার করার সময়" ?? আপনি সম্ভবত এর আগে কখনও কখনও হাত-অনুকূলকৃত asm কোডটি লিখেছেন নি। আপনি যে আর্কিটেকচারের উপরে কাজ করছেন তার একটি মাঝারি ঘনিষ্ঠ জ্ঞান আপনাকে আপনার সংকলকের থেকে আরও ভাল কোড (আকার এবং গতি) তৈরি করার জন্য একটি ভাল সুযোগ দেয়। স্পষ্টতই, @ মিঘি মন্তব্য হিসাবে, আপনি সর্বদা সেরা সমস্যার জন্য কোডিং শুরু করেন যে সমস্যার জন্য আপনি আসতে পারেন। এমনকি খুব ভাল সংকলকগুলির জন্যও আপনাকে সত্যিকার অর্থে আপনার সি কোডটি লিখতে হবে যা সংকলককে সেরা সংকলিত কোডে নিয়ে যায়। অন্যথায়, উত্পন্ন কোডটি উপ-অনুকূল হবে।
ysap

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

4
সংস্থাগুলি ( উদাহরণস্বরূপ , জেআইটি) যদি তারা চালিত হার্ডওয়ারের জন্য অনুকূলিত হয় তবে তাদের তুলনায় আরও ভাল কাজ করতে পারেন তা উল্লেখ করার জন্য +1 ।
সেবাস্তিয়ান

38

যদিও সি 8-বিট, 16-বিট, 32-বিট, 64৪-বিট ডেটা নিম্ন-স্তরের ম্যানিপুলেশনের "কাছাকাছি" রয়েছে, সি এর দ্বারা সমর্থিত কিছু গাণিতিক ক্রিয়াকলাপ নেই যা প্রায়শই নির্দিষ্ট সমাবেশ নির্দেশে মার্জিতভাবে সম্পাদন করা যায় সেট:

  1. স্থির-পয়েন্টের গুণন: দুটি 16-বিট সংখ্যার গুণমান 32-বিট সংখ্যা। তবে সি-এর নিয়মগুলি বলে যে দুটি 16-বিট সংখ্যার পণ্যটি একটি 16-বিট সংখ্যা এবং দুটি 32-বিট সংখ্যার পণ্যটি 32-বিট সংখ্যা - উভয় ক্ষেত্রে নীচের অর্ধেক। আপনি যদি 16x16 গুণিতের শীর্ষ অর্ধেক বা 32x32 গুণবান করতে চান তবে আপনাকে সংকলকটির সাথে গেম খেলতে হবে। সাধারণ পদ্ধতিটি হ'ল প্রয়োজনীয়-বিট প্রস্থে বৃহত্তর, শিফট এবং পিছনে কাস্ট করা:

    int16_t x, y;
    // int16_t is a typedef for "short"
    // set x and y to something
    int16_t prod = (int16_t)(((int32_t)x*y)>>16);`

    এই ক্ষেত্রে সংকলকটি জানতে যথেষ্ট স্মার্ট হতে পারে যে আপনি সত্যিই কেবলমাত্র 16x16 গুণনের শীর্ষ অর্ধেকটি পেতে এবং মেশিনের নেটিভ 16x16 মাল্টিপ্লাইয়ের সাথে সঠিক কাজটি করার চেষ্টা করছেন। অথবা এটি নির্বোধ হতে পারে এবং 32x32 গুণিত করার জন্য একটি লাইব্রেরি কল প্রয়োজন যাতে ওভারকিল করা যায় কারণ আপনার কেবলমাত্র পণ্যটির 16 বিট প্রয়োজন - তবে সি স্ট্যান্ডার্ড আপনাকে নিজের প্রকাশ করার কোনও উপায় দেয় না।

  2. কিছু বিটশিটিং অপারেশন (রোটেশন / ক্যারি):

    // 256-bit array shifted right in its entirety:
    uint8_t x[32];
    for (int i = 32; --i > 0; )
    {
       x[i] = (x[i] >> 1) | (x[i-1] << 7);
    }
    x[0] >>= 1;

    এটি সি তে খুব অচল নয়, তবে আবার, সংকলক আপনি যা করছেন তা উপলব্ধি করতে যথেষ্ট স্মার্ট না হলে এটি "অপ্রয়োজনীয়" কাজটি অনেকটা করতে চলেছে। অনেক সমাবেশ নির্দেশিকা সেটগুলি আপনাকে ক্যারি রেজিস্টারে ফলাফলের সাথে বাম / ডানে ঘোরানো বা শিফট করার অনুমতি দেয়, সুতরাং আপনি 34 টি নির্দেশে উপরোক্ত কাজটি সম্পাদন করতে পারেন: অ্যারের শুরুতে একটি পয়েন্টার লোড করুন, বাহনটি সাফ করুন, এবং 32 8- সম্পাদন করুন পয়েন্টারে স্বতঃবৃদ্ধি ব্যবহার করে ডান-শিফ্ট বিট করুন।

    অন্য উদাহরণের জন্য, এখানে রৈখিক প্রতিক্রিয়া শিফট রেজিস্টারগুলি (এলএফএসআর) রয়েছে যা মার্জিকভাবে সমাবেশে সঞ্চালিত হয়: এন বিটগুলির একটি অংশ নিন (8, 16, 32, 64, 128, ইত্যাদি), পুরো জিনিসটি 1 দ্বারা শিফট করুন (উপরে দেখুন দেখুন) অ্যালগরিদম), তারপরে যদি ফলাফল বহন করা হয় তবে আপনি কিছুটা প্যাটার্নে XOR বহন করেন যা বহুপদীকে উপস্থাপন করে।

এটি বলার পরে, যদি আমার গুরুতর পারফরম্যান্সের বাধা না থাকে তবে আমি এই কৌশলগুলি অবলম্বন করব না। অন্যরা যেমন বলেছে, সি কোডের চেয়ে ডকুমেন্ট / ডিবাগ / পরীক্ষা / রক্ষণাবেক্ষণ করা সমাবেশকে আরও শক্ত করে: পারফরম্যান্স লাভটি কিছু গুরুতর ব্যয় নিয়ে আসে।

সম্পাদনা করুন: ৩. ওভারফ্লো সনাক্তকরণ সমাবেশে সম্ভব (সত্যিকার অর্থে এটি সি তে পারেন না), এটি কিছু অ্যালগোরিদমকে আরও সহজ করে তোলে।


23

সংক্ষিপ্ত উত্তর? কখনও কখনও।

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

সি প্রোগ্রামিং ল্যাঙ্গুয়েজ - এমন একটি ভাষা যা সমাবেশ ভাষার শক্তির সাথে সমাবেশ ভাষার নমনীয়তার সংমিশ্রণ করে।

এটি মজার কারণ এটি সত্য: সি পোর্টেবল অ্যাসেম্বলি ভাষার মতো।

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

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

আমি আপনাকে এই সব বলছি কারণ সি এবং এসেম্বলারের গতি সম্পর্কে কোনও কম্বল বিধি নেই কারণ সিটির কোনও উদ্দেশ্য মান নেই

তেমনি, আপনি কী প্রসেসরটি চালাচ্ছেন, আপনার সিস্টেমের অনুমান, কোন নির্দেশিকা সেট আপনি ব্যবহার করছেন এবং তার উপর নির্ভর করে এসেম্বলারের মধ্যে অনেক পরিবর্তন হয়। Icallyতিহাসিকভাবে দুটি সিপিইউ আর্কিটেকচার পরিবার হয়েছে: সিআইএসসি এবং আরআইএসসি। সিআইএসসির বৃহত্তম খেলোয়াড় ছিলেন এবং এখনও ইন্টেল x86 আর্কিটেকচার (এবং নির্দেশিকা সেট)। ইউএনআইএক্স বিশ্বে আরআইএসসি আধিপত্য বিস্তার করেছিল (এমআইপিএস 6000, আলফা, স্পার্ক এবং আরও অনেক কিছু)। হৃদয় ও মনের লড়াইয়ে সিআইএসসি জিতেছিল।

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

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

এখনও আপনি এসেম্বলারের মধ্যে অপ্টিমাইজেশন তৈরি করতে পারেন যা কোনও সংকলক তৈরি করতে পারে না এবং একটি ভালভাবে লেখা এসেমব্লার অ্যালগোথার্ম এর সমতুল্যর তুলনায় তত দ্রুত বা দ্রুত হবে। আরও বড় প্রশ্নটি: এটির কি মূল্য?

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


অ্যাকর্ন মেশিনে (90 এর দশকের গোড়ার দিকে) পছন্দের ভাষা হিসাবে এআরএম এসেম্বলারের বেশিরভাগ লোক ব্যবহার করেছিলেন। আইআইআরসি তারা বলেছিল যে ছোট রিস্ক নির্দেশিকা সেট এটিকে সহজ এবং মজাদার করে তুলেছে। তবে আমি সন্দেহ করি কারণ সি সংকলকটি অ্যাকর্নের দেরিতে আগমন করেছিল এবং সি ++ সংকলকটি কখনই শেষ হয়নি।
অ্যান্ড্রু এম

3
"... কারণ সি এর জন্য কোন সাবজেক্টিভ স্ট্যান্ডার্ড নেই।" আপনি উদ্দেশ্য বলতে চাই ।
থমাস

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

1
@ অ্যান্ড্রুএম: ভাল, আসলে এআরএম হ'ল এক ধরণের আরআইএসসি পিছনের দিকে করা। অন্যান্য আরআইএসসি আইএসএগুলি সংকলক কী ব্যবহার করবে তা দিয়ে শুরু করে নকশা করা হয়েছিল। এআরএম আইএসএ সিপিইউ যা সরবরাহ করে তা শুরু করে নকশাকৃত করা হয়েছে বলে মনে হয় (ব্যারেল শিফটার, শর্তের পতাকা - আসুন প্রতিটি নির্দেশেই তাদের প্রকাশ করি)।
নিনজালজ

16

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

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

সিপিইউয়ের এনওপি (কোনও অপারেশন - কিছুই করবেন না) নির্দেশনা আসলে আপনার পুরো অ্যাপ্লিকেশনটিকে দ্রুত চালিত করতে পারে এর আর একটি কারণ।

[সম্পাদনা] অবশ্যই, কৌশলটি একটি নির্দিষ্ট হার্ডওয়্যার সেটআপের উপর নির্ভর করে। যা অনেকগুলি অমিগা গেমগুলি দ্রুত সিপিইউগুলির সাথে মোকাবিলা করতে না পারার মূল কারণ: নির্দেশনার সময় বন্ধ ছিল off


অমিগা চিপস্যামের উপর ভিত্তি করে 512 কেবি থেকে 2 মেগাবাইটের মতো চিপ র‌্যামের 16 এমবি নেই। এছাড়াও, আপনার বর্ণনার মতো কৌশলগুলির কারণে প্রচুর অ্যামিগা গেম দ্রুত সিপিইউ নিয়ে কাজ করে না।
বি কে 1 ই

1
@ বি কে 1 ই - অমিগা বিভিন্ন মডেলের কম্পিউটারের বিস্তৃত উত্পাদন করেছে, এমিগা 500 আমার ক্ষেত্রে 112 মেগারে প্রসারিত 512 কে র‌্যাম সহ প্রেরণ করেছে। amigahistory.co.uk/amiedevsys.html 128 মেগ রাম সহ একটি অ্যামিগা
ডেভিড ওয়াটারস

@ বিকে 1 ই: আমি সংশোধন করে দাঁড়িয়ে আছি। আমার স্মৃতি আমার ব্যর্থ হতে পারে তবে চিপ র‌্যামটি প্রথম 24 বিট ঠিকানার জায়গার (যেমন 16 এমবি) সীমাবদ্ধ ছিল না? এবং দ্রুত এর উপরে ম্যাপ করা হয়েছিল?
অ্যারন ডিজুল্লা

: @Aaron Digulla: উইকিপিডিয়া চিপ / ফাস্ট / ধীর র্যাম মধ্যে প্রভেদ সম্পর্কে আরও তথ্য রয়েছে en.wikipedia.org/wiki/Amiga_Chip_RAM
bk1e

@ বিকে 1 ই: আমার ভুল 68k সিপিইউতে কেবল 24 টি ঠিকানা লেন ছিল, এ কারণেই আমার মাথায় 16 এমবি ছিল।
অ্যারন ডিজুল্লা

15

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

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

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

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

  1. একটি বিদ্যমান বৈশিষ্ট্য সরান
  2. কিছু বা সমস্ত বিদ্যমান বৈশিষ্ট্যগুলির আকার হ্রাস করুন সম্ভবত পারফরম্যান্সের ব্যয়ে।
  3. উচ্চতর ব্যয়, উচ্চ বিদ্যুত ব্যবহার এবং বৃহত্তর ফর্ম ফ্যাক্টর সহ একটি বৃহত্তর চিপে সরানোর পক্ষে পরামর্শ করুন।

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

আমি জানি যে "আমি এসেম্বলার শিখি কেন" এই প্রশ্নের উত্তর আমি অনেক বেশি দিয়েছি তবে আমি মনে করি এটি তখন আরও তাত্পর্যপূর্ণ একটি গুরুত্বপূর্ণ প্রশ্ন it

সুতরাং একবার চেষ্টা করতে দিন আপনার সমাবেশ সম্পর্কে চিন্তা করা উচিত

  • নিম্ন স্তরের অপারেটিং সিস্টেমের কাজ করে
  • একটি সংকলক নিয়ে কাজ করা।
  • অত্যন্ত সীমাবদ্ধ চিপ, এমবেডেড সিস্টেম ইত্যাদি নিয়ে কাজ করা

কোনটি দ্রুত / আরও ছোট / আরও ভাল তা দেখতে আপনার সমাবেশটি উত্পন্ন সংকলকের সাথে তুলনা করতে ভুলবেন না।

ডেভিড।


4
ক্ষুদ্র চিপগুলিতে এম্বেড করা অ্যাপ্লিকেশন বিবেচনা করার জন্য +1। এখানে প্রচুর সফ্টওয়্যার প্রকৌশলী হয় এম্বেডকে বিবেচনা করবেন না বা মনে করবেন না এর অর্থ একটি স্মার্ট ফোন (32 বিট, এমবি র‌্যাম, এমবি ফ্ল্যাশ)।
মার্টিন

1
সময় এম্বেড থাকা অ্যাপ্লিকেশনগুলি একটি দুর্দান্ত উদাহরণ! সেখানে প্রায়ই অদ্ভুত নির্দেশাবলী (AVR মত এমনকি অত্যন্ত সহজ বেশী sbiএবং cbi) যে কম্পাইলার ব্যবহার করা (এবং কখনও কখনও এখনও), পূর্ণ সুবিধা নিতে হার্ডওয়্যার তাদের সীমিত জ্ঞান কারণে।
ফেলিক্সহো

15

আমি অবাক হয়েছি কেউ এ কথা বলেনি। strlen()ফাংশন অনেক দ্রুত যদি সমাবেশ লেখা হয়! সি তে, আপনি করতে পারেন সর্বোত্তম জিনিস

int c;
for(c = 0; str[c] != '\0'; c++) {}

সমাবেশে থাকাকালীন আপনি এটিকে যথেষ্ট গতিময় করতে পারেন:

mov esi, offset string
mov edi, esi
xor ecx, ecx

lp:
mov ax, byte ptr [esi]
cmp al, cl
je  end_1
cmp ah, cl
je end_2
mov bx, byte ptr [esi + 2]
cmp bl, cl
je end_3
cmp bh, cl
je end_4
add esi, 4
jmp lp

end_4:
inc esi

end_3:
inc esi

end_2:
inc esi

end_1:
inc esi

mov ecx, esi
sub ecx, edi

দৈর্ঘ্য একেক্সে হয়। এটি সময়ে 4 টি অক্ষরের তুলনা করে, তাই এটি 4 গুণ দ্রুত। এবং ভাবুন যে ইয়েল এবং ইবিএক্সের হাই অর্ডার শব্দটি ব্যবহার করে এটি আগের সি রুটিনের চেয়ে 8 গুণ দ্রুততর হবে !


3
এটি কীভাবে strchr.nfshost.com/optimized_strlen_function এর সাথে তুলনা করে ?
নিনজালজ

@ নিনজালজ: এগুলি একই জিনিস :) আমি ভাবিনি যে এটি
সিতে এইভাবে

সি কোডে প্রতিটি তুলনার আগে এখনও কিছুটা বিপরীত এবং অপারেশন রয়েছে। এটি কম এবং উচ্চ বাইট তুলনা কমাতে কমপাইলার যথেষ্ট স্মার্ট হতে পারে এটি সম্ভব, তবে আমি এটিতে অর্থ বাজি ধরব না। প্রকৃতপক্ষে একটি দ্রুত লুপ অ্যালগরিদম রয়েছে যা সম্পত্তির উপর ভিত্তি করে (word & 0xFEFEFEFF) & (~word + 0x80808080)শূন্য হয় যদি শব্দটির সমস্ত বাইট শূন্য হয়।
ব্যবহারকারী 2310967

@ মিচাওয়েডেনম্যান সত্য, দুটি অক্ষরের সাথে কুড়াল তুলনা করার পরে আমার বিএক্স লোড করা উচিত। আপনাকে ধন্যবাদ
ব্ল্যাকবিয়ার

14

সিমডি নির্দেশাবলী ব্যবহার করে ম্যাট্রিক্স অপারেশন সম্ভবত সংকলক উত্পাদিত কোডের চেয়ে দ্রুত is


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

কম্পাইলার, SSE সচেতন কোড তৈরি যাতে যুক্তি সত্য নয়
vartec

5
সেই পরিস্থিতিতে বেশিরভাগ ক্ষেত্রে আপনি এসেম্বলির পরিবর্তে এসএসই ইন্ট্রিজিকগুলি ব্যবহার করতে পারেন। এটি আপনার কোডটিকে আরও পোর্টেবল করে তুলবে (জিসিসি ভিজ্যুয়াল সি ++, 64 বিট, 32 বিট ইত্যাদি) এবং আপনাকে নিবন্ধকরণ বরাদ্দ করতে হবে না।
লেসারাল্লান

1
নিশ্চয়ই আপনি যাবেন, তবে সি এর পরিবর্তে আমার কোথায় এসেম্বলি ব্যবহার করা উচিত প্রশ্নটি জিজ্ঞাসা করেনি যখন সি সংকলক আরও ভাল কোড জেনারেট করে না। আমি এমন একটি সি উত্স ধরে নিয়েছি যা সরাসরি এসএসই কল বা ইনলাইন অ্যাসেমবিলি ব্যবহার করে না।
মেহরদাদ আফশারি

9
যদিও মেহরদাদ ঠিক আছে। সংস্থাপকের জন্য এসএসই সঠিকভাবে পাওয়া বেশ শক্ত এবং স্পষ্টতই (মানুষের ক্ষেত্রে, এটি) বেশিরভাগ সংকলক এটি ব্যবহার করে না।
কনরাড রুডল্ফ

13

আমি নির্দিষ্ট উদাহরণগুলি দিতে পারছি না কারণ এটি অনেক বছর আগে ছিল, তবে হাতে-লিখিত এসেম্বলার যে কোনও সংকলককে সম্পাদন করতে পারত এমন প্রচুর কেস ছিল। কারণে:

  • আপনি কনভেনশন আহ্বান করা থেকে রেজিস্টারগুলিতে তর্ক করতে পারতেন।

  • আপনি কীভাবে নিবন্ধগুলি ব্যবহার করবেন এবং মেমরিতে ভেরিয়েবলগুলি সঞ্চয় করা এড়াতে সাবধানতার সাথে বিবেচনা করতে পারেন।

  • জাম্প টেবিলের মতো জিনিসের জন্য, আপনি সূচককে সীমাবদ্ধ করে পরীক্ষা করতে পারবেন না could

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

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

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

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

যোগ করা হয়েছে: আমি সমাবেশের ভাষায় প্রচুর পরিমাণে লিখিত অ্যাপ্লিকেশন দেখেছি এবং সি, পাস্কাল, ফোর্টরান ইত্যাদির মতো ভাষার উপর মূল গতির সুবিধা হ'ল কারণ এসেম্বলারের কোডিংয়ের সময় প্রোগ্রামার অনেক বেশি সতর্ক ছিল। তিনি বা সে ভাষা নির্বিশেষে দিনে প্রায় 100 টি লাইন কোড লিখতে চলেছেন, এবং একটি সংকলক ভাষায় যা 3 বা 400 নির্দেশাবলীর সমান হতে চলেছে।


8
+1: "আপনি সম্মেলনগুলি আহ্বান থেকে বিচ্যুত হতে পারেন"। সি / সি ++ সংকলকগুলি একাধিক মান ফেরত দেওয়ার ক্ষেত্রে স্তন্যপান করে। তারা প্রায়শই চটজলদি ফর্ম ব্যবহার করে যেখানে কলার স্ট্যাক একটি স্ট্রাক্টের জন্য একটি স্বতন্ত্র ব্লক বরাদ্দ করে এবং কলিটি পূরণ করতে এটির জন্য একটি রেফারেন্স দেয়। নিবন্ধগুলিতে একাধিক মান প্রত্যাবর্তন কয়েকগুণ দ্রুত হয়।
জন হ্যারোপ

1
@ জোন: সি / সি ++ সংকলকগুলি ঠিক সেই কাজটি করেন যখন ফাংশনটি ইনলাইন হয়ে যায় (নন-ইনলাইনড ফাংশনগুলি এবিআইয়ের সাথে মানিয়ে নিতে হয়, এটি সি এবং সি ++ এর সাথে সীমাবদ্ধতা নয় তবে লিঙ্কিং মডেল)
বেন ভয়েগট

@ বেনভয়েগ্ট: এখানে ফ্লাইংফ্রোগব্লগ.ব্লগস্পটকম.উইক / ২০১২ / ২০১৪ / ২২
জোন

2
আমি কোনও ফাংশন কল সেখানে linedুকে পড়ে দেখছি না।
বেন ভয়েগট

13

আমার অভিজ্ঞতা থেকে কয়েকটি উদাহরণ:

  • সি থেকে অ্যাক্সেসযোগ্য নির্দেশাবলীর অ্যাক্সেস উদাহরণস্বরূপ, অনেক আর্কিটেকচার (যেমন x86-64, আইএ -64, ডিসি আলফা, এবং 64-বিট এমআইপিএস বা পাওয়ারপিসি) একটি 64 বিট দ্বারা 128 বিট ফলাফল তৈরি করে একটি 64 বিটকে সমর্থন করে। জিসিসি সম্প্রতি এই জাতীয় নির্দেশের অ্যাক্সেস সরবরাহ করার জন্য একটি এক্সটেনশন যুক্ত করেছিল, তবে তার আগে সমাবেশের প্রয়োজন হয়েছিল। আরএসএ-এর মতো কিছু বাস্তবায়নের সময় এই নির্দেশিকায় অ্যাক্সেস 64৪-বিট সিপিইউগুলিতে বিশাল পার্থক্য আনতে পারে - কখনও কখনও পারফরম্যান্সে 4 টি উন্নতির কারণ হিসাবেও।

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

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

অন্যদিকে, মাল্টিকোর মেশিন এবং বিতরণ সিস্টেমগুলি সবচেয়ে বড় পারফরম্যান্সের বিজয়কে অন্য দিকে সরিয়ে নিয়েছে - সমাবেশে আপনার অভ্যন্তরীণ লুপগুলি লেখার জন্য একটি অতিরিক্ত 20% স্পিডআপ পান, বা একাধিক কোর জুড়ে চালিয়ে 300%, বা 10000% দ্বারা মেশিনগুলির একটি গোষ্ঠী জুড়ে এগুলি চালাচ্ছে। এবং অবশ্যই উচ্চ স্তরের অপ্টিমাইজেশান (ফিউচার, মেমোয়াইজেশন ইত্যাদির মতো জিনিস) এমএল বা স্কালার মতো সি বা এসএম এর চেয়ে উচ্চতর স্তরের ভাষায় করা প্রায়শই সহজ হয় এবং প্রায়শই এটি অনেক বড় পারফরম্যান্সের জয় সরবরাহ করতে পারে। সুতরাং, বরাবরের মতো, এখানেও বাণিজ্য করা উচিত to


2
@ ডেনিস যে কারণে আমি লিখেছিলাম 'অবশ্যই আপনি সমাবেশের পরিবর্তে আন্তঃব্যবস্থা ব্যবহার করতে পারেন তবে একবার আপনি অন্তর্নিহিত স্তরে থাকলে আপনি মূলত যেভাবেই অ্যাসেম্বলি লিখছেন, কেবলমাত্র একটি নিবন্ধক বরাদ্দকারী এবং (নামমাত্র) নির্দেশিকার শিডিয়ুলার হিসাবে সংকলকটি ব্যবহার করে' '
জ্যাক লয়েড

এছাড়াও, অন্তর্নিহিত ভিত্তিক সিমডি কোডটি এসেম্বলারের ক্ষেত্রে লিখিত একই কোডের চেয়ে কম পঠনযোগ্য বলে মনে হয়: অনেকগুলি সিমডি কোড ভেক্টরগুলিতে ডেটাগুলির অন্তর্নিহিত পুনরায় ব্যাখ্যার উপর নির্ভর করে, যা একটি পিআইটিএ ডেটা টাইপ সংকলক অন্তর্নিজ্ঞাগুলি সরবরাহ করে।
মাস্টার

10

আঁট লুপগুলি যেমন চিত্রগুলির সাথে খেলতে পারা যায়, যেহেতু কোনও চিত্র লক্ষ লক্ষ পিক্সেল নিয়ে তৈরি হতে পারে। বসে থাকা এবং সীমিত সংখ্যক প্রসেসরের রেজিস্টারগুলির কীভাবে সর্বোত্তম ব্যবহার করা যায় তা নির্ধারণ করা একটি পার্থক্য করতে পারে। বাস্তব জীবনের নমুনা এখানে:

http://danbystrom.se/2008/12/22/optimizing-away-ii/

তারপরে প্রায়শই প্রসেসরগুলির কাছে কিছু রহস্যজনক নির্দেশাবলী থাকে যা সংকলককে বিরক্ত করার জন্য খুব বিশেষীকরণ করা হয় তবে উপলক্ষে কোনও এসেমব্লার প্রোগ্রামার সেগুলির ভাল ব্যবহার করতে পারে। উদাহরণস্বরূপ XLAT নির্দেশ গ্রহণ করুন Take সত্যিই দুর্দান্ত যদি আপনাকে কোনও লুপে টেবিলের চেহারাগুলি করতে হয় এবং টেবিলটি 256 বাইটের মধ্যে সীমাবদ্ধ থাকে!

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


3
প্রোফাইল নির্দেশিত অপ্টিমাইজেশন কতবার একটি লুপ ব্যবহৃত হয় সে সম্পর্কে সংকলককে তথ্য দেয়।
Zan Lynx

10

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

উদাহরণস্বরূপ পূর্ণসংখ্যা প্রচার। আপনি যদি সি-তে একটি চার্ট পরিবর্তনশীল স্থানান্তর করতে চান তবে একজন সাধারণত আশা করে যে কোডটি বাস্তবে ঠিক এমনটি করবে, একটি বিট শিফট।

মানকগুলি, পরিবর্তনের পূর্বে একটি চিহ্নটি প্রসারিত করার জন্য সংকলকটি প্রয়োগ করে এবং ফলাফলটি চার্টের পরে কেটে ফেলা হয় যা লক্ষ্য প্রসেসরের আর্কিটেকচারের উপর নির্ভর করে কোডকে জটিল করে তুলতে পারে।


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

9

আপনি কি জানেন না যে আপনার লিখিত সি কোডটি আসলেই দ্রুত কিনা আপনি যদি সংকলকটি কী উত্পাদন করে তা ডিসপোজারের দিকে নজর না দিয়ে থাকেন। অনেকবার আপনি এটি দেখুন এবং দেখতে পাবেন যে "ভাল-লিখিত" বিষয়গত ছিল।

সুতরাং এখন পর্যন্ত দ্রুততম কোড পেতে এসেম্বলারের মধ্যে লেখার প্রয়োজন নেই, তবে খুব সম্ভবত একই কারণে এসেম্বলারকে জানা ভাল।


2
"সুতরাং দ্রুততম কোড পাওয়ার জন্য এসেম্বলারের মধ্যে লেখার দরকার নেই" ভাল, আমি কোনও সংকলককে তুচ্ছ নয় এমন কোনও ক্ষেত্রে অনুকূল কাজ করতে দেখিনি। একজন অভিজ্ঞ মানুষ কার্যত সমস্ত ক্ষেত্রে সংকলকের চেয়ে আরও ভাল করতে পারে। সুতরাং, "এখন পর্যন্ত দ্রুততম কোড" পাওয়ার জন্য এসেম্বলারে লিখতে একেবারে প্রয়োজনীয়।
মাস্টার

@cmaster আমার অভিজ্ঞতা সংকলক আউটপুট ভাল, এলোমেলো। কখনও কখনও এটি সত্যই ভাল এবং সর্বোত্তম এবং কখনও কখনও "এই আবর্জনাটি কীভাবে নির্গত হতে পারে" is
ধারালো টুথ

9

আমি সব উত্তর (30 বেশী) পড়েছেন এবং একটি সহজ কারণ খুঁজে পান না: প্রতীকী ভাষান্তর সি চেয়ে দ্রুত আপনি পড়তে এবং চর্চা আছে Intel 64 এবং IA-32 আর্কিটেকচারের অপ্টিমাইজেশান রেফারেন্স ম্যানুয়াল , কারণ কেন সমাবেশ may ধীর হতে হবে এমন লোকেরা যারা এই ধীরে ধীরে ধীরে ধীরে সমাবেশ লেখেন তারা অনুকূলিতকরণ ম্যানুয়ালটি পড়েন নি

ইন্টেল 80286 এর ভাল পুরানো দিনগুলিতে প্রতিটি নির্দেশ সিপিইউ চক্রের একটি নির্দিষ্ট গণনায় কার্যকর করা হয়েছিল, তবে 1995 সালে প্রকাশিত পেন্টিয়াম প্রো, ইন্টেল প্রসেসরগুলি সুপারপ্লেয়ার হয়ে উঠেছে, কমপ্লেক্স পাইপলাইনিং ব্যবহার করে: আউট-অফ-অর্ডার এক্সিকিউশন এবং রেজিস্টার নামকরণ। এর আগে, 1993 সালে পেন্টিয়াম উত্পাদিত হয়েছিল, সেখানে ইউ এবং ভি পাইপলাইনগুলি ছিল: দ্বৈত পাইপ লাইনগুলি একটি ঘড়ির চক্রের দুটি সহজ নির্দেশনা কার্যকর করতে পারে যদি তারা একে অপরের উপর নির্ভর না করে; তবে পেন্টিয়াম প্রো-এ-অফ-অর্ডার এক্সিকিউশন এবং রেজিস্টার পুনর্নবীকরণটি কী দেখা গেছে তার তুলনা করার মতো এটি কিছুই ছিল না এবং আজকাল প্রায় অপরিবর্তিত রয়েছে।

কয়েকটি শব্দে ব্যাখ্যা করার জন্য, দ্রুততম কোডটি হ'ল নির্দেশাবলী পূর্ববর্তী ফলাফলের উপর নির্ভর করে না, উদাহরণস্বরূপ আপনার সর্বদা পুরো রেজিস্টারগুলি মুভ করা উচিত (মুভিজেক্স দ্বারা) অথবা add rax, 1পরিবর্তে ব্যবহার করুন বাinc rax আগের পতাকাগুলির স্থিতির উপর নির্ভরতা অপসারণ করা ইত্যাদি

আপনি আউট-অফ-অর্ডার এক্সিকিউশন এবং রেজিস্টার পুনর্নবীকরণ সম্পর্কে আরও পড়তে পারেন যদি সময় অনুমতি দেয় তবে ইন্টারনেটে প্রচুর তথ্য পাওয়া যায়।

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

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


8

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


7

এটি আপনার কাজের চাপের উপর নির্ভর করে।

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

এগুলি সাধারণত সিপিইউ নির্দিষ্ট চিপসেট এক্সটেনশনগুলি (এমএমই / এমএমএক্স / এসএসই / যাই হোক না কেন) ব্যবহার করে যা এই ধরণের অপারেশনের জন্য সুরযুক্ত।


6

আমার বিট প্রতিস্থাপনের একটি অপারেশন রয়েছে যা 192 বা 256 বিট প্রতি বিঘ্নিত হওয়াতে প্রতি 50 মাইক্রোসেকেন্ডে ঘটে happens

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


6

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



5

সহজ উত্তর ... যিনি সমাবেশ সম্পর্কে ভাল জানেন (ওরফে তার পাশে রেফারেন্স রয়েছে, এবং প্রতিটি ছোট প্রসেসর ক্যাশে এবং পাইপলাইন বৈশিষ্ট্য ইত্যাদি গ্রহণ করছেন) যে কোনও সংকলকের তুলনায় অনেক দ্রুত কোড তৈরি করতে সক্ষম হওয়ার গ্যারান্টিযুক্ত ।

তবে এই দিনগুলিতে পার্থক্যটি কেবলমাত্র সাধারণ অ্যাপ্লিকেশনটিতে কিছু যায় আসে না।


1
আপনি "প্রচুর সময় এবং প্রচেষ্টা দেওয়া", এবং "একটি রক্ষণাবেক্ষণ দুঃস্বপ্ন তৈরি" বলতে ভুলে গেছেন। আমার এক সহকর্মী ওএস কোডের পারফরম্যান্স-সমালোচনামূলক বিভাগটি অনুকূলকরণের জন্য কাজ করছিলেন, এবং তিনি এসেম্বলির চেয়ে সি-তে আরও বেশি কাজ করেছিলেন, কারণ এটি তাকে যুক্তিসঙ্গত সময়সীমার মধ্যে উচ্চ-স্তরের পরিবর্তনের পারফরম্যান্স প্রভাব তদন্ত করতে দেয়।
আর্টেলিয়াস

আমি রাজী. কখনও কখনও আপনি সময় বাঁচাতে এবং দ্রুত বিকাশের জন্য সমাবেশ কোড উত্পন্ন করতে ম্যাক্রো এবং স্ক্রিপ্টগুলি ব্যবহার করেন। আজকাল বেশিরভাগ সমাবেশকারীদের ম্যাক্রো রয়েছে; যদি তা না হয় তবে পার্ল স্ক্রিপ্টটি ব্যবহার করে আপনি একটি (সাধারণ) ম্যাক্রো প্রসেসর তৈরি করতে পারেন।

এই. অবিকল। ডোমেন বিশেষজ্ঞদের পরাজিত করার সংকলকটি এখনও আবিষ্কার হয়নি।
মাস্টার - মনিকা

4

পলিপ্যাস্কেলের সিপি / এম-86 version সংস্করণের অন্যতম সম্ভাবনা ("ভাইবোন-থেকে-আউটপুট-অক্ষর-থেকে-স্ক্রিনে" ব্যবহার করতে "মেশিন ল্যাঙ্গুয়েজ রুটিনের সাহায্যে প্রয়োজনীয় বৈশিষ্ট্যটি প্রতিস্থাপন করা ছিল) সেখানে x, এবং y এবং স্ট্রিংটি দেওয়া হয়েছিল।

এটি স্ক্রিনটিকে অনেক বেশি দ্রুত আপডেট করার অনুমতি দিয়েছে, আগের চেয়ে অনেক দ্রুত!

বাইনারিটিতে এম্বেড করার জন্য মেশিন কোডের জায়গা ছিল (কয়েকশ বাইট) এবং সেখানে অন্যান্য স্টাফগুলিও ছিল, তাই যথাসম্ভব কমিয়ে নেওয়া প্রয়োজনীয় ছিল।

এটি দেখা যাচ্ছে যেহেতু স্ক্রিনটি 80x25 ছিল উভয় স্থানাঙ্ক প্রতিটি বাইটে ফিট করতে পারে, তাই উভয়ই দুটি বাইট শব্দের সাথে ফিট করতে পারে। এটি একটি মাত্র যুক্ত উভয় মান একই সাথে হেরফের করতে পারে তাই এটি কম বাইটে প্রয়োজনীয় গণনাগুলি করার অনুমতি দেয়।

আমার জানা মতে এমন কোনও সি কম্পাইলার নেই যা একটি রেজিস্টারে একাধিক মানকে একীভূত করতে পারে, সেগুলিতে সিমডি নির্দেশনা রাখুন এবং সেগুলি পরে আবার বিভক্ত করুন (এবং আমি মনে করি না যে মেশিনের নির্দেশাবলী যাইহোক ছোট হবে) be


4

মেম্বার আব্রাশের টেক্সচার ম্যাপিং লুপ থেকে ( সমাবেশে এখানে বিশদভাবে প্রকাশিত হয়েছে ) অ্যাসেমব্লির অন্যতম বিখ্যাত স্নিপেট :

add edx,[DeltaVFrac] ; add in dVFrac
sbb ebp,ebp ; store carry
mov [edi],al ; write pixel n
mov al,[esi] ; fetch pixel n+1
add ecx,ebx ; add in dUFrac
adc esi,[4*ebp + UVStepVCarry]; add in steps

আজকাল বেশিরভাগ সংকলকগুলি উন্নত সিপিইউ নির্দিষ্ট নির্দেশাবলী আন্তঃব্যক্তি হিসাবে প্রকাশ করে, অর্থাত্ ফাংশন যা প্রকৃত নির্দেশের জন্য সংকলিত হয়। এমএস ভিজ্যুয়াল সি ++ এমএমএক্স, এসএসই, এসএসই 2, এসএসই 3, এবং এসএসই 4-র জন্য অন্তর্নিহিত সমর্থন করে, সুতরাং প্ল্যাটফর্ম নির্দিষ্ট নির্দেশাবলীর সুবিধা নিতে আপনাকে সমাবেশে নামার বিষয়ে কম চিন্তা করতে হবে। যথাযথ / এআরএইচ সেটিং দ্বারা আপনি যে প্রকৃত আর্কিটেকচারকে লক্ষ্য করে আসছেন সেগুলিও ভিজ্যুয়াল সি ++ গ্রহণ করতে পারে।


আরও ভাল, এই এসএসই অন্তর্নিহিতগুলি ইন্টেল দ্বারা নির্দিষ্ট করা হয়েছে যাতে তারা প্রকৃতপক্ষে মোটামুটি বহনযোগ্য।
জেমস

4

সঠিক প্রোগ্রামার দেওয়া, এসেমব্লার প্রোগ্রামগুলি সর্বদা তাদের সি সহযোগীদের (কমপক্ষে প্রান্তিক) তুলনায় দ্রুত তৈরি করা যায়। এমন একটি সি প্রোগ্রাম তৈরি করা কঠিন হবে যেখানে আপনি এসেমব্লারের কমপক্ষে একটি নির্দেশনা গ্রহণ করতে পারেন নি।


এটি আরও কিছুটা সঠিক হতে হবে: "একটি নন্ট্রাইভিয়াল সি প্রোগ্রাম তৈরি করা কঠিন যেখানে ..." বিকল্প হিসাবে আপনি বলতে পারেন: " এমন একটি বাস্তব-বিশ্বের সি প্রোগ্রাম খুঁজে পাওয়া কঠিন হবে যেখানে ..." পয়েন্টটি , তুচ্ছ লুপ রয়েছে যার জন্য সংকলকরা সর্বোত্তম আউটপুট উত্পাদন করে। তবুও, ভাল উত্তর।
মাস্টার - মনিকা


4

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


8
জিসিসি অত্যন্ত স্মার্ট "প্ল্যাটফর্ম-স্বতন্ত্র" অপটিমাইজেশন করে। যাইহোক, নির্দিষ্ট নির্দেশাবলী তাদের সম্পূর্ণরূপে সেট করতে এটি এতটা ভাল নয়। যেমন একটি পোর্টেবল সংকলক এটি খুব ভাল কাজ করে।
আর্টেলিয়াস

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

+1: জিসিসি অবশ্যই দ্রুত কোড উত্পন্ন করতে প্রতিযোগিতামূলক নয় তবে আমি নিশ্চিত নই যে এটি পোর্টেবল। এলএলভিএম পোর্টেবল এবং আমি এটি জিসিসির চেয়ে দ্রুত 4x কোড উত্পন্ন করতে দেখেছি।
জন হ্যারোপ

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

4

লংপোক, কেবল একটি সীমাবদ্ধতা: সময়। কোডে প্রতিটি পরিবর্তনকে অনুকূলিতকরণ এবং রেজিস্টারগুলি বরাদ্দ করতে আপনার সময় ব্যয় করার জন্য যখন আপনার কাছে সংস্থান নেই, তখন কয়েকটি স্পিল দূরে এবং কী নয়, সংকলকটি প্রতিটি সময় জিতবে single আপনি কোডটিতে আপনার পরিবর্তনটি করেন, পুনরায় রচনা এবং পরিমাপ করেন। প্রয়োজনে পুনরাবৃত্তি করুন।

এছাড়াও, আপনি উচ্চ-স্তরের দিক থেকে অনেক কিছু করতে পারেন। এছাড়াও, ফলস্বরূপ অ্যাসেমবিলিটি পরিদর্শন করা এই কোডটি ছদ্মরূপে চাপিয়ে দেওয়ার তাগিদ দিতে পারে, তবে বাস্তবে এটি আপনার গতিবেগের চেয়ে দ্রুত চলবে than উদাহরণ:

int y = ডেটা [i]; // এখানে কিছু জিনিস করুন .. কল_ফানশন (y, ...);

সংকলক তথ্যটি পড়বে, স্ট্যাকের দিকে চাপ দেবে (স্পিল) এবং পরে স্ট্যাক থেকে পড়বে এবং যুক্তি হিসাবে পাস করবে। শিট লাগছে? এটি আসলে খুব কার্যকর ক্ষতিকারক ক্ষতিপূরণ এবং দ্রুত রানটাইমের ফলাফল হতে পারে।

// অপ্টিমাইজড সংস্করণ কল_ফানশন (ডেটা [i], ...); // সর্বোপরি অপ্টিমাইজড না ..

অপ্টিমাইজড সংস্করণ সহ ধারণাটি ছিল, আমরা নিবন্ধের চাপ হ্রাস করেছি এবং স্পিলিং এড়াতে পারি। তবে সত্য, "ছিটে" সংস্করণটি দ্রুত ছিল!

সমাবেশ কোডটির দিকে তাকানো, কেবল নির্দেশাবলীর দিকে তাকানো এবং শেষ করা: আরও নির্দেশাবলীর ধীর গতি একটি ভুল বিচার হবে।

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

  • স্মৃতিশক্তি ধীর
  • ক্যাশে দ্রুত
  • আরও ক্যাশে ব্যবহার করার চেষ্টা করুন
  • আপনি কতবার মিস করবেন? আপনার কি বিলম্বিত ক্ষতিপূরণ কৌশল আছে?
  • আপনি একটি একক ক্যাশে মিসের জন্য 10-100 ALU / FPU / SSE নির্দেশাবলী কার্যকর করতে পারেন
  • অ্যাপ্লিকেশন আর্কিটেকচার গুরুত্বপূর্ণ ..
  • .. কিন্তু সমস্যা যখন আর্কিটেকচারে না থাকে তখন এটি কোনও লাভ হয় না

এছাড়াও, যাদুকরীভাবে দুর্বল-চিন্তিত সি / সি ++ কোডকে "তাত্ত্বিকভাবে সর্বোত্তম" কোডে রূপান্তরিত করার জন্য যাদুকরভাবে যাতায়াত করে খুব বেশি বিশ্বাস করা ইচ্ছাবাদী চিন্তাভাবনা। আপনি যদি এই নিম্ন-স্তরের "পারফরম্যান্স" সম্পর্কে যত্নবান হন তবে আপনাকে যে সংকলক এবং সরঞ্জাম চেইন ব্যবহার করছেন তা আপনাকে জানতে হবে।

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

এই বিষয়টি একটি ডেড-এন্ডের কিছুটা; বেশিরভাগ ক্ষেত্রে এটি প্রাসঙ্গিক নয় এবং বাকী তারা জানে যে তারা ইতিমধ্যে কী করছে।

এগুলি এ পর্যন্তই ফুটে উঠেছে: "আপনি কী করছেন তা বোঝার জন্য", আপনি কী করছেন তা জেনে নেওয়া কিছুটা আলাদা।

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