ফোর্টরান সংকলকগুলি কি সত্যই সি সংকলকগুলির চেয়ে দ্রুত কোড উত্পন্ন করে?


17

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

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

এ জাতীয় তুলনা কতটা বৈধ? আমরা কি বলতে পারি যে ফোর্টরান সংকলকগুলি সি সংকলকগুলির তুলনায় দ্রুত প্রোগ্রাম তৈরি করে বা বিপরীতে এবং কেন এই পার্থক্য বিদ্যমান?


19
এর সহজ অর্থ হ'ল ফোর্টরান প্রোগ্রামগুলি সি এর চেয়ে বেশি ভার্বোজ ... একটি অর্থবহ তুলনা কেবলমাত্র উভয় ভাষায় একই কার্যকারিতা প্রয়োগ করে এবং ফলস্বরূপ মেশিন কোডের (আকার এবং গতি) তুলনা করেই করা যেতে পারে ।
পিয়েটার তারেক

এছাড়াও, উত্পন্ন কোডটি কি সমান্তরাল সম্পাদন সমর্থন করে?

@ পিটার টারিক, এর সহজ অর্থ হল যে, বলুন, ফোরট্রানে BLAS এবং LAPACK তাদের সি / সি ++ বন্দরগুলির যে কোনও একটিতে আরও ভাল পারফর্ম করত। এখন ফাঁক দ্রুত সংকুচিত হচ্ছে।
এসকে-লজিক

6
আপনি কেবলমাত্র যুক্তি দিতে পারেন যে উভয় ভাষায় যদি আপনার 100% সমতুল্য প্রোগ্রাম থাকে তবে যারা তাদের সংকলকগুলি জানেন এবং যারা পারফরম্যান্সের জন্য অ্যাকাউন্ট করতে পারেন তাদের দ্বারা লিখিত একটি সংকলক দ্রুত কোড তৈরি করে।
ফালকন

প্রাক্তন ফোরট্রান পুনরাবৃত্তি সমর্থন করে না এবং ফলস্বরূপ ফাংশন কল আর্গুমেন্টগুলিকে স্ট্যাকের উপরে চাপ দেওয়ার প্রয়োজন ছিল না কারণ প্রতিটি ফানসিওনের আর্গুমেন্টের জন্য একটি স্থিতিশীলভাবে বরাদ্দ স্থান থাকবে। এটি দ্রুত হতে পারে এটির অন্যতম কারণ। আমি অনুমান করি আপনি এখানে আরও সম্পূর্ণ উত্তর পেতে পারেন: amazon.com/Programming-Language-Pragmatics-Third-Edition/dp/…
পেদ্রো রলো

উত্তর:


36

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

ফরটারনে, ফাংশন আর্গুমেন্টগুলি একে অপরকে উরফ নাও করতে পারে এবং সংকলক ধরে নেয় যে তারা তা করে না। এটি দুর্দান্ত অপ্টিমাইজেশন সক্ষম করে এবং দ্রুত ভাষা হিসাবে ফোরট্রানের খ্যাতির অন্যতম প্রধান কারণ। (দ্রষ্টব্য যে অ্যালিয়াসিং এখনও একটি ফরটান ফাংশনের মধ্যেই ঘটতে পারে instance উদাহরণস্বরূপ, যদি A একটি অ্যারে হয় এবং i এবং j একই সূচক হয় তবে একই মান হয় তবে A [i] এবং A [j] এর দুটি আলাদা নাম একই মেমরির অবস্থান। ভাগ্যক্রমে, যেহেতু বেস অ্যারেটির একই নাম থাকা আবশ্যক, সূচী বিশ্লেষণগুলি কেসগুলি [i] এবং এ [জে] উপনাম করতে পারে না এমন ক্ষেত্রে নির্ধারণের জন্য করা যেতে পারে))

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


আরও ভাল অপটিমাইজেশনের আর একটি কারণ জটিল সংখ্যার জন্য স্থানীয় সমর্থন।
এসকে-যুক্তি 10

