Jin Liu
Jin Liu

Reputation: 1

Exponential operator in C++ loop

I wrote C++ codes and matlab codes to test speed. My C++ code is:

int nrow = dim[0], ncol = dim[1];
double tmp, ldot;

for (int k = ncol - 1; k >= 0; --k){
    grad[k] = 0;
    for (int j = nrow - 1; j >= 0; --j){
        tmp = exp(eta[j + nrow * k]);
        ldot = (-Z[j + nrow * k] + tmp / (1 + tmp));
        grad[k] += A[j] * ldot;
    }
}

My matlab code is:

prob = exp(eta);
prob = prob./(1+prob);
ldot = prob - Z;
grad=sum(repmat(A,1,nGWAS).*ldot);

I run each code 100 times, it took over 5 seconds for C++ and only 1.2 seconds for matlab.

Anyone can help my here? Thanks.

Upvotes: 0

Views: 191

Answers (1)

xtofl
xtofl

Reputation: 41519

The folks at matlab know very well how to optimize matrix access.

You chose to access it column by column. My initial guess is that the matrix is laid out in memory row by row. This causes your code to run over the whole matrix ncol times. Cache misses all over the place.

Upvotes: 3

Related Questions