কতটি জিসিসি অপ্টিমাইজেশন স্তর রয়েছে?
আমি gcc -O1, gcc -O2, gcc -O3, এবং gcc -O4 চেষ্টা করেছি
আমি যদি সত্যিই বড় সংখ্যা ব্যবহার করি তবে এটি কাজ করবে না।
তবে আমি চেষ্টা করেছি
gcc -O100
এবং এটি সংকলিত।
কতটি অপ্টিমাইজেশন স্তর আছে?
কতটি জিসিসি অপ্টিমাইজেশন স্তর রয়েছে?
আমি gcc -O1, gcc -O2, gcc -O3, এবং gcc -O4 চেষ্টা করেছি
আমি যদি সত্যিই বড় সংখ্যা ব্যবহার করি তবে এটি কাজ করবে না।
তবে আমি চেষ্টা করেছি
gcc -O100
এবং এটি সংকলিত।
কতটি অপ্টিমাইজেশন স্তর আছে?
3
is আমার উত্তর দেখুন । 3
int
-fomit-stack-pointer
উত্পন্ন কোড পরিবর্তন করবে।
উত্তর:
পেডেন্টিক হওয়ার জন্য, এখানে 8 টি বৈধ -O বিকল্প রয়েছে যা আপনি সিসিকে দিতে পারেন, যদিও কিছু কিছু রয়েছে যা একই জিনিসটির অর্থ।
এই উত্তরের মূল সংস্করণে বলা হয়েছে 7 টি বিকল্প ছিল। এরপরে জিসিসি যোগ -Og
করেছে মোট to টিতে
থেকে মানুষ পৃষ্ঠা:
-O
(একই -O1
)-O0
(কোনও অপ্টিমাইজেশন করবেন না, কোনও অপ্টিমাইজেশন স্তর নির্দিষ্ট না করা থাকলে ডিফল্ট)-O1
(নূন্যতম অনুকূলিতকরণ)-O2
(আরও অনুকূলিতকরণ)-O3
(আরও আরও অনুকূলিতকরণ)-Ofast
(মানক সম্মতি ভঙ্গ করার বিন্দুতে খুব আগ্রাসীভাবে অনুকূলিতকরণ)-Og
(ডিবাগিংয়ের অভিজ্ঞতাকে অনুকূলিত করুন O-ওগটি অপ্টিমাইজেশানগুলি সক্ষম করে যা ডিবাগিংয়ের সাথে হস্তক্ষেপ করে না fast এটি স্ট্যান্ডার্ড এডিট-কমপাইল-ডিবাগ চক্রের জন্য পছন্দের অপ্টিমাইজেশন স্তর হওয়া উচিত, দ্রুত সংকলন এবং একটি ভাল ডিবাগিং অভিজ্ঞতা বজায় রাখার সময় অপ্টিমাইজেশনের একটি যুক্তিসঙ্গত স্তর সরবরাহ করা উচিত। )-Os
(আকারের জন্য অপ্টিমাইজ করুন -Os
all -O2
এমন সমস্ত অপ্টিমাইজেশন সক্ষম করে যা সাধারণত কোডের আকার বাড়ায় না code কোডের আকার হ্রাস করার জন্য এটি আরও অনুকূলিতকরণও সম্পাদন করে
-Os
the নিম্নলিখিত অপ্টিমাইজেশন পতাকাগুলি অক্ষম করে -falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version
:)প্লাটফর্ম নির্দিষ্ট অপ্টিমাইজেশানগুলিও থাকতে পারে, যেমন @ পাল্ডো নোটগুলি, ওএস এক্স রয়েছে -Oz
-Oz
সেটিংস রয়েছে যা "আকারের চেয়ে আরও আক্রমণাত্মকভাবে অনুকূলিতকরণ -Os
" হবে: বিকাশকারী
-Og
, যা সমস্ত অপ্টিমাইজেশন অপশন যা ডিবাগিংয়ে হস্তক্ষেপ করে না
আসুন জিসিসি 5.1 এর উত্স কোডটি ব্যাখ্যা করি
-O100
ম্যান পৃষ্ঠায় এটি স্পষ্ট না হওয়ায় আমরা কী ঘটবে তা বোঝার চেষ্টা করব ।
আমরা এই সিদ্ধান্তে পৌঁছে যাব:
-O3
আপ INT_MAX
হিসাবে একই -O3
, কিন্তু যে সহজেই ভবিষ্যতে পরিবর্তন হতে পারে তাই এটি উপর নির্ভর করে না।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_argument
atoi
কোনও অক্ষর যদি অঙ্ক না হয় তবে তাত্পর্যপূর্ণভাবে মোড়ানো এবং যুক্তিকে প্রত্যাখ্যান করে। তাই নেতিবাচক মানগুলি নিখুঁতভাবে ব্যর্থ হয়।
ফিরে 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
এটিকে এগিয়ে দেওয়ার মানকে স্বাভাবিক করে তোলে বলে আমাদের ভাল হওয়া উচিত।
সাতটি স্বতন্ত্র স্তর:
-O0
(ডিফল্ট): কোনও অপ্টিমাইজেশন নেই।
-O
বা -O1
(একই জিনিস): অনুকূলিত করুন, তবে খুব বেশি সময় ব্যয় করবেন না।
-O2
: আরও আক্রমণাত্মকভাবে অনুকূলিত করুন
-O3
: সবচেয়ে আক্রমণাত্মকভাবে অনুকূলিতকরণ
-Ofast
: সমান -O3 -ffast-math
। -ffast-math
অ-মানক-অনুবর্তী ফ্লোটিং পয়েন্ট অপ্টিমাইজেশন ট্রিগার করে। এটি সংকলকটি ভান করতে দেয় যে ভাসমান পয়েন্ট সংখ্যাগুলি অসীমভাবে সুনির্দিষ্ট হয় এবং তাদের উপর যে বীজগণিত হয় তা সংখ্যার বীজগণিতের মান নিয়ম অনুসরণ করে। এটি কমপায়ারটিকে হার্ডওয়্যারকে ডেনোর্মালগুলি শূন্যে ফ্লাশ করতে এবং ডেনারমালগুলি শূন্য হিসাবে বিবেচনা করতে বলেছিল, কমপক্ষে কিছু প্রসেসরে, x86 এবং x86-64 সহ। ডেনারমালগুলি অনেকগুলি এফপিইউগুলিতে ধীর পাথকে ট্রিগার করে এবং তাই তাদের শূন্য হিসাবে গণ্য করা (যা ধীর পাথকে ট্রিগার করে না) একটি বড় পারফরম্যান্সের জয় হতে পারে।
-Os
: কোড আকারের জন্য অনুকূলিতকরণ। উন্নত আই-ক্যাশের আচরণের কারণে এটি কিছু ক্ষেত্রে গতি আরও উন্নত করতে পারে।
-Og
: অনুকূলিত করুন, তবে ডিবাগিংয়ে হস্তক্ষেপ করবেন না। এটি ডিবাগ বিল্ডগুলির জন্য বিব্রতকর পারফরম্যান্সকে সক্ষম করে এবং এটি -O0
ডিবাগ বিল্ডগুলির জন্য প্রতিস্থাপনের উদ্দেশ্যে ।
এছাড়াও অন্যান্য অপশন রয়েছে যা এগুলির কোনও দ্বারা সক্ষম নয় এবং পৃথকভাবে সক্ষম করতে হবে। একটি অপ্টিমাইজেশন বিকল্পটি ব্যবহার করাও সম্ভব, তবে এই অপ্টিমাইজেশান দ্বারা সুনির্দিষ্ট নির্দিষ্ট পতাকাগুলি অক্ষম করুন।
আরও তথ্যের জন্য, জিসিসির ওয়েবসাইট দেখুন।
-O100
সংকলন করে ?
চারটি (০-৩): জিসিসি ৪.৪.২ ম্যানুয়ালটি দেখুন । উচ্চতর যে কোনও কিছুই কেবল -O3, তবে কোনও সময়ে আপনি পরিবর্তনশীল আকারের সীমাটি উপচে পড়বেন।
atoi
অনুসরণ করে অপরিজ্ঞাত আচরণের উপর নির্ভর করে বলে মনে হচ্ছে 255
।
man gcc
সাইগউইনে (12000 বিজোড় লাইন) এর সাহায্যে আপনি-O
উত্তরগুলির নীচে উত্তরগুলি সন্ধান করতে এবং তারপরে কিছু খুঁজে পেতে পারেন।