অবশ্যই ফোর্টরান চতুর্থ বা তার জন্য সঠিক। নিশ্চিত না যে আধুনিক ফোরট্রানগুলিতে এখনও পয়েন্টার, গতিশীল ম্যুরি ইত্যাদি নেই
ইনগো

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

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

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

8

সম্পূর্ণরূপে অবৈধ তুলনা।

প্রথমে, @ পিটার টারিক দেখায় যে, উত্পাদিত রেখার সংখ্যার বৈধ তুলনা করার জন্য আপনাকে প্রথমে ফোর্টরান এবং সি থেকে সমমানের প্রোগ্রামগুলির রেখার সংখ্যা তুলনা করতে হবে

দ্বিতীয়ত, কোডের কম লাইনগুলি সর্বদা দ্রুত প্রোগ্রামগুলির সমান হয় না । সমস্ত মেশিনের নির্দেশাবলী কার্যকর করতে একই সংখ্যক চক্র গ্রহণ করে না , তবে আপনার কাছে অন্যান্য সমস্যা যেমন মেমরি অ্যাক্সেস , ক্যাশিং ইত্যাদি রয়েছে have

তার উপরে লম্বা কোড রান দ্রুততর হতে পারে যেহেতু এটি কম সংখ্যক এক্সিকিউটিভ লাইনের ফলাফল (যেমন, লাইন কাউন্ট! = এক্সিকিউটেড লাইন কাউন্ট )।


5

ড্যান সঠিক, দীর্ঘ প্রোগ্রামের অর্থ ধীর প্রোগ্রাম নয়। এটি তারা কী করছে তা একটির উপর নির্ভর করে।

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

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


2
আপনি যদি জটিল ডেটা স্ট্রাকচার ব্যবহার করছেন তবে ফরটারন সম্ভবত ভুল পছন্দ। ফোরট্রান খুব সহজেই সাধারণ সংখ্যা ক্রাঞ্চিং করতে অনুকূলিত।
জাচারি কে

4

আমি মনে করি এর অংশটি হ'ল ফরটারেন সংকলকগুলি বেশ কয়েকটি ধরণের গণিত খুব দ্রুত ডিজাইনের জন্য তৈরি করা হয়েছে। যত দ্রুত সম্ভব গণনা করার জন্য লোকেরা ফোরট্রান ব্যবহার করে এটি কোন ধরণের


4

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

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


4

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

ফাংশনটি বিবেচনা করুন:

void diff(float dest[], float src1[], float src2[], int n)
{
  for (int i=0; i<n; i++)
    dest[i] = src1[i] - src2[i];
}

যদি কোনও সংকলক জানত যে পয়েন্টারগুলির প্রত্যেকটি অ্যারের শুরু চিহ্নিত করবে, এটি কোড তৈরি করতে পারে যা অ্যারের উপাদানগুলিকে সমান্তরালভাবে বা কোনও ক্রমে কাজ করবে, যেহেতু যে কোনও x! = y এর জন্য, গন্তব্যস্থলে ক্রিয়াকলাপ [x ] src1 [y] বা src2 [y] কে প্রভাবিত করবে না। উদাহরণস্বরূপ, কিছু সিস্টেমে একটি সংকলক এর সমান কোড উত্পন্ন করে উপকার করতে পারে:

void dif(float dest[], float src1[], float src2[], int n)
{
  int i=0;
  float t1a,t1b,t2a,t2b,tsa,tsb;
  if (n > 2)
  {
    n-=4;
    t1a = src1[n+3]; t1b = src2[n+3]; t1b=src2[n+2]; t2b = src2[n+2];
    do
    {
      tsa = t1a-t2a;
      t1a = src1[n+1]; t2a = src2[n+1]; 
      tsb = t2b-t2b;
      dest[n+3] = tsa;
      t1b = src1[n]; t2b = src2[n]; 
      n-=2;
      dest[n+4] = tsb;
    } while(n >= 0);
    ... add some extra code to handle cleanup
  }
  else
    ... add some extra code to handle small values of n
}

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

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

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