मैंने बढ़ावा देने का हिस्सा संकलित किया है - ibeta_inv फ़ंक्शन - .Net 64 बिट असेंबली में और यह तब तक अच्छा काम करता है जब तक कि मैंने इसे एकाधिक थ्रेड से कॉल करना शुरू नहीं किया। फिर यह मौलिक रूप से गलत परिणाम देता है।बूस्ट गणित (ibeta_inv फ़ंक्शन) थ्रेड सुरक्षित नहीं है?
// Boost.h
#pragma once
#include <boost/math/special_functions/beta.hpp>
using namespace boost::math;
namespace Boost {
public ref class BoostMath
{
public:
double static InverseIncompleteBeta(double a, double b, double x)
{
return ibeta_inv(a,b,x);
}
};
}
किसी को भी करने से पहले इस की कोशिश की है:
मैं इस कोड (C++/CLI) का उपयोग कर यह पालन किया?
मैंने इसे बाहर नहीं किया है। नेट, इसलिए मुझे नहीं पता कि यह कारण क्या है, लेकिन मुझे वास्तव में यह नहीं पता कि क्यों, यह महान एकल थ्रेडेड काम करता है।
प्रयोग (सी #):
private void calcBoost(List<Val> vals)
{
//gives WRONG results (sometimes):
vals.AsParallel().ForAll(v => v.BoostResult = BoostMath.InverseIncompleteBeta(v.A, v.B, v.X));
//gives CORRECT results:
vals.ForEach(v => v.BoostResult = BoostMath.InverseIncompleteBeta(v.A, v.B, v.X));
}
अद्यतन: जैसा कि नीचे मेरी टिप्पणी में देखा जा सकता है - मैं सब पर अब और है कि यह एक बूस्ट समस्या है यकीन नहीं है। शायद यह कुछ अजीब PLinq सी ++/सीएलआई बग ??? मैं blaffed हूँ और बाद में और तथ्यों के साथ वापस आ जाएगा।
दस्तावेज़ीकरण का कहना है कि पूरे boost.math को थ्रेड सुरक्षित होना चाहिए जब तक कि आप अंतर्निहित फ्लोटिंग पॉइंट प्रकारों का उपयोग करें (जो, जैसा कि मैंने देखा है, आप करते हैं)। शायद आपको एक बग फाइल करना चाहिए? http://www.boost.org/doc/libs/release/libs/math/doc/sf_and_dist/html/math_toolkit/main_overview/threads.html – stanwise
यदि कुछ और नहीं हो जाता है, तो मैं इसे मूल C++ में आज़मा सकता हूं ऐप और देखें कि समस्या बनी हुई है या नहीं। यदि ऐसा है, तो एक बग रिपोर्ट केवल एकमात्र चीज हो सकती है, क्योंकि मैं स्रोत कोड में कुछ भी नहीं खोज सकता। दयालुता हालांकि ... यह उलटा अपूर्ण बीटा फ़ंक्शन के हमारे वर्तमान कार्यान्वयन के रूप में तेज़ी से दोगुना चलता है। –
दिलचस्प!दो विचार दिमाग में आते हैं: (1) ट्रिपल-चेक आपने मल्टीथ्रेड मोड में बढ़ावा दिया है (वर्तमान संस्करण अभी भी भेद बनाते हैं), और (2) इस उद्धरण, दस्तावेज से @stanwise जुड़े हुए हैं: 'बाद की सीमा का कारण संरचनाओं का उपयोग करके प्रतीकात्मक स्थिरांक शुरू करने की आवश्यकता है ... इस मामले में टी के रचनाकारों को चलाने की आवश्यकता है, जिससे संभावित दौड़ की स्थिति बढ़ती है। 'मैं खुले तौर पर आश्चर्य करता हूं कि आपका कोड अप्रत्याशित रूप से इस दौड़ की स्थिति को उजागर करता है, और मैं पूरी तरह से वापस आ गया हूं एक बग के रूप में रिपोर्ट करने पर stanwise। – MrGomez