কতটি জিসিসি অপ্টিমাইজেশন স্তর রয়েছে?


103

কতটি জিসিসি অপ্টিমাইজেশন স্তর রয়েছে?

আমি gcc -O1, gcc -O2, gcc -O3, এবং gcc -O4 চেষ্টা করেছি

আমি যদি সত্যিই বড় সংখ্যা ব্যবহার করি তবে এটি কাজ করবে না।

তবে আমি চেষ্টা করেছি

gcc -O100

এবং এটি সংকলিত।

কতটি অপ্টিমাইজেশন স্তর আছে?


13
@ এমনিটেক আপনি কোন এফএমটি দেখছেন? এমনকি man gccসাইগউইনে (12000 বিজোড় লাইন) এর সাহায্যে আপনি -Oউত্তরগুলির নীচে উত্তরগুলি সন্ধান করতে এবং তারপরে কিছু খুঁজে পেতে পারেন।
জেনস

4
উত্সটি পড়ার পরে @ মিনম্যাকসভিগ, আমি আপনার সাথে একমত নই: এর চেয়ে বড় যে কোনও কিছুই (যতক্ষণ না এটি উপচে পড়ে না ) 3is আমার উত্তর দেখুন । 3int
Ciro Santilli 郝海东 冠状 病 六四 事件

4
প্রকৃতপক্ষে, জিসিসির টিউন অপ্টিমাইজেশান সূক্ষ্ম করার জন্য আরও অনেকগুলি পতাকা রয়েছে। -fomit-stack-pointer উত্পন্ন কোড পরিবর্তন করবে।
বেসিল স্টারিনকিভিচ

উত্তর:


142

পেডেন্টিক হওয়ার জন্য, এখানে 8 টি বৈধ -O বিকল্প রয়েছে যা আপনি সিসিকে দিতে পারেন, যদিও কিছু কিছু রয়েছে যা একই জিনিসটির অর্থ।

এই উত্তরের মূল সংস্করণে বলা হয়েছে 7 টি বিকল্প ছিল। এরপরে জিসিসি যোগ -Ogকরেছে মোট to টিতে

থেকে মানুষ পৃষ্ঠা:

  • -O (একই -O1)
  • -O0 (কোনও অপ্টিমাইজেশন করবেন না, কোনও অপ্টিমাইজেশন স্তর নির্দিষ্ট না করা থাকলে ডিফল্ট)
  • -O1 (নূন্যতম অনুকূলিতকরণ)
  • -O2 (আরও অনুকূলিতকরণ)
  • -O3 (আরও আরও অনুকূলিতকরণ)
  • -Ofast (মানক সম্মতি ভঙ্গ করার বিন্দুতে খুব আগ্রাসীভাবে অনুকূলিতকরণ)
  • -Og (ডিবাগিংয়ের অভিজ্ঞতাকে অনুকূলিত করুন O-ওগটি অপ্টিমাইজেশানগুলি সক্ষম করে যা ডিবাগিংয়ের সাথে হস্তক্ষেপ করে না fast এটি স্ট্যান্ডার্ড এডিট-কমপাইল-ডিবাগ চক্রের জন্য পছন্দের অপ্টিমাইজেশন স্তর হওয়া উচিত, দ্রুত সংকলন এবং একটি ভাল ডিবাগিং অভিজ্ঞতা বজায় রাখার সময় অপ্টিমাইজেশনের একটি যুক্তিসঙ্গত স্তর সরবরাহ করা উচিত। )
  • -Os(আকারের জন্য অপ্টিমাইজ করুন -Osall -O2এমন সমস্ত অপ্টিমাইজেশন সক্ষম করে যা সাধারণত কোডের আকার বাড়ায় না code কোডের আকার হ্রাস করার জন্য এটি আরও অনুকূলিতকরণও সম্পাদন করে -Osthe নিম্নলিখিত অপ্টিমাইজেশন পতাকাগুলি অক্ষম করে -falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version:)

