我对MIPS汇编语言很陌生,目前正在上一个关于MIPS编码的计算机体系结构课程.我以前学过其他几种高级编程语言(C,C#,Python),因此在编程方面有一些基础.
我的问题在这里特别问:MIPS如何为堆栈中的数组分配内存?我希望回答这个问题有望让我更好地理解MIPS,因为我仍然在概念化MIPS语言及其架构的概念.我不太明白指针在这方面是如何工作的......
如果有人可以花时间帮助这个迷茫的学生,那将是辉煌的!:)
我基本上需要一些帮助来解释/确认一些实验结果.
基础理论
关于DVFS的论文中表达的一个常见想法是执行时间具有片上和片外组件.执行时间的片上组件与CPU频率成线性关系,而片外组件保持不受影响.
因此,对于CPU绑定应用程序,CPU频率和指令退出率之间存在线性关系.另一方面,对于经常错过高速缓存并且必须频繁访问DRAM的内存绑定应用程序,关系应该是仿射的(一个不仅是另一个的倍数,还必须添加常量).
实验
我正在做实验,看看CPU频率如何在不同的内存限制水平下影响指令退出率和执行时间.
我在C中编写了一个遍历链表的测试应用程序.我有效地创建了一个链表,其各个节点的大小等于缓存行的大小(64字节).我分配了大量内存,这是缓存行大小的倍数.
链表是循环的,使得最后一个元素链接到第一个元素.此外,该链表随机遍历分配的内存中的高速缓存行大小的块.访问分配的内存中的每个缓存行大小的块,并且不会多次访问任何块.
由于随机遍历,我认为硬件不应该使用任何预取.基本上,通过遍历列表,您有一系列内存访问,没有步幅模式,没有时间局部性,也没有空间局部性.此外,因为这是一个链接列表,所以只有一个内存访问才能在前一个内存访问完成之前开始.因此,存储器访问不应该是可并行化的.
当分配的内存量足够小时,除了初始预热之外,您应该没有缓存未命中.在这种情况下,工作负载实际上受CPU限制,并且指令退出率与CPU频率非常干净地扩展.
当分配的内存量足够大(大于LLC)时,您应该错过缓存.工作负载受内存限制,指令退出率也不应随CPU频率而扩展.
基本的实验设置与此处描述的类似:" 实际CPU频率与Linux报告的CPU频率"cpufreq"子系统 ".
上述应用程序重复运行一段时间.在持续时间的开始和结束时,对硬件性能计数器进行采样,以确定在该持续时间内退出的指令数.也测量持续时间的长度.平均指令退休率是以这两个值之间的比率来衡量的.
使用Linux中的"用户空间"CPU频率调控器在所有可能的CPU频率设置中重复此实验.此外,如上所述,对CPU绑定的情况和存储器绑定的情况重复该实验.
结果
下面两个图分别显示了CPU绑定情况和内存绑定情况的结果.在x轴上,CPU时钟频率以GHz为单位指定.在y轴上,指令退出率以(1/ns)指定.
放置标记物以重复上述实验.该行显示如果指令退出率以与CPU频率相同的速率增加并通过最低频率标记,结果将是什么.
CPU绑定案例的结果.
内存限制案例的结果.
结果对CPU绑定的情况有意义,但对于内存限制的情况则没有那么多.内存限制的所有标记都低于预期的行,因为指令退出率不应该以与内存绑定应用程序的CPU频率相同的速率增加.标记似乎落在直线上,这也是预期的.
但是,随着CPU频率的变化,指令退出率似乎会发生阶跃变化.
题
是什么导致指令退休率的步骤变化?我能想到的唯一解释是内存控制器以某种方式通过内存请求速率的变化来改变内存的速度和功耗.(随着指令退出率的增加,内存请求的速率也应该增加.)这是正确的解释吗?
memory performance ram computer-architecture power-management
我目前正在查看CPU管道的各个部分,它们可以检测分支错误预测.我发现这些是:
我知道2和3检测到了什么,但我不明白在BTB中检测到了什么错误预测.BAC检测BTB错误地预测非分支指令的分支的位置,其中BTB未能检测到分支,或者BTB错误预测了x86 RET指令的目标地址.执行单元评估分支并确定它是否正确.
在分支目标缓冲区中检测到什么类型的错误预测?究竟在这里发现了什么错误预测?
我能找到的唯一线索是英特尔开发者手册第3卷(底部的两个BPU CLEAR事件计数器):

BPU在错误地认为未采取分支后预测了一个分支.
这似乎暗示预测并非"同步",而是"异步",因此"在错误地假设"之后?
更新:
Ross,这是CPU分支电路,来自最初的英特尔专利(如何用于"阅读"?):

