Boost logo

Boost Users :

From: Mike Marchywka (marchywka_at_[hidden])
Date: 2007-11-30 13:06:30


> I changed now the code to something runnable and have it also in matlab,
> u will see, its way slower in C++.

I probably shouldn't ask but did you verify the output was the same in both cases?
"diff " would work if you could get the same formats and precisions.
FWIW, a decent compiler could probably figure out that certain things have no observable
effect and start yanking code that produces such results.

Before you give up on C++, try coding a simple loop without the OO stuff
and see what you get. In-place wavelet is nice intro and you can use the optimized
result for "lifting" to more complicated wavelets.

> From: nishak44_at_[hidden]
> To: boost-users_at_[hidden]
> Date: Fri, 30 Nov 2007 17:05:55 +0000
> Subject: Re: [Boost-users] C++ Performance
>
>
> Hi guys
>
> Thanks for all. I follow your advises, posted the code in the ublas, gonna read a C++ book
> and Im positive, its gonna be fine.
>
> I changed now the code to something runnable and have it also in matlab,
> u will see, its way slower in C++.
>
>
> So first C++:
>
> #include
> #include "MVHF.h"
> #include
> #include
> #include
> #include
> #include
>
> #define DNDEBUG
> #include
>
> using namespace std;
>
> void ttrans(matrix& At, int level)
> {
> matrix cfe1, cfe2, cfo, cfe, c, d;
> int N,s2;
>
> N = (At.size1()+1)/2;
> s2 = At.size2();
> zero_matrix zer(N,s2);
>
> for (int ii = 1; ii <= level; ii++)
> {
>
> cfo = subslice(At, 0,2,N, 0,1,s2);
> cfe = subslice(At, 1,2,N-1, 0,1,s2);
>
> c = cfe + (subrange(cfo, 0,N-1, 0,s2)+subrange(cfo, 1,N, 0,s2))*0.5;
>
> zer.resize(N,s2,true);
> cfe1 = zer;
> cfe2 = zer;
>
> (subrange(cfe1, 0,N-1, 0,s2)).assign(cfe);
> (subrange(cfe2, 1,N, 0,s2)).assign(cfe);
> d = cfo-(cfe1+cfe2)*0.5;
>
> (subrange(At, 0,N-1, 0,At.size2())).assign(c);
> (subrange(At, N-1,2*N-1, 0,At.size2())).assign(d);
>
> N = N/2;
> }
>
> }
>
> void init(int dom,int llev)
> {
>
> int in_dofs_LA= 511;
> matrix Am_LA, As_LA;
> double mesh_size = ((double)(dom)/(in_dofs_LA+1));
>
> scalar_matrix zer(in_dofs_LA, in_dofs_LA,0.0);
> Am_LA.resize(in_dofs_LA, in_dofs_LA, false);
> As_LA.resize(in_dofs_LA, in_dofs_LA, false);
> Am_LA.assign(zer);
> As_LA.assign(zer);
>
> Am_LA(0,0) = 4.0;
> Am_LA(1,0) = 1.0;
>
> As_LA(0,0) = 2.0;
> As_LA(1,0) = -1.0;
>
> for (int ii = 1; ii < (in_dofs_LA-1); ii++){
> Am_LA(ii-1,ii) = 1.0;
> Am_LA(ii,ii) = 4.0;
> Am_LA(ii+1,ii) = 1.0;
>
> As_LA(ii-1,ii) = -1.0;
> As_LA(ii,ii) = 2.0;
> As_LA(ii+1,ii) = -1.0;
> }
>
> Am_LA(in_dofs_LA-2,in_dofs_LA-1) = 1.0;
> Am_LA(in_dofs_LA-1,in_dofs_LA-1) = 4.0;
>
> As_LA(in_dofs_LA-2,in_dofs_LA-1) = -1.0;
> As_LA(in_dofs_LA-1,in_dofs_LA-1) = 2.0;
>
> Am_LA = Am_LA*(mesh_size/6.0);
> As_LA = As_LA*(1.0/mesh_size);
>
> ttrans(Am_LA,llev);
> Am_LA = trans(Am_LA);
> ttrans(Am_LA,llev);
> Am_LA = trans(Am_LA);
>
> ttrans(As_LA,llev);
> As_LA = trans(As_LA);
> ttrans(As_LA,llev);
> As_LA = trans(As_LA);
>
> }
>
>
>
> int main() {
> clock_t start, end;
> start = clock();
>
> init(1,8);
> end = clock();
>
> std::cout << " " << std::endl;
> std::cout << "Elapsed time is " << (double)(end-start)/CLOCKS_PER_SEC << "." << std::endl;
> }
>
>
> Here the matlab version of it:
>
> function test()
> tic
> R = 1;
> L = 8;
> n = 2^(L+1)-1;
> h = R/(n+1);
>
> e = ones(n,1);
> Am = h/6*spdiags([e, 4*e, e], -1:1, n, n);
>
> % compute stiffness matrix
> As = 1/h*spdiags([-e, 2*e, -e], -1:1, n, n);
>
> % transform into wavelets
> Am = ttrans(ttrans(Am,L)',L)';
> As = ttrans(ttrans(As,L)',L)';
> toc
>
> return
>
> function cd = ttrans(cl,L)
> N = size(cl,1)+1;
> N = N/2;
>
> m = size(cl,2);
>
> z = zeros(1,m);
> cd = cl;
> for i=1:L
> cfo = cd(1:2:2*N-1,:);
> cfe = cd(2:2:2*N-2,:);
>
> % wavelets
> c = cfe + (cfo(1:end-1,:)+cfo(2:end,:))/2;
> d = cfo - ([cfe;z]+[z;cfe])/2;
>
> cd(1:2*N-1,:) = [c;d];
> N = N/2;
> end
>
> return
>
> But I really gotta say, this mailing list is great. I really appreciate all of your replies.
>
> Thanks,
> Nisha K
> _________________________________________________________________
> News, entertainment and everything you care about at Live.com. Get it now!
> http://www.live.com/getstarted.aspx
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users

_________________________________________________________________
Connect and share in new ways with Windows Live.
http://www.windowslive.com/connect.html?ocid=TXT_TAGLM_Wave2_newways_112007


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net