প্লাটফর্ম নির্দিষ্ট অপ্টিমাইজেশানগুলিও থাকতে পারে, যেমন @ পাল্ডো নোটগুলি, ওএস এক্স রয়েছে -Oz


23
আপনি যদি ম্যাক ওএস এক্স-তে বিকাশ করছেন তবে একটি অতিরিক্ত -Ozসেটিংস রয়েছে যা "আকারের চেয়ে আরও আক্রমণাত্মকভাবে অনুকূলিতকরণ -Os" হবে: বিকাশকারী
অ্যাপ্লিকেশন

6
দ্রষ্টব্য: O3 নামটি প্রস্তাবিত হলেও O2 এর চেয়ে অপরিহার্য নয়। উভয় চেষ্টা করুন।
জোহান

4
@ পলড্ডু 404 পৃষ্ঠা, আর্কাইভ.ওর সাথে প্রতিস্থাপন করুন
নভেম্বর 6'16

এছাড়াও রয়েছে -Og, যা সমস্ত অপ্টিমাইজেশন অপশন যা ডিবাগিংয়ে হস্তক্ষেপ করে না
einpoklum

50

আসুন জিসিসি 5.1 এর উত্স কোডটি ব্যাখ্যা করি

-O100ম্যান পৃষ্ঠায় এটি স্পষ্ট না হওয়ায় আমরা কী ঘটবে তা বোঝার চেষ্টা করব ।

আমরা এই সিদ্ধান্তে পৌঁছে যাব:

  • উপরে কিছু -O3আপ INT_MAXহিসাবে একই -O3, কিন্তু যে সহজেই ভবিষ্যতে পরিবর্তন হতে পারে তাই এটি উপর নির্ভর করে না।
  • আপনি যদি এর চেয়ে বড় পূর্ণসংখ্যা প্রবেশ করেন তবে GCC 5.1 অপরিবর্তিত আচরণ চালায় INT_MAX
  • যুক্তিটিতে কেবল অঙ্ক থাকতে পারে, বা এটি দুর্দান্তভাবে ব্যর্থ হয়। বিশেষত, এটি নেতিবাচক পূর্ণসংখ্যার মতো বাদ দেয়-O-1

সাবপ্রোগ্রামগুলিতে ফোকাস করুন

প্রথম মনে রাখবেন যে জিসিসি জন্য শুধু একটি ফ্রন্ট-এন্ড হয় cpp, as, cc1, collect2। দ্রুত ./XXX --helpবলেছে যে কেবলমাত্র collect2এবং cc1গ্রহণ করুন -O, সুতরাং আসুন তাদের ফোকাস করুন focus

এবং:

gcc -v -O100 main.c |& grep 100

দেয়:

COLLECT_GCC_OPTIONS='-O100' '-v' '-mtune=generic' '-march=x86-64'
/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/5.1.0/cc1 [[noise]] hello_world.c -O100 -o /tmp/ccetECB5.

সুতরাং -Oউভয় cc1এবং এগিয়ে পাঠানো হয়েছিল collect2

কমন.ওপ্টে ও

কমন.ওপট হ'ল একটি জিসিসি নির্দিষ্ট সিএলআই বিকল্প বিবরণ বিন্যাস যা ইন্টার্নাল ডকুমেন্টেশনে বর্ণিত এবং সি -তে অনুবাদ করা হয়েছে opth-gen.awk এবং optc-gen.awk দ্বারা

এটিতে নিম্নলিখিত আকর্ষণীয় লাইন রয়েছে:

O
Common JoinedOrMissing Optimization
-O<number>  Set optimization level to <number>

Os
Common Optimization
Optimize for space rather than speed

Ofast
Common Optimization
Optimize for speed disregarding exact standards compliance

Og
Common Optimization
Optimize for debugging experience rather than speed or size

যা সমস্ত Oবিকল্প নির্দিষ্ট করে । উল্লেখ্য কিভাবে -O<n>অপরের থেকে পৃথক পরিবার রয়েছে Os, Ofastএবং Og

