c++ - ويندوز - تحميل نظام اوبنتو للكمبيوتر



C++ برنامج يستند ليم أخذ الكثير من الوقت على بارميتال أوبونتو الخادم 16 مقارنة مع خادم فم أوبونتو 12 (0)

أحاول تشغيل برنامج C ++ مكثف الرياضيات على خادم أوبونتو والمثير للدهشة أوبونتو سيرفر 16 التي تعمل على كور i7 6700 بارميتال يستغرق وقتا أطول من ثنائي النواة أوبونتو الخادم 12.04.5 يعمل على فم على ويندوز 10 على نفس الجهاز . من المستغرب تماما أن نرى هذه النتيجة. أنا باستخدام النسخة 5.4.1 من دول مجلس التعاون الخليجي على حد سواء. حاول أيضا تجميع باستخدام -Ofast و -ffast الرياضيات ولكن لم يحدث أي فرق. حاول أيضا جلب أحدث غك 7.2 على المعدن ولكن مرة أخرى لم يحدث أي فرق على الإطلاق. حاول أيضا جلب أحدث ليب (غليبك) وحاول مع عدم وجود فرق في الأرقام على الإطلاق. يمكن للشخص الرجاء المساعدة في السماح لي أن أعرف أين تسير الأمور على ما يرام؟

أيضا تشغيل كالغريند على البرنامج (أنا باستخدام طرف ثالث حتى المكتبة وحتى لا يكون لها السيطرة على ذلك)، أرى معظم الوقت الذي يقضيه في ليبم. والفرق الوحيد بين البيئتين بخلاف إصدار الخادم هو إصدار ليب. على فم الذي أداء جيدا كان 2.15 وعلى المعدن الذي يستغرق المزيد من الوقت هو 2.23. أي اقتراحات سيكون موضع تقدير كبير. شكر.

الأمر بناء هو:

g++ -std=c++14 -O3 -o scicomplintest EuroFutureOption_test.cpp -L. -lFEOption

البرنامج هو حساب الإغريق الخيار لمجموعة من 22 أسعار الإضراب باستخدام مكتبة رمز المصدر غير متوفر. ومع ذلك سيكون قادرا على الإجابة على أي أسئلة ورت رمز الاختبار.

تم تبسيط حساب وقت الاستجابة باستخدام الفئة أدناه:

typedef std::chrono::high_resolution_clock::time_point TimePoint;
typedef std::chrono::high_resolution_clock SteadyClock;

template <typename precision = std::chrono::microseconds>
class EventTimerWithPrecision
{
public:
    EventTimerWithPrecision() { _beg = SteadyClock::now(); }

    long long elapsed() {
        return  std::chrono::duration_cast<precision>(SteadyClock::now() 
                    -       _beg).count();
    }

    void reset() { _beg = SteadyClock::now(); }

private:
    TimePoint _beg;
};

typedef EventTimerWithPrecision<> EventTimer;

الآن أنا الحصول على الأوقات على النحو التالي:

Ubuntu server 12.04.5 on VM with dual core (over windows 10):
[email protected]:/media/sf_workshare/scicompeurofuturestest$ ./scicomplintest
Mean time: 61418 us
Min time: 44990 us
Max time: 79033 us

Ubuntu server 16 on Core i7 6700 bare metal:
Mean time: 104888 us
Min time: 71015 us
Max time: 125928 us

on Windows 10 (MSVC 14) on Core i7 6700 bare metal:
D:\workshare\scicompeurofuturestest\x64\Release>scicompwintest.exe
Mean time: 53322 us
Min time: 39655 us
Max time: 64506 us

أستطيع أن أفهم ويندوز 10 أداء أسرع من لينكس على فم ولكن لماذا هو أوبونتو بارميتال بطيئة جدا؟

غير قادر على الوصول إلى أي استنتاج صباحا لصق رمز الاختبار كله أدناه. الرجاء المساعدة (غريبة حقا أن نعرف لماذا يتصرف ذلك).

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>

#include "FEOption.h"
#include <chrono>

#define PRINT_VAL(x) std::cout << #x << " = " << (x) << std::endl

typedef std::chrono::high_resolution_clock::time_point TimePoint;
typedef std::chrono::high_resolution_clock SteadyClock;

template <typename precision = std::chrono::microseconds>
class EventTimerWithPrecision
{
public:
    EventTimerWithPrecision() { _beg = SteadyClock::now(); }

    long long elapsed() {
    return  std::chrono::duration_cast<precision>(SteadyClock::now() - _beg).count();
    }

    void reset() { _beg = SteadyClock::now(); }

private:
    TimePoint _beg;
};

typedef EventTimerWithPrecision<> EventTimer;

