সিসিতে কিছু বিবৃতি অপ্টিমাইজ করে কীভাবে জিসিসি প্রতিরোধ করবেন?


107

কোনও পৃষ্ঠা নোংরা করার জন্য (পৃষ্ঠার টেবিল এন্ট্রিতে নোংরা বিটটি স্যুইচ করা), পৃষ্ঠার প্রথম বাইটগুলি আমি এটির মতো স্পর্শ করি:

pageptr[0] = pageptr[0];

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

volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;

মনে হয় কৌতুকটি কাজ করে তবে কিছুটা কুৎসিত। আমি জানতে চাই যে কোনও দিকনির্দেশনা বা বাক্য গঠন যা একই প্রভাব ফেলেছে? এবং আমি কোনও -O0পতাকা ব্যবহার করতে চাই না , যেহেতু এটি দুর্দান্ত পারফরম্যান্সের পেনাল্টিও নিয়ে আসবে।


8
@ মার্ক -O0 অপ্টিমাইজেশন বন্ধ করবে, তবে প্রোগ্রামের কার্যকারিতাও কমিয়ে দেবে। আমি কেবল এই কোড স্নিপেটের অপ্টিমাইজেশন প্রতিরোধ করতে চাই: পি
জেলুএক্স

আমি এটি যুক্ত করতে চাই, অতীতে এমনকি -O0ডেড কোড "অপ্টিমাইজেশন" রোধ করেনি, যেমন, যখন জিসিসি সনাক্ত করে যে কোনও কোডের কোনও প্রভাব নেই, এটি কেবল এটিকে সরিয়ে দেয়। আমি যতদূর জানি এই এমনকি সামনে একটি পর্যায় -O0... কিন্তু যে শুধু আমার অভিজ্ঞতা
smoothware

উত্তর:


91

অপ্টিমাইজেশন বন্ধ করা সমস্যার সমাধান করে তবে এটি অপ্রয়োজনীয়। একটি নিরাপদ বিকল্প হ'ল সংকলকটির জন্য volatileটাইপ কোয়ালিফায়ার ব্যবহার করে স্টোরটিকে অনুকূল করে তোলা অবৈধ make

// Assuming pageptr is unsigned char * already...
unsigned char *pageptr = ...;
((unsigned char volatile *)pageptr)[0] = pageptr[0];

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

এইভাবে, পার্শ্ববর্তী কোডটি এখনও অপ্টিমাইজ করা যায় এবং আপনার কোডটি অন্যান্য সংকলকগুলির কাছে পোর্টেবল যা জিসিসি #pragmaবা __attribute__সিনট্যাক্স বোঝে না ।


2
আমি বলব এটি অপটিমাইজেশন বন্ধ করার চেয়ে পছন্দসই। আপনি এখনও এই পদ্ধতিটি ব্যবহার করে অন্যান্য অপ্টিমাইজেশন থেকে উপকৃত হতে পারেন।
বেন এস

3
ডায়েরিচ এপ্পের সমাধানটি এআরএম 4.1 সংকলকের অধীনে কাজ করছে না । এমনকি জেলুক্সের সমাধানও কাজ করছে না। এআরএম 4.1 এর জন্য এই কাজটি করার বিকল্প পদ্ধতিটি জেলুক্সের সমাধানে রয়েছে, ' টেম্প ' কে একটি বৈশ্বিক উদ্বায়ী ভেরিয়েবল তৈরি করুন
ওকুলাস ডেক্সটার

1
সংকলকটির জন্য এটি বেশ খারাপ।
আলেক্সি ফ্রুঞ্জ

1
@ শোকার: জিসিসি এখনও বাস্তব মেমরি অ্যাক্সেসটিকে অনুকূল না করে পরিবর্তনশীলটিকে অপ্টিমাইজ করতে পারে। সেগুলি বিভিন্ন ইস্যু।
ডায়েটারিচ এপ্প

2
@jww: এই ব্যবহারটি সেই ব্লগ পোস্টে বর্ণিত অনুসারে ফিট করে। volatileমানে মেমরি অ্যাক্সেস অবশ্যই লিখিত হিসাবে উপস্থিত হওয়া উচিত যা আমরা যা চাই ঠিক তেমনই। অন্য কথায়, আমরা এ সম্পর্কে যত্ন সহকারে চিন্তা করেছি এবং এর অর্থ আমরা কী ভাবো তার অর্থ।
ডায়েটরিচ এপ্প

184

তুমি ব্যবহার করতে পার

#pragma GCC push_options
#pragma GCC optimize ("O0")

your code

#pragma GCC pop_options

জিসিসি ৪.৪ থেকে অপ্টিমাইজেশন অক্ষম করতে।

আপনার আরও বিশদ প্রয়োজন হলে জিসিসি ডকুমেন্টেশন দেখুন।


3
তবে এটি লক্ষণীয় যে এটি কেবলমাত্র পুরো ফাংশনগুলিতেই কাজ করে, নির্দিষ্ট পরিসংখ্যানগুলিতে নয়: gcc.gnu.org/onlinesocs/gcc-4.8.2/gcc/… "এই বিন্দুটির পরে সংজ্ঞায়িত প্রতিটি ফাংশন যেমন বৈশিষ্ট্য (( অপ্টিমাইজ ("STRING")) সেই ফাংশনের জন্য নির্দিষ্ট করা হয়েছিল।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

134

নতুন প্রগমাস ব্যবহার না করে আপনি __attribute__((optimize("O0")))আপনার প্রয়োজনের জন্যও ব্যবহার করতে পারেন । এটিতে কেবল একটি একক ফাংশনে প্রয়োগ করার সুবিধা রয়েছে এবং সমস্ত ফাংশন একই ফাইলে সংজ্ঞায়িত করা হয় না।

ব্যবহারের উদাহরণ:

void __attribute__((optimize("O0"))) foo(unsigned char data) {
    // unmodifiable compiler code
}

3
আমি যদি কোনও -Olevelবিকল্প ব্যবহার না করে তবে স্বতন্ত্রভাবে চালু হওয়া ব্যক্তি বিকল্পগুলি ব্যবহার করি তবে কী হবে? (আমার ক্ষেত্রে, আমি কোডটি ভঙ্গকারী স্বতন্ত্র অপ্টিমাইজেশান বিকল্পটি কোনটি নির্ধারণ করতে পারি না)
ব্যবহারকারী 2284570
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.