আমরা যখন নির্মাণ করি তখন options.hএটি এমন একটি ফাইল উত্পন্ন করে যা এতে থাকে:

OPT_O = 139,                               /* -O */
OPT_Ofast = 140,                           /* -Ofast */
OPT_Og = 141,                              /* -Og */
OPT_Os = 142,                              /* -Os */

বোনাস হিসাবে, আমরা \bO\nঅভ্যন্তরে গ্রিপিংয়ের সময় common.optলাইনগুলি লক্ষ্য করি:

-optimize
Common Alias(O)

যা আমাদের শিক্ষা দেয় যে, --optimize(ডাবল ড্যাশ কারণ এটি একটি ড্যাশ দিয়ে শুরু হয় -optimizeউপর .optফাইল) জন্য একটি অনথিভুক্ত ওরফে হয় -Oযা ব্যবহার করা যেতে পারে --optimize=3!

যেখানে OPT_O ব্যবহৃত হয়

এখন আমরা গ্রেপ:

git grep -E '\bOPT_O\b'

যা আমাদের দুটি ফাইলের দিকে নির্দেশ করে:

প্রথমে ট্র্যাক ডাউন করা যাক opts.c

opts.c: default_options_optimization

সকল opts.cব্যবহারগুলির ভিতরে ঘটতে: default_options_optimization

এই ফাংশনটি কে কল করে তা দেখতে আমরা ব্যাকট্র্যাকটি গ্রেপ করি এবং আমরা দেখতে পাই যে একমাত্র কোড পাথ:

  • main.c:main
  • toplev.c:toplev::main
  • opts-global.c:decode_opts
  • opts.c:default_options_optimization

এবং main.cএন্ট্রি পয়েন্ট হয় cc1। ভাল!

এই ফাংশনের প্রথম অংশ:

  • নেই integral_argumentযা কল atoiস্ট্রিং সংশ্লিষ্ট উপর OPT_Oইনপুট যুক্তি বিশ্লেষণ করতে
  • মান ভিতরে সঞ্চয় করে opts->x_optimizeযেখানে optsএকটি হল struct gcc_opts

কাঠামো gcc_opts

নিরর্থকভাবে গ্রেপিংয়ের পরে, আমরা লক্ষ্য করি যে structএটি এখানেও উত্পন্ন হয়েছে options.h:

struct gcc_options {
    int x_optimize;
    [...]
}

যেখানে x_optimizeলাইন থেকে আসে:

Variable
int optimize

উপস্থিত common.optএবং এটি options.c:

struct gcc_options global_options;

সুতরাং আমরা অনুমান করি যে এটিতে সম্পূর্ণ কনফিগারেশন বিশ্বব্যাপী রাষ্ট্র রয়েছে এবং int x_optimizeএটি অপটিমাইজেশন মান।

255 একটি অভ্যন্তরীণ সর্বাধিক

ইন opts.c:integral_argument, atoiইনপুট আর্গুমেন্ট প্রয়োগ করা হয়, তাই INT_MAXউপরের একটি আবদ্ধ। এবং আপনি যদি আরও বড় কিছু রাখেন তবে মনে হয় যে জিসিসি সি অপরিবর্তিত আচরণ চালায়। আচ্ছা?

integral_argumentatoiকোনও অক্ষর যদি অঙ্ক না হয় তবে তাত্পর্যপূর্ণভাবে মোড়ানো এবং যুক্তিকে প্রত্যাখ্যান করে। তাই নেতিবাচক মানগুলি নিখুঁতভাবে ব্যর্থ হয়।

ফিরে opts.c:default_options_optimization, আমরা লাইনটি দেখতে পাচ্ছি:

if ((unsigned int) opts->x_optimize > 255)
  opts->x_optimize = 255;

যাতে অপ্টিমাইজেশনের স্তরটি কেটে যায় 255। পড়ার সময় opth-gen.awkআমি এসে পৌঁছেছিলাম:

