GCC编译墨西哥人编制的文件采取更多的时间比一个微软Visual Studio。

1视图(30天)
你好,我有下面的循环:
spmd
dgtilde = 0(长度(分母项),d.nexp2);
毫米= 1:d.nexp2
dgtilde (:, mm) =总和(g {d.exp2(毫米,1)}。* g {d.exp2(毫米,2)}。*重量,2)
- gtilde (:, d.exp2(毫米,1))。* gtilde (:, d.exp2(毫米,2));
结束
结束
我转换成内循环C代码如下:
#包括< math.h >
#包括< matrix.h >
#包括< mex.h >
#包括< stdio . h >
#包括< string.h >
#包括< stdlib.h >
无效mexFunction (int nlhs mxArray * plhs [],
intnrhs,常量mxArray * prhs [])
{
const mwSize *变暗;
const mxArray *细胞;
const mxArray * cellArray1, * cellArray2;
双* pr1、* pr2;
双*重量,* gtilde;
双* exp2;
双* sum_gammaXmom;
int妈妈,cellSize、nnz mm1,平方毫米,sgIndex;
bool issparse1 issparse2;
mwIndex i, j, k,计数,jcell,红外,* jc;
mwSize ncol nrow;
细胞= prhs [0];
妈妈= (int) mxGetScalar (prhs [1]);
重量= mxGetPr (prhs [2]);
exp2 = mxGetPr (prhs [3]);
dim = mxGetDimensions (prhs [3]);
gtilde = mxGetPr (prhs [4]);
如果(妈妈>退去[0])mexErrMsgTxt (“d。妈妈变量超过g细胞数组大小。”);
jcell = 0;
cellArray1 = mxGetCell (prhs [0], jcell);
cellSize = mxGetNumberOfElements (prhs [0]);
nrow = mxGetM (cellArray1);
ncol = mxGetN (cellArray1);
plhs [0] = mxCreateDoubleMatrix (nrow,妈妈,mxREAL);
sum_gammaXmom = mxGetPr (plhs [0]);
数= 0;
(j = 0; <(妈妈* nrow); j + +) sum_gammaXmom [j] = 0;
(jcell = 0;jcell <妈妈;jcell + +) {
mm1 = (int) exp2 [jcell] 1;
平方毫米= (int) exp2 [jcell +妈妈]1;
cellArray1 = mxGetCell (prhs [0], mm1);
cellArray2 = mxGetCell (prhs[0],平方毫米);
pr1 = mxGetPr (cellArray1);
pr2 = mxGetPr (cellArray2);
(我= 0;< nrow;我+ +){
sgIndex =我+ jcell * nrow;
(j = 0; < ncol; j + +) {
sum_gammaXmom [sgIndex] + = pr1[我+ j * nrow] * pr2[我+ j * nrow] *重量(i + j * nrow);
}
sum_gammaXmom [sgIndex] = sum_gammaXmom [sgIndex] -gtilde[我+ mm1 * nrow] * gtilde (i +平方毫米* nrow);
}
}
}
当我编译的墨西哥人文件通过微软Visual Studio Windows机器上编译器,它减少了执行时间的一半。另一方面,当我墨西哥人使用GCC编译器编译文件,执行时间没有得到更好的。我有两个问题:
  1. 为什么会有这种区别两个编译器的性能?
  2. 是否有办法改善C代码执行更好?
  3. 我应该期待改善的速度如果我使用3 d矩阵“g”作为输入,而不是单元阵列的双矩阵“g”。
  • g与每个实验室的变量是一个复合数据包含一系列细胞的双矩阵。
  • 重量与每个实验室的变量是一个复合数据包含一个双矩阵。
  • sum_gammaXmom变量计算dgtilde。
附录:
事实上,我有一个客户正在与gcc在基于linux / unix系统上。当我第一次把他C文件,编译和告诉我,它唯一的2倍速度比本地MATLAB,我得到3 x改进与微软Visual Studio。所以我在我的电脑安装了GCC,测试我的C函数,并有相同的3 x改进,我收到了MVS编译器。我问他要编译与O1, O2, O3选项,但没有运气。我附加mex_C_glnxa64。xml文件使用他的电脑和gcc MEXOPTS。bat文件,我用我的本地机器上。你们能告诉我如果我们使用任何不同的参数导致这种差异在两台机器性能。
谢谢。
3评论
dpb
dpb 2015年7月4日
惊人的;gcc通常被认为是很好的。你有最近的释放;你运行它在/它是一个本地安装或者下一个模拟层由任何机会吗?

登录置评。

答案(2)

Ivo Houtzager
Ivo Houtzager 2015年7月4日
之间有差异在默认浮点优化编译器。
的浮点计算GCC编译器默认严格遵循IEEE合规。可选 -ffast-math 国旗使优化,可以打破严格的IEEE合规。你可以试试如果这个选项提高速度精度的可能的成本。
的浮点计算和编译器默认不保持严格的IEEE合规。默认选项 / fp:精确 使一些非严格优化。如果你需要严格的浮点计算和编译器使用 / fp:严格 选择。最快的浮点计算和编译器可以提供使用 / fp:快 选择。
对编译器还允许使用SSE2指令(选项 /拱:SSE2 默认情况下在x86平台上。GCC不支持使用默认SSE2指令。启用指令支持最常见的处理机使用的选项金宝app - mtune =通用
4评论
Ubaid Ullah
Ubaid Ullah 2015年7月8日
我的客户尝试O1和O3,但是他没有看到任何改善。我将请他使用-ffast-math和- mtune =通用选项。

登录置评。


1月
1月 2015年7月4日
为什么两个编译器的性能会有这种区别呢?
编译器翻译成机器指令的C代码。可能有不同的翻译,导致相同的结果,但不同的运行时。例如,编译器可以创建MMX, SSE, SSE2或者SSE3指令。有的只在现代处理器上运行,有的支持旧处理器。金宝app因此,预计以不同的速度,不同的编译器创建项目。
试一试 memset 而不是一个循环 sum_gammaXmom 为零。或更好:省略这个零的,因为 mxCreateDoubleMatrix 用0填充该数组。
sum_gammaXmom [sgIndex] + = pr1[我+ j * nrow] * pr2[我+ j * nrow] *重量(i + j * nrow);
你可以试试如果存储 我+ j * nrow 在一个变量中避免重复计算相同的值。但我希望智能编译器能够认识到这一点。一般问题仍然是内存访问:便宜得多读和写与相邻的元素在内存中。有可能运行循环结束了吗 在里面,这样 [我+ j * nrow] 访问contiguos内存元素?
5个评论

登录置评。

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!