我正在运行ubuntu,64位。我有这个最小的测试包,我学习如何做这些事情(我正在关注这个tutorial,除了我在包中也有一些c代码)。
包构建/在linux中运行所以我开始在windows中运行它。
我遵循了这个answer,并使用Uwe Ligges维护的在线Windows包构建器来获取package的(工作)zip版本。
现在,当我在Windows(7-64)上安装.zip软件包时,小的演示代码运行速度比linux版本慢。如在慢30倍。我怀疑差异总是那么大。 我想知道我做错了什么以及如何解决这个差距。
这是源代码(这是一个最小的工作示例):
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <functional>
#include <fstream>
#include <iostream>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <vector>
#include <Eigen/Dense>
#include <Eigen/LU>
#include <Eigen/SVD>
using namespace std;
using namespace Eigen;
using Eigen::MatrixXf;
using Eigen::VectorXf;
float median(VectorXf& x) {
int n=x.rows();
int half=(n+1)/2;
half--;
float med;
nth_element(x.data(),x.data()+half,x.data()+x.size());
if((n%2)==1){
med=x(half);
} else {
float tmp0=x(half);
float tmp1=x.segment(half+1,half-1).minCoeff();
med=0.5*(tmp0+tmp1);
}
return med;
}
VectorXf fx01(MatrixXf& x){
int p=x.cols();
int n=x.rows();
VectorXf Recept(n);
VectorXf Result(p);
for(int i=0;i<p;i++){
Recept=x.col(i);
Result(i)=median(Recept);
}
return Result;
}
extern "C"{
void mse(int* n,int* p,float* x,float* medsout){
MatrixXf x_cen=Map<MatrixXf>(x,*n,*p);
VectorXf MedsOut=fx01(x_cen);
Map<VectorXf>(medsout,*p)=MedsOut.array();
}
}
根据cbeleites建议我多次运行代码。这样做我发现了
一个奇怪的事情:函数的时间实际上与linux相同,除非
我在调用我的函数之前调用apply()
- 我总是在比较时间
我的包的colwise中位数计算到apply(X,2,median)
-
好的,问题解决了。目前。我现在仍然很好奇:为什么一个好的老式
调用apply()
(在一个巨大的矩阵X上)破坏事情非常糟糕(system.time来自
90秒到3秒)?
答案 0 :(得分:3)
我不介意在不同机器上进行计算可能有所不同的一种可能性是BLAS(如果示例中有线性代数计算)。
您是否在Ubuntu上安装了优化的BLAS(例如libopenblas)但在Windows上没有?