Tag: cpu

该代码如何计算经过的CPU周期数?

从这个SO线程中获取 ,这段代码计算在//1和//2行之间运行代码所经过的CPU周期数。 $ cat cyc.c #include static __inline__ unsigned long long rdtsc(void) { unsigned long long int x; __asm__ volatile (“.byte 0x0f, 0x31” : “=A” (x)); return x; } int main() { unsigned long long cycles = rdtsc(); //1 cycles = rdtsc() – cycles; //2 printf(“Time is %d\n”, (unsigned)cycles); return 0; } $ gcc cyc.c […]

什么是更快(x <0)或(x == -1)?

变量x是int,可能的值为: -1, 0, 1, 2, 3 。 哪个表达式会更快(在CPU滴答中): 1. (x < 0) 2. (x == -1) 语言:C / C ++,但我想所有其他语言都是一样的。 PS我个人认为答案是(x < 0) 。 更广泛的大师:如果x从-1到2^30怎么办?

乱序执行和记忆围栏

我知道现代CPU可以无序执行,但是他们总是按顺序退出结果,如维基百科所述。 “Out of Oder处理器及时填写这些”插槽“和其他准备就绪的指令, 然后在结束时重新排序结果,使其看起来正常处理指令。 ” 现在,在使用多核平台时,据说需要内存栅栏,因为由于乱序执行,可以在此处打印错误的x值。 Processor #1: while f == 0 ; print x; // x might not be 42 here Processor #2: x = 42; // Memory fence required here f = 1 现在我的问题是,由于乱序处理器(我假设MultiCore处理器的情况下的核心)总是按顺序退出结果,那么内存栅栏的必要性是什么。 难道多核处理器的核心不会看到仅从其他核心退役的结果,或者它们是否也会看到正在进行中的结果? 我的意思是在我上面给出的例子中,当处理器2最终将结果退出时, x的结果应该在f之前,对吧? 我知道在乱序执行期间它可能在x之前修改了f但是它必须在x之前没有退出它,对吗? 现在有了按顺序退出结果和缓存一致性机制,为什么你需要在x86中使用内存栅栏?

为什么CPU在字边界上访问内存?

我听到很多数据应该在内存中正确对齐,以提高访问效率。 CPU访问内存在字边界上。 因此,在以下场景中,CPU必须进行2次内存访问才能获得单个字。 Supposing: 1 word = 4 bytes (“|” stands for word boundary. “o” stands for byte boundary) |—-o—-o—-o—-|—-o—-o—-o—-| (The word boundary in CPU’s eye) —-o—-o—-o—- (What I want to read from memory) 为什么会这样? 什么是CPU的根本原因只能读取字边界? 如果CPU只能访问4字节字边界,则地址线应仅需要30位,而不是32位宽。 因为CPU的眼中最后2位始终为0。 添加1 更重要的是,如果我们承认CPU必须读取字边界,为什么边界不能从我想要读取的地方开始? 似乎边界在CPU眼中是固定的。 添加2 根据AndreyT的说法 ,似乎边界设置是硬连线的,它是由内存访问硬件硬连线的。 就这一点而言,CPU是无辜的。 非常感谢…

C中有符号的单字节字符是什么 – ( – 128)?

我的小程序: #include int main() { signed char c = -128; c = -c; printf(“%d”, c); return 0; } 打印: -128 减号( – )运算符是否可以跨CPU运行?

优雅而安全的方法来确定架构是32位还是64位

正如标题所说,有没有任何优雅和安全的方法来确定架构是32位还是64位。 通过优雅,您可以想到精确,正确,简短,干净和智能的方式。 安全,从标准,C89 / C99和操作系统独立性的角度考虑安全。

如何在C中获得CPU使用率?

我想用C获取应用程序的总CPU使用率,就像我们在TaskManager中得到的总CPU使用量…我想知道…对于windows和linux ::当前所有进程的总CPU利用率.. ……正如我们在任务管理器中看到的那样。

使用RDTSC以C计算CPU频率始终返回0

我们的讲师给出了以下代码,因此我们可以测量一些算法性能: #include #include static unsigned cyc_hi = 0, cyc_lo = 0; static void access_counter(unsigned *hi, unsigned *lo) { asm(“rdtsc; movl %%edx,%0; movl %%eax,%1” : “=r” (*hi), “=r” (*lo) : /* No input */ : “%edx”, “%eax”); } void start_counter() { access_counter(&cyc_hi, &cyc_lo); } double get_counter() { unsigned ncyc_hi, ncyc_lo, hi, lo, borrow; double result; access_counter(&ncyc_hi, […]

运行给定线程的核心是什么?

是否有函数或任何其他方式以编程方式知道我的程序(pid)的给定线程正在运行的处理器的核心是什么? 如果可能的话,OpenMP或Pthreads解决方案都会对我有所帮助。 谢谢。

如何在运行时使用GCC和内联asm检测CPU体系结构类型?

我需要找到CPU的架构类型。 我没有访问/ proc / cpuinfo,因为机器正在运行syslinux。 我知道有一种方法可以使用内联ASM,但我相信我的语法不正确,因为我的变量iedx没有正确设置。 我和ASM一起苦苦挣扎,绝不是专家。 如果有人有任何提示或可以指出我正确的方向,我会非常感激。 static int is64Bit(void) { int iedx = 0; asm(“mov %eax, 0x80000001”); asm(“cpuid”); asm(“mov %0, %%eax” : : “a” (iedx)); if ((iedx) && (1 << 29)) { return 1; } return 0; }