1

mex と it++ を使用して C で MATLAB 関数を書き直しましたが、mex の実装は MATLAB 関数よりもかなり遅くなります。誰かが私が間違っていることを教えてくれるかどうか疑問に思っていました。MATLAB

for idx = 1:length(eps_r)
    if (idx == 1) || (eps_r(idx) ~= eps_r(idx-1))
        v_p     = c/sqrt(eps_r(idx)); % m/s - Propogation Velocity
        dz      = v_p*dt/2;
        k       = 2*w/v_p; % rad/m
        z_shift = exp(1i*dz*sqrt((repmat(k,1,size(data,2))).^2-(repmat(kx,size(data,1),1)).^2));
    end

    fk_data(idx,:) = ifft(mean(data))*exp(-1i*2*pi*freq(1)*time(idx));
    data    = data.*z_shift;
end

MEX と IT++

 for(int idx = 0; idx < eps_r.size();  idx++ )
 {
     if ( (idx == 1) || (eps_r(idx) != eps_r(idx-1) ) )
     {
         v_p =  2.9979e+08 / sqrt(eps_r(0));

         dz = v_p * time(0)/2;
         k = 2 * w / v_p;

         for(int y = 0 ; y < z_shift.size(); y++) 
             z_shift(y) = exp(dz * i * sqrt(pow(z_shift_pt1(y),2) - pow(z_shift_pt2(y),2)));
     }

     fk_data =  ifft(complex_mean(data)) * exp(-i * 2 * itpp::pi * freq(0) * time(idx));
     data = elem_mult(data,z_shift);

}

}
4

1 に答える 1

1

IFFTの大きさは?それがコードがほとんどの時間を費やす場所である場合、C++ への移植による大幅な向上は期待できません。IT++ FFT 関数自体のドキュメントには、ライブラリのメモリ管理が最適ではなく、FFTW を直接呼び出す方が高速である可能性があると記載されています。一方、Matlab は、このような基本的な関数の呼び出しに関して高度に最適化されています。

最近のバージョンの Matlab は Just-In-Time (JIT) コンパイルに基づいており、単純な C++ 実装よりもパフォーマンスが優れている場合があります。

[最後に、IT++ は最速の C++ マトリックス ライブラリではないと思います。ユースケースによっては、Armadillo または Eigen をより早く見つけることができます]。

于 2012-12-03T20:55:48.530 に答える