ছোট, অপ্রত্যাশিত ফলাফলগুলি একটি ডিস্ট্রিমেন্টিক মডেলের রানগুলিতে আসে


10

আমার সিতে একটি বিশাল আকারের মডেল (~ 5000 লাইন) লেখা আছে এটি একটি সিরিয়াল প্রোগ্রাম, কোথাও এলোমেলো সংখ্যা জেনারেশন সহ। এটি এফএফটি ব্যবহার করে ফাংশনগুলির জন্য এফএফটিডাব্লু লাইব্রেরি ব্যবহার করে - আমি এফএফটিডাব্লু বাস্তবায়নের বিশদ জানি না, তবে আমি অনুমান করি যে এর মধ্যে উপস্থিত ফাংশনগুলিও নির্ধারক (আমি ভুল করে থাকলে আমাকে সংশোধন করি)।

আমি যে বিষয়টি বুঝতে পারি না তা হ'ল আমি একই মেশিনে (একই সংকলক, একই গ্রন্থাগার) অভিন্ন রানের ফলাফলগুলিতে ছোট পার্থক্য পাচ্ছি।

আমি ডাবল-স্পষ্টতা ভেরিয়েবলগুলি ব্যবহার করি এবং valueউদাহরণটি ভেরিয়েবলের ফলাফল আউটপুট করতে আমি ইস্যু করি: fprintf(outFID, "%.15e\n", value);বা
fwrite(&value, 1, sizeof(double), outFID);

এবং আমি ক্রমাগত পার্থক্যগুলি পেয়ে
যাব : 2.07843469652206 4 ই -16 বনাম 2.07843469652206 3 ই -16

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

কি এই সৃষ্টি হতে পারে? এটি এখন একটি ছোট সমস্যা, তবে আমি ভাবছি এটি "আইসবার্গের টিপ" (কোনও গুরুতর সমস্যার) কিনা।

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

মন্তব্যে অনুসরণ:
ক্রিশ্চিয়ান ক্লাসন এবং বিক্রম: প্রথমে, আমার প্রশ্নের প্রতি আপনার মনোযোগ দেওয়ার জন্য আপনাকে ধন্যবাদ thank আপনি যে নিবন্ধগুলি সংযুক্ত করেছেন সেগুলি পরামর্শ দেয়: 1. গোলাকার ত্রুটিগুলি নির্ভুলতার সীমাবদ্ধ করে এবং 2. বিভিন্ন কোড (যেমন আপাতদৃষ্টিতে নিরীহ প্রিন্ট স্টেটমেন্টগুলি প্রবর্তন করা) মেশিনের অ্যাপসিলনের ফলাফলগুলিকে প্রভাবিত করতে পারে। আমার স্পষ্ট করে বলা উচিত যে আমি প্রভাব fwriteএবং fprintfফাংশনগুলির তুলনা করছি না । আমি একটি বা অন্যটি ব্যবহার করছি। বিশেষত, একই এক্সিকিউটেবল উভয় রানের জন্য ব্যবহৃত হয়। আমি fprintfওআর ব্যবহার করি কিনা তা সহজভাবেই আমি বলছি fwrite

সুতরাং কোড পাথ (এবং এক্সিকিউটেবল) একই, এবং হার্ডওয়্যার একই। এই সমস্ত বাহ্যিক কারণ অবিচ্ছিন্নভাবে রাখা, এলোমেলোতা কোথা থেকে আসে, মূলত? আমি সন্দেহ করেছি যে ত্রুটিযুক্ত মেমরিটি কিছুটা সঠিকভাবে ধরে না রাখার কারণে বিট ফ্লিপ হয়েছিল, যার কারণেই আমি মেমরি চিপগুলি প্রতিস্থাপন করেছি, তবে এখানে বিষয়টি মনে হচ্ছে না, আমি যাচাই করেছিলাম এবং আপনি ইঙ্গিত করেছেন। আমার প্রোগ্রামটি হাজারে এই ডাবল নির্ভুলতার সংখ্যাগুলিকে একক রানে আউটপুট করে এবং সর্বদা একটি এলোমেলো মুঠোফুল থাকে যা এলোমেলো বিট ফ্লিপ করে।

