Tag: cpu

使用线程发现CPU核心数

我有一个任务,我必须在Linux上编写一个C程序(我使用CentOS),它使用线程/进程来确定CPU的内核数量。 首先,我尝试以毫微微/微秒的速度打印当前时间,因为我知道可以运行1thread / core(或者使用HT)。 但是通过毫秒,超过10个线程打印相同的时间和微秒没有一个是相同的。 其次我尝试用时钟测量线程的执行时间,假设我有4个内核,同时4个线程的执行时间应该几乎和执行1一样长。但是我的程序都不能让我更接近数字CPU的。 你能帮我一些建议吗? 程序打印当前时间: pthread_t th[N]; void* afis () { //time_t now; //time(&now); //printf(“%s”, ctime(&now)); struct timeval start, end; long mtime, seconds, useconds; gettimeofday(&start, NULL); // usleep(2000); gettimeofday(&end, NULL); seconds = end.tv_sec – start.tv_sec; useconds = end.tv_usec – start.tv_usec; mtime = seconds + useconds; printf(“Thread with TID:%d Elapsed time: %ld microsecons\n”,(unsigned […]

什么是“目标平台上最大可能对象的大小”,以size_t表示

我正在阅读C / C ++中有关size_t文章http://web.archive.org/web/20081006073410/http://www.embedded.com/columns/programmingpointers/200900195 (通过Stackoverflow找到的链接)。 从文章引用: 类型size_t是一个typedef,它是某些无符号整数类型的别名,通常是unsigned int或unsigned long,但可能甚至是unsigned long long。 每个标准C实现都应该选择足够大的无符号整数 – 但不要大于所需的 – 来表示目标平台上最大可能对象的大小。 如何确定机器上最大可能对象的大小? 什么影响最大对象的大小(除了处理器)? 欢迎详细解释链接。

是否需要“双”型的8字节对齐?

我理解字对齐,这使得cpu只需要在将整数读入寄存器时读取一次。 但是需要“双”的8字节对齐 (让我们假设32位系统)? 有什么好处? 如果用于存储“double”的空间只是4字节对齐,会发生什么?

测量CPU频率缩放效果

最近我试图测量cpu缩放的效果。 如果我使用这个时钟测量它,它是否准确? template struct rdtsc_clock { typedef unsigned long long rep; typedef std::ratio period; typedef std::chrono::duration duration; typedef std::chrono::time_point time_point; static const bool is_steady = true; static time_point now() noexcept { unsigned lo, hi; asm volatile(“rdtsc” : “=a” (lo), “=d” (hi)); return time_point(duration(static_cast(hi) << 32 | lo)); } }; 更新 : 根据我的另一篇文章的评论,我相信redtsc不能用于测量cpu频率缩放的效果,因为来自redtsc的计数器不受CPU频率的影响,我是对的吗?

如何在Windows / Linux C上检查CPU名称,型号,速度?

我想获得一些关于硬件的C信息: 我有多少CPU 每个核心有多少个核心 每个CPU中每个核心有多少个逻辑核心 CPU名称+型号 CPU速度+频率 CPU架构(x86,x64) 我知道在类似Linux的操作系统上我可以解析/proc/cpuinfo但由于它不是普通文件,我认为它不安全。 在SO上看到这个答案,但它并没有给我我需要的每一个信息。 我应该调用cat /proc/cpuinfo > file.txt然后解析file.txt吗? 我知道cpuid.h (我正在使用GCC)但是找不到关于这个标题的任何文档(无论如何 – 使用它是个好主意吗?)

在可加载的Linux内核模块上设置cpu affinity

我需要创建一个内核模块,在计算机的每个核心上启用ARM PMU计数器。 我在设置cpu亲和性时遇到问题。 我试过sched_get_affinity ,但显然,它只适用于用户空间进程。 我的代码如下。 有任何想法吗? #define _GNU_SOURCE #include /* Needed by all modules */ #include /* Needed for KERN_INFO */ int init_module(void){ unsigned reg; /* enable user-mode access to the performance counters*/ asm volatile(“MRC p15, 0, %0, C9, C14, 0\n\t” : “=r”(reg)); reg |= 1; asm volatile(“MCR p15, 0, %0, C9, C14, 0\n\t” […]

测量进程消耗的CPU时钟

我在C编写了一个程序。它是一个由研究创建的程序。 我想计算程序消耗的精确CPU周期。 确切的周期数。 知道我怎么能找到它?

如何使用在同一CPU上运行的调试器读取CPU寄存器?

当我学习汇编时,我使用GDB的方式如下: gdb ./a.out (a is a compiled C script that only prints hello world) break main run info registers 当我自己使用相同的CPU打印寄存器时,为什么还能看到程序使用的寄存器? 不应该使用GDB(或操作系统)覆盖寄存器,只显示覆盖的寄存器? 我能想到的唯一答案是我的CPU是双核的,其中一个核正在使用,另一个是为程序保留的。

如何测量cpu时间和挂钟时间?

我看到很多关于此的主题,即使在stackoverflow上,例如: 如何在Linux / Windows上测量CPU时间和挂钟时间? 我想测量cpu和wall时间。 虽然在我发布的主题中回答了问题的人建议使用gettimeofday来测量墙上时间,但我认为最好使用clock_gettime 。 所以,我写了下面的代码(它没关系,是否真的测量了一个时间,而不是cpu时间?我问,因为我找到了一个网页: http : //nadeausoftware.com/articles/2012/03/c_c_tip_how_measure_cpu_time_benchmarking#clockgettme其中说clock_gettime测量cpu时间…)是什么,我应该用哪个来测量墙上时间? 另一个问题是关于cpu时间。 我找到了clock非常好的答案,所以我也为它写了一个示例代码。 但它不是我真正想要的,因为我的代码它显示了0秒的CPU时间。 是否可以更准确地测量cpu时间(以秒为单位)? 感谢您的帮助(目前,我只对Linux解决方案感兴趣)。 inheritance我的代码: #include #include /* printf */ #include /* sqrt */ #include int main() { int i; double sum; // measure elapsed wall time struct timespec now, tmstart; clock_gettime(CLOCK_REALTIME, &tmstart); for(i=0; i<1024; i++){ sum += log((double)i); } clock_gettime(CLOCK_REALTIME, &now); double […]

FLOPS英特尔核心并使用C(内部产品)进行测试

关于测量触发器,我有一些误解,在英特尔架构上,FLOP是一个加法和一个乘法吗? 我在网上的某处读过这篇文章,没有任何辩论可以拒绝这一点。 我知道FLOP在不同类型的cpu上有不同的含义。 如何计算理论峰值FLOPS? 我正在使用英特尔(R)Core(TM)2 Duo CPU E7400 @ 2.80GHz。 GHz和FLOPS之间究竟有什么关系? (甚至维基百科在FLOPS上的条目也没有具体说明如何做到这一点) 我将使用以下方法来测量我的计算机的实际性能(就翻牌而言):两个向量的内积:对于两个大小为N的向量,是翻牌数2n(n -1)(如果一个加法)或者一次乘法被认为是1次翻牌)。 如果没有,我该如何计算呢? 我知道有更好的方法可以这样做,但我想知道我提出的计算是否正确。 我在某处读到LINPACK作为基准,但我仍然想知道它是如何完成的。