其中计时功能,time
,clock
getrusage
,clock_gettime
,gettimeofday
和timespec_get
,我想清楚地了解它们是如何实现的,为了知道在什么情况下我必须使用他们什么是他们的返回值.
首先,我们需要对返回wall-clock值的函数进行分类,与返回进程或线程值的函数进行比较.gettimeofday
返回wall-clock值,clock_gettime
返回wall-clock值或进程或线程值,具体取决于Clock
传递给它的参数.getrusage
并clock
返回过程值.
然后第二个问题涉及这些功能的实施,因此,它们的准确性.这些功能使用哪种硬件或软件机制.
似乎getrusage
只使用内核tick(通常为1ms长),因此不能比ms更准确.这样对吗?然后该getimeofday
函数似乎使用最准确的底层硬件.因此,它的准确性通常是近期硬件上的微秒(因为API而不能更多).那么clock
,手册页谈的是"近似",它是什么意思?那么clock_gettime
,API是纳秒级,是否意味着如果底层硬件允许它,它能够如此准确?单调性怎么样?
还有其他功能吗?
我正在完成一项任务(另一个问题的细节).作为其中的一部分,我增加了数组的大小.并发现当我尝试初始化数组时:
int arr[2097152]; // 8MB
Run Code Online (Sandbox Code Playgroud)
我有分段错误...我认为它是因为我试图声明一个太大的数组?然后我找到了解决这个问题的方法就是使用malloc
.但是对C来说是新手(主要使用JavaScript/Python/Java ......).我对指针和东西很困惑......
我已经声明了一个8MB的数组:
int *arr = malloc (MBs * 1024 * 1024 / sizeof(int)); // MBs = 8
Run Code Online (Sandbox Code Playgroud)
但是现在......我如何访问它或写入它?当我使用它arr
时,我得到的地址,如果我使用*arr
我得到第一个元素?
我有一个任务,我需要测量访问L1,L2和L3缓存中的数据的延迟,以及主内存.这将在C中完成.
我花了几个小时研究测量缓存延迟的方法,并且调整得很少.我已经下载了一些基准测试工具,这些工具给了我缓存访问时间,但在我自己的代码中实现它时,我还没有得到任何结论.我知道缓存中发生的事情在C中不符合我的要求.
我的下一个想法是,如果我可以强制使用来自x86程序集的东西填充缓存(首先想到)然后只对我刚刚加载的数据做一个clock(),access(),clock(),据说时间就是准确的(是)访问时间,因为我知道它应该在缓存中找到,因为我只是用我的内联asm或类似的方法把它放在那里...
如果有人能够在这里为我的任务提供见解,那将是非常棒的.是否告诉我,我因为想要使用asm在缓存中加载某些东西而疯狂,或者向我介绍可能对我有帮助的其他东西.
非常感谢!
处理我的任务,在另一个问题中处理更多细节.如果我使用
arr[(i * 16) % arrLen] *= 2; // seg fault
Run Code Online (Sandbox Code Playgroud)
VS
arr[i % arrLen] *= 2; // OK!
Run Code Online (Sandbox Code Playgroud)
为什么?完整来源见第31行.为什么?我模数组的长度,所以应该没问题?