ক্রিশ্চান ক্লাসনের প্রথম মন্তব্য অনুসরণ করুন: মেশিনের নির্ভুলতার মধ্যে 0 এর সমান কেন ? একটি ডাবলের জন্য ক্ষুদ্রতম ধনাত্মক সংখ্যাটি 2.22e-308, সুতরাং এটি 0 এর সমান হওয়া উচিত না? আমার প্রোগ্রাম 10 ^ -16 পরিসীমা (1e-15 থেকে 8e-17 এর মধ্যে) কয়েক হাজার মানকে আউটপুট করে এবং আমরা আমাদের গবেষণা প্রকল্পে অর্থবহ বিভিন্নতা দেখতে পেয়েছি, তাই আমি আশা করি আমরা অযৌক্তিকের দিকে তাকাব না নম্বর।210-16

ফলোআপ # 2 :
মন্তব্যগুলিতে অফসুট আলোচনায় সহায়তা করার জন্য এটি মডেল দ্বারা টাইম সিরিজ আউটপুট দেওয়ার প্লট। এখানে চিত্র বর্ণনা লিখুন


210-16

আপনি জিজ্ঞাসা করছেন কেন আপনার যন্ত্রটি যথার্থতার চেয়ে সঠিক নয়। en.wikedia.org/wiki/Machine_epsilon
বিক্রম

1
ভাসমান পয়েন্ট পাটিগণিতের কোড পাথের সূক্ষ্ম প্রভাব সম্পর্কিত সম্পর্কিত উদাহরণের জন্য inf.ethz.ch/personal/gender/Hisisberg / paper.html দেখুন । এবং, অবশ্যই, ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02 সংখ্যার
খ্রিস্টান ক্লাসন

1
10-16

2
1

উত্তর:


9

আধুনিক কম্পিউটিং সিস্টেমগুলির এমন কিছু দিক রয়েছে যা অন্তর্নিহিত অ-সংজ্ঞাবাদী যা এই ধরণের পার্থক্যের কারণ হতে পারে। আপনার সমাধানগুলির প্রয়োজনীয় যথার্থতার তুলনায় যতক্ষণ পার্থক্যগুলি খুব কম হয়, সম্ভবত এটি নিয়ে উদ্বিগ্ন হওয়ার কোনও কারণ নেই।

আমার নিজের অভিজ্ঞতার ভিত্তিতে কী ভুল হতে পারে তার একটি উদাহরণ। এক্স এবং y দুটি ভেক্টরের ডট প্রোডাক্ট গণনা করার সমস্যাটি বিবেচনা করুন।

=Σআমি=1এনএক্সআমিYআমি

এক্সআমিYআমি

উদাহরণস্বরূপ, আপনি প্রথমে দুটি ভেক্টরের পণ্য গণনা করতে পারেন

=((এক্স1Y1)+ +(এক্স2Y2))+ +(এক্স3Y3)

এবং তারপর হিসাবে

=(এক্স1Y1)+ +((এক্স2Y2)+ +(এক্স3Y3))

এটা কিভাবে হতে পারে? এখানে দুটি সম্ভাবনা রয়েছে।

  1. সমান্তরাল কোরগুলিতে মাল্টিথ্রেডেড গণনা। আধুনিক কম্পিউটারগুলিতে সাধারণত 2, 4, 8 বা আরও বেশি প্রসেসরের কোর থাকে যা সমান্তরালভাবে কাজ করতে পারে। যদি আপনার কোডটি একাধিক প্রসেসরের উপর ডট পণ্য গণনা করতে সমান্তরাল থ্রেড ব্যবহার করে থাকে তবে সিস্টেমের যেকোন র্যান্ডম ব্যঙ্গাত্মকতা (উদাহরণস্বরূপ ব্যবহারকারী তার মাউসটি সরিয়ে নিয়েছে এবং প্রসেসরের কোরগুলির মধ্যে একটিতে ডট প্রোডাক্টে ফিরে আসার আগে মাউস চলাচল প্রক্রিয়া করতে পারে) সংযোজন ক্রম পরিবর্তন।

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

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