我在任何地方都看不到"分支预测单位"?读过这篇论文的人会认为"BPU"是将BTB电路,BTB缓存,BAC和RSB分组在一起的懒惰方式吗?
所以我的问题仍然存在,哪个组件会引发BPU CLEAR信号?
optimization intel cpu-architecture computer-architecture branch-prediction
今天我在计算机组织课上,老师谈到了一些有趣的事情.谈到为什么缓存有效时,他说:
for (i=0; i<M; i++)
for(j=0; j<N; j++)
X[i][j] = X[i][j] + K; //X is double(8 bytes)
Run Code Online (Sandbox Code Playgroud)
用第二行改变第一行是不好的.你对此有何看法?为什么会这样?
寄存器是计算机中最快的记忆.因此,如果我们想要建立一个只有寄存器而不是缓存的计算机,是否可能?我想甚至用寄存器替换磁盘,尽管它们是自然易失性的存储器.我们是否有一些非易失性寄存器用于此用途?它会变得如此之快!我只是想知道这是否可能发生?
我有点卡住,因为我找不到任何覆盖缓存的"数据"部分的东西,我用Google搜索的所有内容都通过缓存的寻址达到了99.9%.我被问到的问题就是这样的
Contrast the difference between "data bit" capacity and "overhead bit" size for the two caches.
我不想要答案,所以我不会发布实际的设置大小,什么不是,我只是寻找一个方向可能是一个网站或解释如何"对比"这两个.任何可能的帮助都非常感谢!
SIMD和矢量处理器有什么区别?我目前的理解是矢量处理是SIMD的一个子集.但我被告知"SIMD不仅限于矢量",我不知道究竟是什么意思.有具体的例子吗?
另外,为什么标量体系结构优先于矢量体系结构?是因为它们更易于实施和编程吗?
我知道我们有SISD(常规1核CPU),SIMD(单核/多核处理器上的SSE扩展),MIMD(错误...大概类似MPI,我猜,所以集群!)和MISD(已被视为不切实际的/不可行).除此之外,我读过的其他一些东西是矢量处理和超标量体系结构.我错过并应该了解的任何新架构?谢谢!
在Computer Systems:A Programmer's Perspective一书中,练习5.5显示了一段代码来计算多项式的值
double poly(double a[], double x, int degree)
{
long int i;
double result = a[0];
double xpwr = x;
for (i = 1; i <= degree; i++) {
result += a[i] * xpwr;
xpwr = x * xpwr;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
练习假设双精度浮点加法和乘法所需的时钟周期分别为3和5.要求读者解释为什么测量的CPE(每元素周期数)值为5.
按照习题答案,在每次迭代中,我们需要更新变量xpwr和result我们需要的,操作是一个浮点加法(对于result)和浮点乘法(对于xpwr),因此后者占主导地位的延迟,导致最终CPE为5.
但我认为数据流应该是这样的:
xpwr result
| |
+-----+ +--[load] |
| | | |
[mul] [mul] |
| | |
| +---+ +-----+ …Run Code Online (Sandbox Code Playgroud) 我想写一个程序来获取我的缓存大小(L1,L2,L3).我知道它的一般想法.
所以我写了一个小程序.这是我的代码:
#include <cstdio>
#include <time.h>
#include <sys/mman.h>
const int KB = 1024;
const int MB = 1024 * KB;
const int data_size = 32 * MB;
const int repeats = 64 * MB;
const int steps = 8 * MB;
const int times = 8;
long long clock_time() {
struct timespec tp;
clock_gettime(CLOCK_REALTIME, &tp);
return (long long)(tp.tv_nsec + (long long)tp.tv_sec * 1000000000ll);
}
int main() {
// allocate memory and lock
void* map = mmap(NULL, (size_t)data_size, PROT_READ …Run Code Online (Sandbox Code Playgroud) 背景:
我正在为OS X构建一个应用程序,部署目标为10.6.我没有完全将我的应用程序转换为ARC,但是我添加了一些可以从ARC中受益的新类,所以我-fobj-arc为这些类设置了编译器标志.
通用32/64位英特尔架构的编译失败,使用旧版运行时的平台不支持错误-fobj-arc.
仅64位构建成功.
我不熟悉低级架构.我的问题是:仅为64位Intel构建的影响是什么?这会阻止应用程序完全在10.6上运行吗?或者只有一些机器运行10.6?
compilation cpu-architecture computer-architecture objective-c-runtime automatic-ref-counting
c ×2
memory ×2
optimization ×2
performance ×2
assembly ×1
c++ ×1
caching ×1
compilation ×1
cpu ×1
cpu-cache ×1
cpu-cycles ×1
intel ×1
malloc ×1
mips ×1
ram ×1
simd ×1