c - ২০১৯ - কখন সমাবেশ চেয়ে দ্রুত সমাবেশ হয়?




মুখ্যমন্ত্রী কিভাবে নির্বাচিত হয় (20)

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

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

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

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

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

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


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

#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

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

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


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

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

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

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

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

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

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

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

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

দ্রুত / ছোট / ভাল যা দেখতে কম্পাইলার আপনার সমাবেশ তুলনা মনে রাখবেন।

ডেভিড।


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

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

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

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


কোন নির্দিষ্ট উদাহরণ বা প্রোফাইলের প্রমাণ ছাড়া, আপনি কম্পাইলার তুলনায় আরো জানেন যখন আপনি কম্পাইলার তুলনায় ভাল অ্যাডাব্লারার লিখতে পারেন।

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

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

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


যদিও সিটি 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. কিছু bitshifting অপারেশন (ঘূর্ণন / বহন):

    // 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- বিন্দু ডান শিফট, পয়েন্টার স্বয়ংক্রিয় বৃদ্ধি।

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

যে বলেন, আমি গুরুতর কর্মক্ষমতা সীমাবদ্ধতা ছিল না, আমি এই কৌশল অবলম্বন করবে না। অন্যরা বলেছে যে, সি কোডের চেয়ে ডকুমেন্ট / ডিবাগ / পরীক্ষা / বজায় রাখার জন্য সমাবেশটি অনেক কঠিন: কর্মক্ষমতা বৃদ্ধি কিছু গুরুতর খরচ সহ আসে।

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


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

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

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

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

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

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

আমি আপনাকে এই সব বলি কারণ C এবং অ্যাসবেলারের গতি সম্পর্কে কোন কম্বল নিয়ম নেই কারণ সিটির জন্য কোনও আদর্শ মান নেই।

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

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

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

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

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



আপনি যা মনে করেন তার চেয়ে বেশি, সিটিকে সিলেক্টর কোডারের দৃষ্টিকোণ থেকে অযৌক্তিক বলে মনে করা উচিত, কারণ সি মানগুলি তাই বলে।

ইন্টিগ্রেশন প্রচার, উদাহরণস্বরূপ। যদি আপনি C তে একটি গৃহস্থালি পরিবর্তনশীলকে সরাতে চান তবে সাধারণত এটি আশা করবে যে কোডটি কেবলমাত্র একটি বিট স্থানান্তর করবে।

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


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

  • সি থেকে অ্যাক্সেসযোগ্য নয় এমন নির্দেশাবলী অ্যাক্সেস করুন। উদাহরণস্বরূপ, অনেক আর্কিটেকচার (যেমন x86-64, IA-64, DEC Alpha, এবং 64-bit MIPS বা PowerPC) একটি 64 বিট ফলাফলের 64 বিট গুণমান দ্বারা 64 বিট সমর্থন করে। জিसीसी সম্প্রতি এই ধরনের নির্দেশাবলী অ্যাক্সেস প্রদান একটি এক্সটেনশান যোগ করা, কিন্তু যে সমাবেশ আগে প্রয়োজন ছিল। এবং এই নির্দেশের অ্যাক্সেস 64-বিট CPU- এ কিছুটা কার্যকর করার সময় একটি বিশাল পার্থক্য তৈরি করতে পারে - কখনও কখনও কর্মক্ষমতাতে 4 টি উন্নতির একটি ফ্যাক্টর হিসাবে।

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

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

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


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


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

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

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


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


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


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

সুতরাং দ্রুততম কোড পেতে এসবেলারে লিখতে হবে না, তবে অবশ্যই একই কারণের জন্য অ্যাডমিনরকে অবশ্যই জানতে হবে।


আমি অবাক হচ্ছি কেউ এই বলেনি। 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

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


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


টাইট loops, ইমেজ সঙ্গে খেলা যখন মত, একটি ইমেজ লক্ষ লক্ষ পিক্সেল cosist হতে পারে। সীমিত সংখ্যক প্রসেসর নিবন্ধকগুলির সর্বোত্তম ব্যবহার কীভাবে করা যায় তা খুঁজে বের করা এবং figuring out a difference। এখানে একটি বাস্তব জীবন নমুনা:

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

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

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


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


সমাবেশের আরও বিখ্যাত স্নিপেটগুলির মধ্যে একটি হল মাইকেল আব্রাশের টেক্সচার ম্যাপিং লুপ ( এখানে বিস্তারিতভাবে বর্ধিত ):

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 এর জন্য অন্তর্নিহিত সমর্থন করে, তাই আপনাকে প্ল্যাটফর্মের নির্দিষ্ট নির্দেশাবলীর সুবিধা নিতে সমাবেশে নামার বিষয়ে কম চিন্তা করতে হবে। ভিসুয়াল সি ++গুলি যথাযথ / ARCH সেটিংসের সাথে আপনার লক্ষ্য করা প্রকৃত স্থাপত্যের সুবিধা নিতে পারে।







assembly