কতটি জিসিসি অপ্টিমাইজেশন স্তর রয়েছে?
আমি gcc -O1, gcc -O2, gcc -O3, এবং gcc -O4 চেষ্টা করেছি
আমি যদি সত্যিই বড় সংখ্যা ব্যবহার করি তবে এটি কাজ করবে না।
তবে আমি চেষ্টা করেছি
gcc -O100
এবং এটি সংকলিত।
কতটি অপ্টিমাইজেশন স্তর আছে?
কতটি জিসিসি অপ্টিমাইজেশন স্তর রয়েছে?
আমি gcc -O1, gcc -O2, gcc -O3, এবং gcc -O4 চেষ্টা করেছি
আমি যদি সত্যিই বড় সংখ্যা ব্যবহার করি তবে এটি কাজ করবে না।
তবে আমি চেষ্টা করেছি
gcc -O100
এবং এটি সংকলিত।
কতটি অপ্টিমাইজেশন স্তর আছে?
3is আমার উত্তর দেখুন । 3int
-fomit-stack-pointer উত্পন্ন কোড পরিবর্তন করবে।
উত্তর:
পেডেন্টিক হওয়ার জন্য, এখানে 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
-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:maintoplev.c:toplev::mainopts-global.c:decode_optsopts.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এটিকে এগিয়ে দেওয়ার মানকে স্বাভাবিক করে তোলে বলে আমাদের ভাল হওয়া উচিত।
সাতটি স্বতন্ত্র স্তর:
-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উত্তরগুলির নীচে উত্তরগুলি সন্ধান করতে এবং তারপরে কিছু খুঁজে পেতে পারেন।