Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;与VM ubuntu服务器12相比,基于libm的程序在裸机ubuntu服务器16上花费的时间太多 我试图在Ubuntu服务器上运行一个数学密集型C++程序,令人惊讶的是,在BeBeLeore核心i7 6700上运行的Ubuntu服务器16比在同一机器上的Windows 10上运行在VM上的双核Ubuntu Server 1.04.5花费更多的时间。看到这个结果完全令人惊讶。我在这两个平台上都使用了GCC版本5.4.1。还尝试使用-Ofast和-ffast数学进行编译,但没有任何区别。还尝试在裸机上获取最新的gcc 7.2,但同样没有任何区别。还尝试获取最新的libm(glibc),并尝试在数字上没有任何差异。有人能帮我知道哪里出了问题吗_C++_Performance_Ubuntu_Server_Libm - Fatal编程技术网

C++;与VM ubuntu服务器12相比,基于libm的程序在裸机ubuntu服务器16上花费的时间太多 我试图在Ubuntu服务器上运行一个数学密集型C++程序,令人惊讶的是,在BeBeLeore核心i7 6700上运行的Ubuntu服务器16比在同一机器上的Windows 10上运行在VM上的双核Ubuntu Server 1.04.5花费更多的时间。看到这个结果完全令人惊讶。我在这两个平台上都使用了GCC版本5.4.1。还尝试使用-Ofast和-ffast数学进行编译,但没有任何区别。还尝试在裸机上获取最新的gcc 7.2,但同样没有任何区别。还尝试获取最新的libm(glibc),并尝试在数字上没有任何差异。有人能帮我知道哪里出了问题吗

C++;与VM ubuntu服务器12相比,基于libm的程序在裸机ubuntu服务器16上花费的时间太多 我试图在Ubuntu服务器上运行一个数学密集型C++程序,令人惊讶的是,在BeBeLeore核心i7 6700上运行的Ubuntu服务器16比在同一机器上的Windows 10上运行在VM上的双核Ubuntu Server 1.04.5花费更多的时间。看到这个结果完全令人惊讶。我在这两个平台上都使用了GCC版本5.4.1。还尝试使用-Ofast和-ffast数学进行编译,但没有任何区别。还尝试在裸机上获取最新的gcc 7.2,但同样没有任何区别。还尝试获取最新的libm(glibc),并尝试在数字上没有任何差异。有人能帮我知道哪里出了问题吗,c++,performance,ubuntu,server,libm,C++,Performance,Ubuntu,Server,Libm,同时在程序上运行callgrind(我使用第三方so库,因此无法控制它),我看到大部分时间都花在libm上。除服务器版本外,这两个环境之间的唯一区别是libm版本。在表现良好的VM上为2.15,在需要更多时间的裸金属上为2.23。如有任何建议,将不胜感激。谢谢 生成命令是: g++ -std=c++14 -O3 -o scicomplintest EuroFutureOption_test.cpp -L. -lFEOption 该程序使用一个源代码不可用的库来计算一组22个履约价格的期权价格。

同时在程序上运行callgrind(我使用第三方so库,因此无法控制它),我看到大部分时间都花在libm上。除服务器版本外,这两个环境之间的唯一区别是libm版本。在表现良好的VM上为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;
我可以理解Windows10在虚拟机上的运行速度比linux快,但为什么裸金属ubuntu那么慢呢

无法得出任何结论,我将整个测试代码粘贴到下面。请帮忙(真想知道它为什么这样做)

#包括
#包括
#包括
#包括

更多更新: 在同一个g++7.2上,在baremetal和vm ubuntu上尝试了-fopenacc和-fopenmp。虚拟机显示了一点改进,但是裸机ubuntu一次又一次地显示相同的数字。另外,由于大部分时间都花在libm上,有没有办法升级该库?(glibc)?但在apt缓存中看不到任何新版本

使用callgrind并使用点绘制图形。根据这一点,在libm exp(版本2.23)中需要42.27%的时间,在libm日志中需要15.18%的时间

终于找到了一个类似的帖子(因此将其粘贴到此处供其他人使用):


据《华盛顿邮报》报道,怀疑的问题来自libs。通过现在设置LD_BIND_,执行时间大大减少(现在比VM少)。另外,这篇文章还有几个链接指向该版本glibc的bug。我们将在这里详细介绍。不过,感谢所有有价值的输入。

在您的问题中显示准确的编译命令,因此请编辑它以改进它并显示您的源代码。感谢您的回复。我希望我已经添加了所需的信息。如果没有,请告诉我。你可能想用
g++-O3-march=native
编译,也可以使用OpenMP、OpenACC等。你还应该使用Benchmark。我还建议将GCC升级到至少为什么不在VM和metal上使用完全相同的Ubuntu版本?或者,为什么不在VM和/或metal上使用两个不同的版本?消除未知。
Ubuntu server 12.04.5 on VM with dual core (over windows 10):
siril@ubuntu:/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
#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;
}