【问题标题】:MEX with IT++ slower than MATLAB?使用 IT++ 的 MEX 比 MATLAB 慢?
【发布时间】:2012-12-03 17:00:54
【问题描述】:

我已经使用 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);

}

}

【问题讨论】:

  • 您编译时是否激活了完全优化(-O3 或至少-O2)?您是否尝试过分析您的 mex 功能?
  • 不,我没有编译任何优化参数。我使用分析器分析了我的 mex 函数,因为我正在对它进行函数调用
  • 另外,当我尝试使用 -O3 或 -O2 时,mex 抱怨它不是一个有效的选项
  • mex 不支持 -O3 优化开关,这是 gcc 特定的。对于 mex,对应的开关是 -O。此外,除非您使用 -g 开关来禁止此操作,否则 mex 默认会打开优化。如果您使用 gcc 进行编译,您可以尝试添加 COMPFLAGS="$COMPFLAGS -O3"(在 Windows 上),在 UNIX 上是 CFLAGS(查看链接)。最后,MATLAB 在线性代数方面非常高效,您的 mex 文件无法在自己的游戏中击败它也就不足为奇了。
  • 嗯,我总是直接用 gcc 编译我的 mex 文件 - 因此我对编译器标志有误解。在 MATLAB 中:花费您想要优化的时间的调用是什么?如果是 FFT,我会假设你不会比 MATLAB 更好。如果是循环,您的 MEX 函数可能会有机会。 @Praetorian:据我所知,涉及的线性代数并不多。

标签: matlab mex


【解决方案1】:

IFFT 有多大?如果这是代码花费大部分时间的地方,那么您不能期望移植到 C++ 会显着提升。 documentation for IT++ FFT function 本身指出库的内存管理不是最佳的,直接调用 FFTW 可能会更快。另一方面,Matlab 在调用此类基本函数时进行了高度优化。

Matlab 的最新版本基于即时 (JIT) 编译,并且可能比简单的 C++ 实现更好。

[最后,我相信 IT++ 并不是最快的 C++ 矩阵库。根据您的用例,您可能会更快地找到犰狳或 Eigen。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 2013-08-08
    • 1970-01-01
    • 2015-04-19
    • 2013-09-10
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多