gpt4 book ai didi

r - 使用 Rcpp 运行的代码比使用 g++ 编译的更快

转载 作者:行者123 更新时间:2023-12-04 14:38:44 26 4
gpt4 key购买 nike

我以两种方式运行完全相同的代码:使用 g++ 编译它编译器,并从 R 调用它与 Rcpp .事实证明,当我运行它时,它的运行速度几乎快了 4 倍 R .

为什么会发生这种情况?是不是因为Rcpp使用的编译器是不同的?

这是我在 c++ 中运行的代码:

#include <iostream>
#include <nlopt.hpp>
#include <time.h>
using namespace std;


int main()
{

//--------------------------------//
// Initialization //
//--------------------------------//

// Grid for x
const int nx = 60000;

float xgrid[nx];
const float xstep = 4 /(nx - 1);
float it = 0;

for(int i = 0; i < nx; i++){
xgrid[i] = it*xstep;
it++;
}

// Initialize value function V
size_t sizeV = nx*sizeof(float);
float *V;
V = (float *)malloc(sizeV);


//--------------------------------//
// Computation //
//--------------------------------//

// Variables for computation time
double t0 = clock();
double t = t0;

float utility;
float VV = pow(-10.0,5.0);

for(int ix = 0; ix<nx; ix++){

VV = pow(-10.0,5.0);

for(int ixp = 0; ixp < nx; ixp++){

utility = (xgrid[ix] + 1 - xgrid[ixp])*(xgrid[ix] + 1 - xgrid[ixp]);

if(utility >= VV){
VV = utility;
}
}

V[ix] = VV;
}

t = clock() - t0;
cout << "Time: " << ((float)t)/CLOCKS_PER_SEC << " seconds." << endl;

return 0;
}

要运行它,我使用:
g++ Cpp_main.cpp -o Cpp_main
Rcpp中的代码是:
#include <iostream>
#include <nlopt.hpp>
#include <time.h>
using namespace std;


// [[Rcpp::export]]
vector<double> value(int nx){

//--------------------------------//
// Grid creation //
//--------------------------------//

float xgrid[nx];

const float xstep = 4 /(nx - 1);
float it = 0;

for(int i = 0; i < nx; i++){
xgrid[i] = it*xstep;
it++;
}

// Initialize value function V
vector<double> V;
V.resize(nx);


//--------------------------------//
// Computation //
//--------------------------------//

// Variables for computation time
double t0 = clock();
double t = t0;

float utility;
float VV = pow(-10.0,5.0);

for(int ix = 0; ix<nx; ix++){

VV = pow(-10.0,5.0);

for(int ixp = 0; ixp < nx; ixp++){

utility = (xgrid[ix] + 1 - xgrid[ixp])*(xgrid[ix] + 1 - xgrid[ixp]);

if(utility >= VV){
VV = utility;
}
}

V[ix] = VV;
}

t = clock() - t0;
cout << "Time: " << ((float)t)/CLOCKS_PER_SEC << " seconds." << endl;

return V;
}

我从 R 调用它和:
library("Rcpp")
sourceCpp("Rcpp_main.cpp")

# Grid for x
nx = 60000;

V = value(nx);
c++中的运行时间是 Rcpp 中运行时间的两倍.任何线索为什么会发生这种情况?

最佳答案

只看你的 main()我们得到这个:

edd@rob:/tmp/soQ$ g++ -o main main.cpp 
edd@rob:/tmp/soQ$ ./main
Time: 8.42708 seconds.
edd@rob:/tmp/soQ$ g++ -o main -O3 -march=native main.cpp
edd@rob:/tmp/soQ$ ./main
Time: 1.59151 seconds.
edd@rob:/tmp/soQ$

这已经是 5.3 的因数,并且是我在一段时间内看到的关于 -O3 影响的最奇怪的例子之一。 .

对于 R,我得到的时间与 R 在这里默认使用 -O3 的时间大致相同。
R> Rcpp::sourceCpp("/tmp/soQ/rcppfunction.cpp")    
R> V <- value(60000)
Time: 1.65224 seconds.
R>

所以这里没有真正的谜团。您使用了不同的选项,这很重要。

关于r - 使用 Rcpp 运行的代码比使用 g++ 编译的更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49544398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com