# All of the optimization switches gathered together so they can be saved and restored.
# This will allow attribute((cold)) to turn on space optimization.

এবং উত্পন্ন উপর options.h:

struct GTY(()) cl_optimization
{
  unsigned char x_optimize;

যা ব্যাখ্যা করে যে কেন কেটে দেওয়া হচ্ছে: বিকল্পগুলিও ফরোয়ার্ড করতে হবে cl_optimization, যা charস্থান বাঁচাতে একটি ব্যবহার করে । সুতরাং 255 আসলে অভ্যন্তরীণ সর্বাধিক।

opts.c: সম্ভবত_default_options

পিছনে opts.c:default_options_optimization, আমরা জুড়ে এসেছি maybe_default_optionsযা আকর্ষণীয় বলে মনে হচ্ছে। আমরা এটি প্রবেশ করি এবং তারপরে maybe_default_optionযেখানে আমরা একটি বড় স্যুইচ পৌঁছে যাই:

switch (default_opt->levels)
  {

  [...]

  case OPT_LEVELS_1_PLUS:
    enabled = (level >= 1);
    break;

  [...]

  case OPT_LEVELS_3_PLUS:
    enabled = (level >= 3);
    break;

কোনও >= 4চেক নেই, যা ইঙ্গিত দেয় যে 3এটি সবচেয়ে সম্ভাব্য।

তারপরে আমরা এর সংজ্ঞাটির জন্য OPT_LEVELS_3_PLUSঅনুসন্ধান করব common-target.h:

enum opt_levels
{
  OPT_LEVELS_NONE, /* No levels (mark end of array).  */
  OPT_LEVELS_ALL, /* All levels (used by targets to disable options
                     enabled in target-independent code).  */
  OPT_LEVELS_0_ONLY, /* -O0 only.  */
  OPT_LEVELS_1_PLUS, /* -O1 and above, including -Os and -Og.  */
  OPT_LEVELS_1_PLUS_SPEED_ONLY, /* -O1 and above, but not -Os or -Og.  */
  OPT_LEVELS_1_PLUS_NOT_DEBUG, /* -O1 and above, but not -Og.  */
  OPT_LEVELS_2_PLUS, /* -O2 and above, including -Os.  */
  OPT_LEVELS_2_PLUS_SPEED_ONLY, /* -O2 and above, but not -Os or -Og.  */
  OPT_LEVELS_3_PLUS, /* -O3 and above.  */
  OPT_LEVELS_3_PLUS_AND_SIZE, /* -O3 and above and -Os.  */
  OPT_LEVELS_SIZE, /* -Os only.  */
  OPT_LEVELS_FAST /* -Ofast only.  */
};

হা! এটি একটি শক্তিশালী সূচক যে এখানে মাত্র 3 টি স্তর রয়েছে।

opts.c: default_options_table

opt_levelsখুব আকর্ষণীয়, আমরা গ্রেপ OPT_LEVELS_3_PLUS, এবং জুড়ে আসা opts.c:default_options_table:

static const struct default_options default_options_table[] = {
    /* -O1 optimizations.  */
    { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 },
    [...]

    /* -O3 optimizations.  */
    { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
    [...]
}

সুতরাং এখানে -Onডক্সে উল্লিখিত নির্দিষ্ট অপ্টিমাইজেশান ম্যাপিংটি এনকোড করা আছে। চমৎকার!

নিশ্চিত করুন যে x_optimize এর জন্য আর কোনও ব্যবহার নেই are

ম্যান পৃষ্ঠায় নথিভুক্তের x_optimizeমতো অন্যান্য নির্দিষ্ট অপ্টিমাইজেশন বিকল্পগুলি সেট করা ছিল এর প্রধান ব্যবহার -fdefer_pop। আর কি আছে?

আমরা grep, এবং আরও কিছু খুঁজে। সংখ্যাটি ছোট, এবং ম্যানুয়াল পরিদর্শন করার পরে আমরা দেখতে পাচ্ছি যে প্রতিটি ব্যবহার কেবলমাত্র সর্বাধিক একটি করে x_optimize >= 3, তাই আমাদের উপসংহার ধরে।

lto-wrapper.c

এখন আমরা দ্বিতীয় ঘটনার জন্য যাই OPT_O, যা ছিল lto-wrapper.c

এলটিওর অর্থ লিঙ্ক টাইম অপ্টিমাইজেশন, যা নাম অনুসারে প্রস্তাবিত একটি -Oবিকল্পের প্রয়োজন হবে এবং এটি লিঙ্ক করা হবে collec2(যা মূলত একটি লিঙ্কার)।

আসলে, প্রথম পংক্তিটি lto-wrapper.cবলে:

/* Wrapper to call lto.  Used by collect2 and the linker plugin.

এই ফাইলে, OPT_Oউপস্থিতিগুলি কেবল Oএটিকে এগিয়ে দেওয়ার মানকে স্বাভাবিক করে তোলে বলে আমাদের ভাল হওয়া উচিত।


38

সাতটি স্বতন্ত্র স্তর:

  • -O0 (ডিফল্ট): কোনও অপ্টিমাইজেশন নেই।

  • -Oবা -O1(একই জিনিস): অনুকূলিত করুন, তবে খুব বেশি সময় ব্যয় করবেন না।

  • -O2: আরও আক্রমণাত্মকভাবে অনুকূলিত করুন

  • -O3: সবচেয়ে আক্রমণাত্মকভাবে অনুকূলিতকরণ

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

  • -Os: কোড আকারের জন্য অনুকূলিতকরণ। উন্নত আই-ক্যাশের আচরণের কারণে এটি কিছু ক্ষেত্রে গতি আরও উন্নত করতে পারে।

  • -Og: অনুকূলিত করুন, তবে ডিবাগিংয়ে হস্তক্ষেপ করবেন না। এটি ডিবাগ বিল্ডগুলির জন্য বিব্রতকর পারফরম্যান্সকে সক্ষম করে এবং এটি -O0ডিবাগ বিল্ডগুলির জন্য প্রতিস্থাপনের উদ্দেশ্যে ।

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

আরও তথ্যের জন্য, জিসিসির ওয়েবসাইট দেখুন।


প্রকৃতপক্ষে, অন্য উত্তরগুলির সাথে ন্যায়সঙ্গত হওয়া সত্ত্বেও, answers উত্তরগুলি যখন লেখা হয়েছিল তখন -Of nor
জান্নেব

তাহলে কেন -O100সংকলন করে ?
einpoklum

4
@ আইনপোকলুম কারণ জিসিসি -O3 এর উপরে সমস্ত কিছু -O3 এর সমান বলে বিবেচনা করে।
ডেমি

দুর্ভাগ্যক্রমে, আপনি এখনও ওগ-দিয়ে ডিবাগারে একটি টন <অপ্টিমাইজড আউট> পান। পদক্ষেপ এখনও এলোমেলোভাবে লাফ দেয়। এটি অকেজো আইএমএইচও।
doug65536

3

চারটি (০-৩): জিসিসি ৪.৪.২ ম্যানুয়ালটি দেখুন । উচ্চতর যে কোনও কিছুই কেবল -O3, তবে কোনও সময়ে আপনি পরিবর্তনশীল আকারের সীমাটি উপচে পড়বেন।


আমি আমার উত্তরে উত্স কোডটি অনুসন্ধান করেছি এবং আপনার সাথে একমত হয়েছি । আরও উদাসীনভাবে, জিসিসি অভ্যন্তরীণ সীমা atoiঅনুসরণ করে অপরিজ্ঞাত আচরণের উপর নির্ভর করে বলে মনে হচ্ছে 255
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

4
দয়া করে আপনার উত্তর সরানোর বিষয়ে বিবেচনা করুন, কারণ এটি (কমপক্ষে এই দিনগুলি) ভুল is
einpoklum
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.