Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;时钟保持零位_C++_Time.h - Fatal编程技术网

C++ C++;时钟保持零位

C++ C++;时钟保持零位,c++,time.h,C++,Time.h,我正在尝试获取我的程序的运行时间。实际上,我想我应该使用time.h中的yclock()。但是它在程序的所有阶段都保持为零,尽管我添加了10^5个数字(肯定会消耗一些CPU时间)。我已经搜索了这个问题,似乎运行Linux的人只有这个问题。我正在运行Ubuntu12.04LTS 我将比较AVX和SSE指令,因此使用time\t实际上不是一个选项。有什么提示吗 代码如下: //数组的维度 无符号整数N=100000; //用随机数填充两个数组 无符号整数a[N]; 程序的时钟启动=时钟(); 对于(

我正在尝试获取我的程序的运行时间。实际上,我想我应该使用
time.h
中的
yclock()。但是它在程序的所有阶段都保持为零,尽管我添加了10^5个数字(肯定会消耗一些CPU时间)。我已经搜索了这个问题,似乎运行Linux的人只有这个问题。我正在运行Ubuntu12.04LTS

我将比较AVX和SSE指令,因此使用
time\t
实际上不是一个选项。有什么提示吗

代码如下:

//数组的维度
无符号整数N=100000;
//用随机数填充两个数组
无符号整数a[N];
程序的时钟启动=时钟();

对于(int i=0;i
clock
确实返回使用的CPU时间,但粒度为10Hz。因此,如果您的代码不超过100ms,您将得到零。除非它明显超过100ms,否则您将无法得到非常准确的值,因为它会使您的误差保持在100ms左右

因此,增加N或使用不同的方法来测量时间将是您的选择。
std::chrono
很可能会产生更精确的计时(但它将测量“墙时间”,而不是CPU时间)


首先,编译器很可能会优化您的代码。请检查编译器的优化选项

由于后续代码不使用包含
out[],a[],b[]
的数组,并且不会输出
out[],a[],b[]
中的值,因此编译器将按如下方式优化代码块,就像根本不执行一样:

for(int i=0;i<=N;i++){
    a[i] = i;
}

for(int i=0;i<=N;i++){
    b[i] = i;
}

for(int i = 0; i < N; ++i)
    out[i] = a[i] + b[i];

将此添加到代码末尾

int sum = 0;
for(int i = 0; i<N; i++)
    sum += out[i];
cout << sum;
int和=0;

对于(int i=0;i获取时间的最简单方法是只使用OpenMP的存根函数。这将在MSVC、GCC和ICC上工作。使用MSVC,您甚至不需要启用OpenMP。使用ICC,如果您喜欢,您可以只链接存根
-OpenMP存根
。使用GCC,您可以
-fopenmp

#include <omp.h>

double dtime;
dtime = omp_get_wtime();
foo();
dtime = omp_get_wtime() - dtime;
printf("time %f\n", dtime);
#包括
双数据时间;
dtime=omp_get_wtime();
foo();
dtime=omp_get_wtime()-dtime;
printf(“时间%f\n”,dtime);

“我正在计算进程运行的时间”…你是说经过的时间吗?
clock()
返回进程使用的CPU时间量。是的。我不是一个天生的演说家。总之,有什么建议可以解决我的问题吗?如果你在
N
上再加两个
0
怎么办?如果你可以访问C++11(任何最新的编译器),尝试使用
std::chrono
而不是C时间函数。@toebs,如果要比较AVX和SSE代码,则可能需要使用32字节对齐的内存以及更大的数组大小。在这种情况下,在堆栈上分配数组将不起作用。我将使用
\u mm\u malloc(sizeof(int)*N,32)
。这个库已经是gcc4.6的一个功能了吗?我的编译器抛出了一个错误,chrono仍处于测试阶段。它是C++11的一个功能,所以旧版本的gcc可能没有。有没有可能增加粒度?@toebs:一个适用于Linux的解决方案,现在发布,使用高分辨率
时钟\u gettime
。谢谢,这工作很好,并且给出了与openmp解决方案相同的结果!遗憾的是,这不是解决方案。我编译时没有进行任何优化,但即使我例如打印“out[]”,经过的时间仍然是0。遗憾的是,这不是解决方案。我编译时没有进行任何优化,但即使我例如打印“out[]”经过的时间仍然是0。我仍然很好奇为什么粒度是10Hz,无论你看哪里,都建议使用时钟来测量经过的时间:\N你是否增加了
N
,因为它太小了。
N=10^8
可以测试。你也可以在代码中做一些更复杂的事情,例如
int-tot=0;for(I=1:N)tot++;tot/=2;
。我不知道粒度:(似乎至少可以工作。当我使用ICC时,您能解释一下在Eclipse中在何处添加-openmp存根吗?我将其添加为链接器和编译器选项,但它抛出了一个错误,即函数未知。对于gcc,您可以像gcc一样在ICC中使用
-fopenmp
-openmp
。我没有使用过Eclipse(我使用QtCreator,或者只是一个文本编辑器和shell)。您使用什么来创建Makefile?下面是显示ICC选项的链接。
unsigned int N = 10000000;
int sum = 0;
for(int i = 0; i<N; i++)
    sum += out[i];
cout << sum;
#include <omp.h>

double dtime;
dtime = omp_get_wtime();
foo();
dtime = omp_get_wtime() - dtime;
printf("time %f\n", dtime);