জিসিসির ফেস্ট-ম্যাথ আসলে কী করে?


144

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

অনুরূপ প্রশ্নের জন্য আমি এসও দিয়ে খোঁড়াখুঁড়ি করার চেষ্টা করেছি তবে ফ্যাস্টা-ম্যাথের কার্যকারিতা ব্যাখ্যা করার মতো কিছু খুঁজে পেলাম না।

উত্তর:


86

যেমনটি আপনি উল্লেখ করেছেন, এটি এমন অপ্টিমাইজেশনের অনুমতি দেয় যা কঠোর আইইইই সম্মতি সংরক্ষণ করে না।

একটি উদাহরণ এটি:

x = x*x*x*x*x*x*x*x;

প্রতি

x *= x;
x *= x;
x *= x;

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

জিসিসি আসলে এই নির্দিষ্ট অপ্টিমাইজেশনটি করে কিনা তা দেখার জন্য আমি আসলে পরীক্ষা করে দেখিনি। তবে ধারণাটি একই।


25
@ অ্যান্ড্রে: এই উদাহরণস্বরূপ, আপনি 7 গুণ থেকে কমিয়ে 3 এ চলে যান
রহস্যময়ী

4
@ অ্যান্ড্রে: গাণিতিকভাবে, এটি সঠিক হবে। তবে ফলাফলটি বিভিন্ন রাউন্ডিংয়ের কারণে শেষ কয়েকটি বিটে কিছুটা আলাদা হতে পারে।
রহস্যময়

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

1
@ ব্যবহারকারী: ত্রুটির পরিমাণটি ইনপুট ডেটার উপর নির্ভর করে। এটি ফলাফলের তুলনায় ছোট হওয়া উচিত। উদাহরণস্বরূপ, যদি x10 এর চেয়ে কম হয় তবে মাইস্টিকালের উদাহরণে ত্রুটিটি 10 ​​^ -10 এর কাছাকাছি হবে। তবে যদি x = 10e20, ত্রুটিটি অনেক মিলিয়ন হওয়ার সম্ভাবনা রয়েছে।
বেন ভয়েগট

3
@stefanct এটা আসলে সম্পর্কে -fassociative-mathযার মধ্যে হয় -funsafe-math-optimizationsযা আবার সঙ্গে সক্রিয় করা হয় -ffast-math নেই জিসিসি অপ্টিমাইজ কেন a*a*a*a*a*aকরতে (a*a*a)*(a*a*a)?
ফুক্লভ

255

-ffast-math কেবল কঠোর আইইইই সম্মতি ভঙ্গ করা ছাড়াও আরও অনেক কিছু করে।

প্রথমত, অবশ্যই, এটি কঠোর আইইইই সম্মতি ভঙ্গ করে , উদাহরণস্বরূপ এমন কোনও কিছুর নির্দেশিকাকে পুনরায় অর্ডার করা যা গাণিতিকভাবে একই (আদর্শভাবে) তবে ভাসমান পয়েন্টে ঠিক একই নয়।

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

তৃতীয়, এটি অনুমান করে যে সমস্ত গণিত সীমাবদ্ধ , যার অর্থ হ'ল NaN (বা শূন্য) এর জন্য কোনও চেক এমন জায়গায় করা হয়নি যেখানে তাদের ক্ষতিকারক প্রভাব পড়বে would এটি কেবল অনুমান করা হয় যে এটি ঘটবে না।

চতুর্থত, এটি বিভাজন এবং পারস্পরিক বর্গমূলের জন্য পারস্পরিক প্রাক্কলন সক্ষম করে ।

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

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


15
দমন, ধন্যবাদ! আপনি কিছু উল্লেখ যোগ করতে পারেন? ভালো লেগেছে gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html " -ffast-math সেট -fno-গণিত-errno, -funsafe-গণিত-অপ্টিমাইজেশন, -ffinite-গণিত-শুধুমাত্র -fno-rounding-গণিত, -fno-সংকেত -nans এবং -fcx-সীমিত পরিসীমা। এই বিকল্পটি প্রাক প্রসেসর ম্যাক্রো ঘটায় FAST_MATH সংজ্ঞায়িত করা। "(মত, এবং জন্য glibc কাছ থেকে কিছু math.hকাছাকাছি math_errhandling)" ডিফল্টরূপে সব ফাংশন উভয় errno এবং ব্যতিক্রম হ্যান্ডলিং সমর্থন করি। জিসিসি এর ফাস্ট গণিত মোডে এবং যদি ইনলাইন ফাংশনগুলি সংজ্ঞায়িত করা হয় তবে এটি সত্য নাও হতে পারে ""
ওসজিএক্স

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

2
@ রয়ী: দু'জনকে একে অপরের থেকে স্বতন্ত্র হওয়া উচিত। -O2গতির পক্ষে বাণিজ্যের আকার ব্যতীত সাধারণত "প্রতিটি" আইনী অপ্টিমাইজেশন সক্ষম করে। -O3গতি জন্য বাণিজ্য আকার যে অপ্টিমাইজেশন সক্ষম করে। এটি এখনও 100% নির্ভুলতা বজায় রাখে। -ffast-mathগাণিতিক ক্রিয়াকলাপগুলিকে দ্রুত "সামান্য ভুল" আচরণের অনুমতি দিয়ে তা করার চেষ্টা করে যা সাধারণত ক্ষতিকারক নয়, তবে মানক শব্দটির দ্বারা ভুল হিসাবে বিবেচিত হবে। যদি আপনার কোড প্রকৃতপক্ষে অনেক দুই কম্পাইলার (শুধুমাত্র 1-2%) উপর গতি বিভিন্ন তারপর চেক করুন যে আপনার কোড কঠোরভাবে মান সঙ্গতিশীল এবং ...
ডেমন

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

1
@ রয়ী: এই কোডটি আমার কাছে খুব ছোট এবং সাধারণ বলে মনে হচ্ছে না, এমন কিছু নয় যে কেউ কয়েক মিনিটের (বা এমনকি কয়েক ঘন্টা) গভীরতার সাথে বিশ্লেষণ করতে পারে। অন্যান্য জিনিসের মধ্যে এটি একটি আপাতদৃষ্টিতে নিরীহ #pragma omp parallel forএবং জড়িত রয়েছে এবং লুপ বডির মধ্যে আপনি উভয়ই ফাংশন আর্গুমেন্টের দ্বারা নির্দেশিত ঠিকানাগুলি থেকে পড়ছেন এবং লিখছেন এবং একটি শাখা-প্রশাখার অ-তুচ্ছ পরিমাণ করুন। অশিক্ষিত অনুমান হিসাবে, আপনি আপনার প্রয়োগ-সংজ্ঞায়িত থ্রেডগুলির মধ্যে থেকেই ক্যাশে ছোঁড়াচ্ছেন এবং এমএসভিসি ভুলভাবে মধ্যবর্তী স্টোরগুলিকে এড়িয়ে যেতে পারে যা নিয়ম বহির্ভূত করার আদেশ দেয়। বলা অসম্ভব।
দামন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.