2

我正在运行 64 位的 ubuntu。我有一个最小的测试包,用于学习如何做这些事情(我正在关注本教程,除了包中还有一些 c 代码)。

该软件包在 linux 中构建/运行,所以我也开始着手让它在 Windows 中运行。

我遵循了这个答案并使用了由 Uwe Ligges 维护的在线 windows 包生成器来获取我的的(工作)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();
    }
}

编辑2:

按照 cbeleites 的建议,我多次运行代码。这样做我发现了一件奇怪的事情:函数的时间实际上与 linux 相同,除非我apply()在调用函数之前调用——我总是将我的包计算的 colwise 中位数的时间与做的时间进行比较apply(X,2,median)——

好的,问题解决了。目前。我现在仍然很好奇:为什么一个好的老式调用apply()(在一个巨大的矩阵 X 上)会如此糟糕地破坏事情(system.time 从 90 秒变为 3 秒)?

4

1 回答 1

3

我想到的一种可能性,即不同机器上的计算可能不同的是 BLAS(如果示例中有线性代数计算)。

您是否在 Ubuntu(例如 libopenblas)上安装了优化的 BLAS,但在 Windows 上没有?

于 2013-01-08T12:14:35.477 回答