int main(){
    int cnt, nWarmup = 10, nTimer = 100000;
    double CompuTime;

    // Option Parameters
    double Omega[] = {
        -1,
        -1,
        -1,
        1,
        1,
        1,
        1,
        -1,
        -1,
        -1,
        1,
        1,
        1,
        1,
        -1,
        -1,
        -1,
        1,
        1,
        1,
        1,
        -1,
        -1,
        -1,
        1,
        1,
        1,
        1,
        -1,
        -1,
        -1,
        1,
        1,
        1,
        1,
        -1,
        -1,
        -1,
        1,
        1,
        1,
        1
    };
    double Strike[] = {
        92.77434863,
        95.12294245,
        97.5309912,
        100,
        102.5315121,
        105.1271096,
        107.7884151,
        89.93652726,
        93.17314234,
        96.52623599,
        100,
        103.598777,
        107.327066,
        111.1895278,
        85.61884708,
        90.16671558,
        94.95615598,
        100,
        105.311761,
        110.90567,
        116.796714,
        80.28579206,
        86.38250571,
        92.9421894,
        100,
        107.5937641,
        115.7641807,
        124.5550395,
        76.41994703,
        83.58682355,
        91.4258298,
        100,
        109.3782799,
        119.6360811,
        130.8558876,
        73.30586976,
        81.30036598,
        90.16671558,
        100,
        110.90567,
        123.0006763,
        136.4147241
    };

    double Expiration[] = {
        7,
        7,
        7,
        7,
        7,
        7,
        7,
        14,
        14,
        14,
        14,
        14,
        14,
        14,
        30,
        30,
        30,
        30,
        30,
        30,
        30,
        60,
        60,
        60,
        60,
        60,
        60,
        60,
        90,
        90,
        90,
        90,
        90,
        90,
        90,
        120,
        120,
        120,
        120,
        120,
        120,
        120
    };

    int TradeDaysPerYr = 252;

    // Market Parameters
    double ValueDate = 0;
    double Future = 100;
    double annualSigma = 0.3;
    double annualIR = 0.05;

    // Numerical Parameters
    int GreekSwitch = 2;
    double annualSigmaBump = 0.01;
    double annualIRBump = 0.0001;
    double ValueDateBump = 1;

    double PV;
    double Delta;
    double Gamma;
    double Theta;
    double Vega;
    double Rho;

    sciStatus_t res;

    int nData = sizeof(Strike) / sizeof(double);
    std::vector<long long> v(nData);

    for (int i = 0; i < nData; i++)
    {

        for (cnt = 0; cnt < nWarmup; ++cnt){
            res = EuroFutureOptionFuncC(annualIR, annualSigma, Omega[i], ValueDate, Expiration[i], Future, Strike[i], TradeDaysPerYr, annualIRBump + cnt*1.0e-16,
                annualSigmaBump, ValueDateBump, GreekSwitch,
                &PV,
                &Delta,
                &Gamma,
                &Theta,
                &Vega,
                &Rho
                );
            if (res != SCI_STATUS_SUCCESS) {
                std::cout << "Failure with error code " << res << std::endl;
                return -1;
            }
        }
    EventTimer sci;

        for (cnt = 0; cnt < nTimer; ++cnt){
            res = EuroFutureOptionFuncC(annualIR, annualSigma, Omega[i], ValueDate, Expiration[i], Future, Strike[i], TradeDaysPerYr, annualIRBump + cnt*1.0e-16,
                annualSigmaBump, ValueDateBump, GreekSwitch,
                &PV,
                &Delta,
                &Gamma,
                &Theta,
                &Vega,
                &Rho
                );
            if (res != SCI_STATUS_SUCCESS) {
                std::cout << "Failure with error code " << res << std::endl;
                return -1;
            }
        }

        v[i] = sci.elapsed();
    }

    long long sum = std::accumulate(v.begin(), v.end(), 0);
    long long mean_t = (double)sum / v.size();
    long long max_t = *std::max_element(v.begin(), v.end());
    long long min_t = *std::min_element(v.begin(), v.end());

    std::cout << "Mean time: " << mean_t << " us" << std::endl;
    std::cout << "Min time: " << min_t << " us" << std::endl;
    std::cout << "Max time: " << max_t << " us" << std::endl;
    std::cout << std::endl;

    PRINT_VAL(PV);
    PRINT_VAL(Delta);
    PRINT_VAL(Gamma);
    PRINT_VAL(Theta);
    PRINT_VAL(Vega);
    PRINT_VAL(Rho);

    return 0;
}

الرسم البياني كالغريند على النحو التالي: الرسم البياني كالغريند

مزيد من التحديثات: حاول -fopenacc و -fopenmp على حد سواء بارميتال و فم أوبونتو على نفس g + 7.2 7.2. أظهرت فم تحسن طفيف ولكن أوبونتو بارميتال يظهر نفس العدد مرارا وتكرارا. أيضا منذ معظم الوقت الذي يقضيه في ليبم، هل هناك أي وسيلة لرفع مستوى تلك المكتبة؟ (غليبك)؟ لا ترى أي نسخة جديدة منه في أبت-كاش على الرغم من

كالغريند مستعملة ورسم رسم بياني باستخدام نقطة. وفقا لذلك فإنه يأخذ 42.27٪ الوقت في ليب إكس (الإصدار 2.23) و 15.18٪ مرة في سجل ليب.

وأخيرا وجدت وظيفة مماثلة (حتى لصق هنا للآخرين): البرنامج يعمل 3 مرات أبطأ عندما جمعت مع G ++ 5.3.1 من نفس البرنامج جمعت مع G ++ 4.8.4، نفس الأمر

وكانت المشكلة كما يشتبه من ليبس (وفقا لهذا المنصب). وبتعيين LD_BIND_NOW جاءت مرات التنفيذ بشكل كبير (والآن أقل من فم). أيضا أن وظيفة لديها زوجين من الروابط إلى البق التي تم تقديمها لهذا الإصدار من غليبك. سوف تذهب من خلال وسوف تعطي المزيد من التفاصيل هنا. ومع ذلك شكرا لجميع المدخلات القيمة.





libm