我想比较矩阵乘法中Matlab的速度与Intel(R)Core(TM)i7-4770 CPU @ 3.40GHz上的Eigen 3的速度.代码包括Eigen:
#include <iostream>
#include "Eigen/Dense"
#include <chrono>
#include <omp.h>
using namespace std;
using namespace Eigen;
const int dim=100;
int main()
{
std::chrono::time_point<std::chrono::system_clock> start, end;
int n;
n = Eigen::nbThreads();
cout<<n<<"\n";
Matrix<double, Dynamic, Dynamic> m1(dim,dim);
Matrix<double, Dynamic, Dynamic> m2(dim,dim);
Matrix<double, Dynamic, Dynamic> m_res(dim,dim);
start = std::chrono::system_clock::now();
for (int i = 0 ; i <100000; ++i) {
m1.setRandom(dim,dim);
m2.setRandom(dim,dim);
m_res=m1*m2;
}
end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::cout << "elapsed time: …Run Code Online (Sandbox Code Playgroud) 我偶然发现了基准游戏(代码页)并比较了Fortran和C.我对Mandelbrot测试的计算时间差异感到非常惊讶(Fortran慢了4.3倍!)因为两种语言都有非常相似的功能集.此外,Fortran应该能够更加激进地进行优化(例如,"对于重度计算,Fortran是否比C更容易优化?").
可以解释Fortran中缺少哪些功能,以获得速度,例如在C示例中?(似乎这里的位操作正在提升代码.)
编辑:这不是一个关于哪种编程语言更好的问题(总是有许多方面发挥作用).在这个例子中,这是一个关于优化差异的基本问题.
附加由彼得·科德斯答案:有在一张纸上为Fortran应用程序矢量化基础也即将讨论SIMD在FORTRAN编程.对于英特尔编译器:Fortran中的显式向量编程
我正在使用gcc 4.5.0版.使用下面的简单示例,我将假设从double*到const double*的转换无效
#include <iostream>
using namespace std;
void foo(const double *a)
{
cout<<a[0]*2.<<endl;
}
int main()
{
double *a=new double[2];
a[0]=1.;
a[1]=2.;
foo(a);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
为什么编译没有错误?
一个反例是以下类似的:
#include<iostream>
using namespace std;
void foo(const double **a)
{
cout<<a[0][0]*2.<<endl;
}
int main()
{
double **a=new double*[2];
a[0]=new double[2];
a[1]=new double[2];
a[0][0]=1.;
foo(a);
cout<<a[0][0]<<endl;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
(第二个例子的解决方案:将foo定义为foo(const double*const*a).感谢Jack Edmonds评论,这解释了错误消息)
我想创建一个函数模板,其中类T仅限于特殊基类T_base的派生类.实现这一目标的有效方法是什么?谢谢你的帮助!
我正在emacs中使用组织文件进行文档编制。是否可以为组织文件中的文件夹定义别名?动机:说我有几个文件链接,它们属于同一文件夹。如果我移动文件,则必须更改所有这些链接。仅更改一个文件夹别名会更容易。这可能吗?
我有一个紧急的问题,因为我的时间已经不多了:我让我的计算过程在一个8核的服务器上,因此我在我的c ++代码中使用openMP,它工作正常.当然我不是唯一一个使用服务器的人,所以我的容量并不总是800%的CPU.
但现在好几次,有人在机器上启动他的python prog使我和他的编程完全陷入困境:虽然我仍在使用大约500%的CPU,但代码运行的时间大约是.100倍慢 - 对我和另一个人来说.你知道原因是什么,如何防止它?
我需要一个不同功能的开关来规避频繁的if方向.它应该类似于以下代码,封装在一个类中:
#include<iostream>
#include<stdlib.h>
using namespace std;
template<class T>
class MaxSwitch
{
public:
typedef T (MaxSwitch::*Max_P)(T,T);
Max_P fooC_P;
MaxSwitch(int Q) {
if (Q==0)fooC_P=&MaxSwitch::MaxVal1;
else fooC_P=&MaxSwitch::MaxVal2;
}
inline T MaxVal1(T kx,T MAX)
{
return kx+1;
}
inline T MaxVal2(T kx,T MAX)
{
return MAX;
}
};
int main( int argc, char ** argv )
{
int Q=atoi ( argv[1] );
MaxSwitch<int> MAXSW(Q);
int MAX=5;
for ( int kx=0;kx<MAX;kx++ ) for ( int ky=0;ky<(MAXSW.fooC_P)(kx,MAX);ky++ )
{
cout<<"(kx="<<kx<<", ky="<<ky<<endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我现在有一个小问题,函数调用(MAXSW.fooC_P)(ky,MAX)是错误的.怎么做得好?