C+中的指数算子+;环 我编写C++代码和MATLAB代码来测试速度。我的C++代码是: 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; } }

C+中的指数算子+;环 我编写C++代码和MATLAB代码来测试速度。我的C++代码是: 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; } },c++,matlab,C++,Matlab,我的matlab代码是: prob = exp(eta); prob = prob./(1+prob); ldot = prob - Z; grad=sum(repmat(A,1,nGWAS).*ldot); < >我运行每个代码100次,它花费了5秒的C++,而只有1.2秒的MATLAB。p> 有人能帮我吗?谢谢。matlab的工作人员非常了解如何优化矩阵访问 您选择逐列访问它。我最初的猜测是矩阵是在内存中逐行排列的。这会导致您的代码在整个矩阵ncol次上运行。到处都是缓存丢失。matlab

我的matlab代码是:

prob = exp(eta);
prob = prob./(1+prob);
ldot = prob - Z;
grad=sum(repmat(A,1,nGWAS).*ldot);
< >我运行每个代码100次,它花费了5秒的C++,而只有1.2秒的MATLAB。p>
有人能帮我吗?谢谢。

matlab的工作人员非常了解如何优化矩阵访问


您选择逐列访问它。我最初的猜测是矩阵是在内存中逐行排列的。这会导致您的代码在整个矩阵
ncol
次上运行。到处都是缓存丢失。

matlab的工作人员非常了解如何优化矩阵访问


您选择逐列访问它。我最初的猜测是矩阵是在内存中逐行排列的。这会导致您的代码在整个矩阵
ncol
次上运行。到处都是缓存丢失。

matlab的工作人员非常了解如何优化矩阵访问


您选择逐列访问它。我最初的猜测是矩阵是在内存中逐行排列的。这会导致您的代码在整个矩阵
ncol
次上运行。到处都是缓存丢失。

matlab的工作人员非常了解如何优化矩阵访问




您选择逐列访问它。我最初的猜测是矩阵是在内存中逐行排列的。这会导致您的代码在整个矩阵
ncol
次上运行。到处都是缓存丢失。

您是否使用优化进行编译?您应该澄清您的问题(可能是标题)。看来你在问为什么C++代码比较慢或者C++代码如何被简化。你的数据有多大?NRO= 50000,NCOL=10。是的,我使用visual studio 12.0编译器在matlab中使用mex编译了它。
eta
Z
A
grad
的类型是什么?C++数组?向量?…你是用优化编译的吗?你应该澄清你的问题(也许是标题)。看来你在问为什么C++代码比较慢或者C++代码如何被简化。你的数据有多大?NRO= 50000,NCOL=10。是的,我使用visual studio 12.0编译器在matlab中使用mex编译了它。
eta
Z
A
grad
的类型是什么?C++数组?向量?…你是用优化编译的吗?你应该澄清你的问题(也许是标题)。看来你在问为什么C++代码比较慢或者C++代码如何被简化。你的数据有多大?NRO= 50000,NCOL=10。是的,我使用visual studio 12.0编译器在matlab中使用mex编译了它。
eta
Z
A
grad
的类型是什么?C++数组?向量?…你是用优化编译的吗?你应该澄清你的问题(也许是标题)。看来你在问为什么C++代码比较慢或者C++代码如何被简化。你的数据有多大?NRO= 50000,NCOL=10。是的,我使用visual studio 12.0编译器在matlab中使用mex编译了它。
eta
Z
A
grad
的类型是什么?C++数组?向量?…谢谢你的建议。但据我所知,MatlabMex以列的方式传递所有矩阵。如果我错了请纠正我。@ JinLiu,你是说你正在用C++代码做MEX?你的问题中没有写这句话。此外,C++中的数组不是Matlab所使用的类型,它使用 MxReals。此外,据我所知,C和C++数组是行的主要部分。这来自数组的定义。一个二维数组<代码> ARR[2 ] [3 ] < /C>是一个2元长数组的3行长数组。C++中的金六元数组不是Matlab所使用的,它使用MxRead。此外,据我所知,C和C++数组是行的主要部分。这来自数组的定义。二维数组
arry[2][3]
实际上是由2个元素组成的数组,每个元素包含一个3元素长数组。二维数组也就是数组的数组。@帕特里克第二眼看到,OP正在从
nrows*ncols-1
0
连续访问数组。向下。@patrik实际上,我使用了一维数组(按列向量化的矩阵)。这不应该是速度慢的原因。谢谢你的建议。但据我所知,MatlabMex以列的方式传递所有矩阵。如果我错了请纠正我。@ JinLiu,你是说你正在用C++代码做MEX?你的问题中没有写这句话。此外,C++中的数组不是Matlab所使用的类型,它使用 MxReals。此外,据我所知,C和C++数组是行的主要部分。这来自数组的定义。一个二维数组<代码> ARR[2 ] [3 ] < /C>是一个2元长数组的3行长数组。C++中的金六元数组不是Matlab所使用的,它使用MxRead。此外,据我所知,C和C++数组是行的主要部分。这来自数组的定义。二维数组
arry[2][3]
实际上是由2个元素组成的数组,每个元素包含一个3元素长数组。二维数组也就是数组的数组。@帕特里克第二眼看到,OP正在从
nrows*ncols-1
0
连续访问数组。向下。@patrik实际上,我使用了一维数组(按列向量化的矩阵)。这不应该是速度慢的原因。谢谢你的建议。但据我所知,MatlabMex以列的方式传递所有矩阵。如果我错了请纠正我。@ JinLiu,你是说你正在用C++代码做MEX?你的问题中没有写这句话。此外,C++中的数组不是Matlab所使用的类型,它使用 MxReals。此外,据我所知,C和C++数组是行的主要部分。这来自数组的定义。二维数组
arry[2][3]
实际上是由3个元素长数组组成的2个元素长数组。@Jin