ইন্টেলের এই ডকুমেন্টেশনটি ইন্টেল ম্যাথ কার্নেল লাইব্রেরির সাথে ফলাফলগুলির পুনরায় প্রজননযোগ্যতার দিকে নিয়ে যেতে পারে এমন বিষয়গুলি নিয়ে আলোচনা করে। ইন্টেলের আরও একটি দস্তাবেজ যা ইন্টেলের সংকলকগুলির সাথে ব্যবহার করতে সংকলক সুইচগুলি নিয়ে আলোচনা করে।


আমি দেখতে পাচ্ছি যে আপনি ভাবেন যে আপনার কোডটি একক থ্রেডযুক্ত চলছে। যদিও আপনি সম্ভবত আপনার কোডটি ভাল জানেন তবে আপনি অবাক হবেন না যদি আপনি সাবট্রাইনগুলি (যেমন বিএলএএস রুটিন) কল করেন যা মাল্টিথ্রেডযুক্ত run আপনি ঠিক কি লাইব্রেরি ব্যবহার করছেন তা পরীক্ষা করা উচিত। আপনি নিজের সিপিইউ ব্যবহার দেখতে সিস্টেম মনিটরিং সরঞ্জামগুলিও ব্যবহার করতে পারেন।
ব্রায়ান বোর্চারস

1
বা, যেমন বলা হয়েছে, এফএফটিডাব্লু লাইব্রেরি ...
খ্রিস্টান ক্লাসন

ব্রায়ানবার্সার্স, আপনাকে ধন্যবাদ ভাসমান পয়েন্ট সংযোজনের অস-সংঘবদ্ধ প্রকৃতি থেকে এলোমেলোভাবে আগমন উদাহরণ l ক্রিশ্চান ক্লাসন আমার মডেল আউটপুট অর্থবহ তা সম্পর্কে একটি গৌণ বিষয় নিয়ে এসেছিল, সংখ্যার বিশালতা বিবেচনা করে - যদি সে সঠিক হয় তবে এটি একটি বড় সমস্যা হতে পারে (এবং আমি তাকে সঠিকভাবে বুঝতে পারি), তাই এখনই আমি এটি খতিয়ে দেখছি।
boxofchalk1

2

উল্লিখিত এফএফটিডাব্লু লাইব্রেরিটি একটি অ-নিষ্ক্রিয় মোডে চলতে পারে।

আপনি যদি FFTW_MEASURE বা FFTW_PATIENT মোড ব্যবহার করে থাকেন তবে প্রোগ্রামগুলি রানটাইমের সময় পরীক্ষা করে, কোন প্যারামিটারের মানগুলি দ্রুত কাজ করে এবং তারপরে পুরো প্রোগ্রাম জুড়ে সেই পরামিতিগুলি ব্যবহার করবে। যেহেতু রান সময়টি স্পষ্টতই কিছুটা ওঠানামা করবে, প্যারামিটারগুলি আলাদা হবে এবং ফুরিয়ার রূপান্তরগুলির ফলাফলটি অ-সংঘবদ্ধ হবে। আপনি যদি ডিটারমিনিস্টিক এফএফটিডব্লু চান, FFTW_ESTIMATE মোডটি ব্যবহার করুন।


1

