今天在看CPU cache时候,根据上面的例子做了个练习,发现了一个怪事情,没想明白
例子如下,在powerpc下面跑,多个power7的CPU:
例子一test:
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
int main()
{
int steps = 256 * 1024 * 1024;
int a[] = {0,0};
int i ;
struct timeval start ;
struct timeval end ;
unsigned long diff ;
gettimeofday(&start, NULL);
for (i=0; i<steps; i++) { a[0]++; a[0]++; } -----此处为两个a[0]
gettimeofday(&end, NULL);
diff = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
printf("diff----%ld\n",diff);
}
例子2 test2:
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
int main()
{
int steps = 256 * 1024 * 1024;
int a[] = {0,0};
int i ;
struct timeval start ;
struct timeval end ;
unsigned long diff ;
gettimeofday(&start, NULL);
for (i=0; i<steps; i++) { a[0]++; a[1]++; } ----此处为一个a[0],一个a[1]
gettimeofday(&end, NULL);
diff = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;
printf("diff2----%ld\n",diff);
}
执行./test;./test2
结果如下:
diff----3826802
diff2----1976746
现代处理器中对不同部分指令拥有一点并发性。这使得CPU在同一时刻访问L1两处内存位置,或者执行两次简单算术操作。在第一个循环中,处理器无法发掘这种指令级别的并发性,但第二个循环中就可以。所以test2比test快近一倍。
但将test和test2合并在一起
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#define mb() __asm__ __volatile__ ("sync" : : : "memory") ----此是因为怀疑cpu乱序这类造成引入
int main()
{
int steps = 256 * 1024 * 1024;
int a[] = {0,0};
int i ;
struct timeval start ;
struct timeval end ;
unsigned long diff ;
gettimeofday(&start, NULL);
for (i=0; i<steps; i++) { a[0]++; a[0]++; }
gettimeofday(&end, NULL);
diff = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
printf("diff----%ld\n",diff);
mb(); ------加和不加,对输出的数字有较大影响
gettimeofday(&start, NULL);
for (i=0; i<steps; i++) { a[0]++; a[0]++; } -----先用a[0],后面用a[1]作不同实验
gettimeofday(&end, NULL);
diff = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
printf("diff2----%ld\n",diff);
}
加mb()
diff----3919898
diff2----6281302
去掉mb()
diff----4068821
diff2----3803478
疑问:为什么加mb()之后,执行时间要多花这么多
改为a[1],加mb()
diff----3815021
diff2----3473165
不加mb()
diff----3815935
diff2----3463169
考虑到误差,这两者基本一样
疑问:为什么分开两个程序,和一个程序内执行时间差别这么大。
有空看看两者产生的汇编语言,看看有什么不同之处。
并行编程真是个神奇的怪物,还有待深入。
这两天稍微有点空,看了一下汇编,在上面的mb()之前产生的汇编和mb()之后产生的汇编不一样,估计就是传说中的乱序优化,在第一个gettimeofday(&start,NULL)之前加上mb(),其结果就比较正常了,a[0]++,a[0]++比a[0]++,a[1]++慢将近一倍
diff----6159865
diff2----3427905
但不加mb(),a[1]++这个速度相比下不明显,不知何故?
直接用 gcc -O2 -o test test.c,之后执行便变成了
diff----0
diff2----0
相关推荐
SMP计算机通过在一个共享内存架构下并行运行多个处理器,提供了强大的计算能力和高度的并发处理能力。下面将详细介绍SMP计算机的基础知识、结构特点以及其在实际应用中的体现。 ### SMP计算机的特征 SMP计算机的...
1. **题目**:使用40MHz主频的标量处理器执行一个典型测试程序,计算执行该程序的有效CPI、MIPS速率及总的CPU执行时间。 - **解答**: - **有效CPI**:\(1.55\) - **MIPS**:\(25.8\) - **CPU执行时间**:\(0....
分布式内存环境下的编程工具包括MPI(Message Passing Interface),它允许不同节点的进程通过消息传递进行通信,而Java Thread和Posix Thread则主要用于单个系统内的线程管理,OpenMP则是在共享内存多核系统上的...
并行计算机体系结构是计算机科学中的一个重要领域,它旨在通过多处理器或多核心并行处理来提升计算性能...理解这些知识对于设计、优化和使用并行计算系统至关重要,特别是在当前大数据和人工智能等高计算需求的背景下。
4. **共享内存多处理器**(SMP):多个处理器共享同一片内存,通过总线通信,适合多任务并行处理。 理解这些概念需要结合实际的硬件结构,如控制器、数据通路、存储元件等,以及它们之间的交互,才能深入理解计算机...
在节点内部,它采用SMP(对称多处理器)架构,由于每个节点仅包含两个处理器,因此避免了传统的SMP结构中的总线瓶颈问题。而在节点之间,Origin系统则实现了大规模并行处理,同时解决了共享存储器的访问问题。 访问...
在硬件层面,这包括处理器的唯一标识、同步互斥机制、Cache一致性维护、CPU间中断机制等。Nios II处理器中的ctl5寄存器可以用来识别每个CPU的唯一编号。对于处理器间的同步和互斥,Nios II采用的是顺序存储模型,...
- **SMP(对称式多处理器)**:允许多个CPU共享资源并行工作,有效提升系统性能。 - **CPU的倍频与外频**:倍频是CPU主频与系统总线频率的比例,外频则是系统总线的工作频率。主频等于外频乘以倍频。 - **扩展指令集...
SMP架构是早期并行计算的一种形式,其中多个CPU共享同一内存子系统。这种设计使得所有处理器可以平等访问系统资源,支持OpenMP、pthreads等共享内存并行编程模型。然而,SMP的扩展性有限,因为随着处理器数量增加,...
总线共享Cache结构允许CPU核心通过共享的二级或三级Cache进行通信,而基于片上互连的结构则通过交叉开关或片上网络实现核心间的独立和交互。这种复杂性为程序开发者带来了挑战,需要编写能够有效利用多核资源的并行...
作业三是对MPI并行程序设计的一个综合测试。 #### 十二、MPI并行程序设计的高性能要求 最后,本书还会讨论如何优化MPI程序,提高并行程序的性能。 --- 综上所述,《MPI程序设计》这本书涵盖了从并行计算环境的...
Linux内存屏障(Memory Barrier)是一种用于控制指令执行顺序的机制,它在多处理器(SMP)环境下尤为重要。在理解内存屏障之前,我们首先需要了解CPU缓存以及缓存一致性协议是如何工作的,因为这些都是理解内存屏障...
在总线设计方面,BIU(总线接口单元)的效率决定了Cache未命中事件对CPU执行效率的影响。总线设计需要确保多个CPU核心能够高效地同时访问内存和私有Cache。 综上所述,多核处理器的关键技术研究和应用是促进现代...
- **多核SMP(对称多处理)体系结构**:这种体系结构下,所有的核心都是平等的,并且可以访问共享内存。这对于实现高效的并行计算非常重要。 - **多核芯片设计**:现代多核芯片通常包含多个处理核心、一级缓存(L1 ...
- 结构: 多台SMP或DSM并行机(超节点)通过专用高性能互连网连接,超节点内部共享内存,超节点之间分布或共享内存。 - 示例: HP/Convex SPP-2000 (4台16-way HP SMP3超节点, 共64个处理机), ASCI Blue Mountain (48...
在SMP架构下,每个处理器都可以访问全部内存,这简化了程序设计,因为程序员不必关心数据在哪个处理器的本地内存中。然而,随着处理器数量的增加,内存访问冲突和Cache一致性问题变得更为显著。 **多Cache一致性**...
- 指令流水线技术提高了CPU执行指令的效率,通过将指令执行过程分为取指、解码、执行和写回等多个阶段,使得各阶段可以并行进行。 - 向量处理是指对数组或向量数据进行并行操作的技术,适用于大规模数值计算和科学...
而SMP(对称多处理结构)则是一种在一个计算机上汇集一组处理器(多CPU),通过共享内存子系统和总线结构实现处理器之间的协同工作。DSM(分布共享存储)的概念,它指的是内存模块虽然物理上局部于各个处理器内部,...
7. **并行计算**:随着多核处理器的发展,课件可能还会介绍并行计算的概念,包括对称多处理(SMP)、分布式内存并行计算(如NUMA)和多线程技术。 8. **虚拟化技术**:虚拟化是现代计算的重要组成部分,课件可能...