যদিও এটি সত্য যে মাল্টি-কোর / মাল্টি-থ্রেড প্রক্রিয়াজাতকরণের কারণে এক্সপ্রেশন টার্ম মূল্যায়নের আদেশের পরিবর্তনগুলি খুব ভালভাবে ঘটতে পারে, তবে ভুলে যাবেন না যে কাজটিতে কোনও ধরণের হার্ডওয়্যার ডিজাইনের ত্রুটি থাকতে পারে it's পেন্টিয়াম এফডিএল সমস্যা মনে আছে? ( Https://en.wikedia.org/wiki/Pentium_FDIV_bug দেখুন )। কিছুক্ষণ আগে, আমি পিসি-ভিত্তিক অ্যানালগ সার্কিট সিমুলেশন সফওয়্যারটিতে কাজ করেছি। আমাদের পদ্ধতির একটি অংশে রিগ্রেশন-টেস্ট স্যুট বিকাশ করা জড়িত, যা আমরা সফটওয়্যারটির নাইট বিল্ডগুলির বিরুদ্ধে চালাতে পারি। আমরা যে মডেলগুলি বিকাশ করেছি তার সাথে অনেকগুলি পুনরাবৃত্ত পদ্ধতিগুলি (যেমন নিউটন-র‌্যাফসন ( https://en.wikedia.org/wiki/Newton%27s_method) এবং রঞ্জ-কত্তা) সিমুলেশন অ্যালগরিদমে ব্যাপকভাবে ব্যবহৃত হয়েছিল। অ্যানালগ ডিভাইসগুলির সাথে, এটি প্রায়শই এমন হয় যে অভ্যন্তরীণ নিদর্শনগুলি, যেমন ভোল্টেজ, স্রোত ইত্যাদির খুব কম সংখ্যক মান থাকে। এই মানগুলি, সিমুলেশন প্রক্রিয়ার অংশ হিসাবে, সময়ের সাথে ক্রমবর্ধমান পরিবর্তিত হয় are এই পরিবর্তনের পরিমাণটি খুব ছোট হতে পারে এবং আমরা প্রায়শই পর্যবেক্ষণ করেছিলাম যে এফপিইউর নির্ভুলতার "শব্দ" প্রান্তরে সীমান্তযুক্ত ডেল্টা মানগুলির পরবর্তী পরবর্তী এফপিইউ অপারেশনগুলি (-৪-বিট ভাসমান একটি 53-বিট ম্যান্টিসা, আইআইআরসি) রয়েছে। এটিই, আমরা প্রায়শই ডিবাগিংয়ের জন্য "প্রিন্টএফ" লগিং কোডটি প্রবর্তন করতে হয়েছিল (আহ, ভাল ওল'ড দিনগুলি!), দৈনিক ভিত্তিতে ব্যবহারিকভাবে ছড়িয়ে ছিটিয়ে থাকা ফলাফলের গ্যারান্টিযুক্ত! তাতে কি' এই সব মানে? আপনাকে এইরকম পরিস্থিতিতে পার্থক্য দেখতে আশা করতে হবে এবং করণীয় সর্বোত্তম বিষয় হ'ল কখন / কীভাবে সেগুলি উপেক্ষা করবেন সে সম্পর্কে সিদ্ধান্ত নেওয়ার একটি উপায় (বিশালতা, ফ্রিকোয়েন্সি, প্রবণতা ইত্যাদি) নির্ধারণ এবং বাস্তবায়ন করা।


ধন্যবাদ, অন্তর্দৃষ্টি জন্য জিম। কোন "মৌলিক ঘটনা" এর ফলে "অভ্যন্তরীণ নিদর্শনগুলি" ঘটতে পারে সে সম্পর্কে কোনও ধারণা? আমি ভেবেছিলাম বৈদ্যুতিন চৌম্বকীয় হস্তক্ষেপ এক হতে পারে তবে তাৎপর্যপূর্ণ বিটগুলিও প্রভাব ফেলবে, তাই না?
বক্সফচালক 1

1

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.