intel相关内容
假设我想在不使用 POP 的情况下查看堆栈顶部的两个元素. 我如何访问它 - 我正在尝试: mov ebp, espmov eax, [ebp]mov ebx, [ebp-4] 解决方案 PUSH 预递减栈指针,POP 后递增.因此,要查看前两个 DWORD: mov eax, [esp] ;栈顶mov ebx, [esp+4] ;堆栈中的第二个元素
..
我有一个问题,我需要了解是否有更好的解决方案.我编写了以下代码来将一些变量从写入器线程传递到读取器线程.这些线程固定到共享相同 L2 缓存的不同 CPU(禁用超线程). writer_thread.h struct a_few_vars {uint32_t x1;uint32_t x2;uint64_t x3;uint64_t x4;} __attribute__((aligned(64)
..
我看到了有关如何使用 FMA 指令集的问题,但在我开始使用它们之前,我首先想知道我是否可以(我的处理器是否支持它们).我发现一个帖子说我需要查看(在 Linux 上工作)的输出: more/proc/cpuinfo 来了解一下.我明白了: 处理器:0vendor_id : 正版英特尔CPU系列:6型号 : 30型号名称 : Intel(R) Xeon(R) CPU X3470 @ 2.93G
..
我在 x86-64 汇编中开发了一个程序,它需要通过相同的操作多次迭代: IMUL rdx, 3 # rdx 总是不同的 但是,我需要让运行时间更快,所以我想到了对上面那一行的优化: MOV rcx, rdxSHL rdx, 1添加 rdx, rcx 现在我问你们:这个修改会改善程序的运行时间(更少的时钟),还是我应该坚持使用 IMUL 命令? 解决方案 与 lea rdx, [r
..
尽管词的常见定义(如维基百科所述)是: 用于指定内存中位置的最大可能地址大小通常是硬件字(此处,“硬件字"是指处理器的全尺寸自然字,与使用的任何其他定义相反). x86 系统,根据 一些来源,注意它被视为 16 位: 在 x86 PC(Intel、AMD 等)中,虽然架构早已支持 32 位和 64 位寄存器,它的原生字长又回来了到它的 16 位起源,以及一个“单"字是 16 位.
..
以下注释在英特尔处理器数据表中是什么意思?如何在Linux的驱动程序代码中进行检查? 如果是CPUID.06H:EAX.[7]= 1 我在寄存器描述表的注释列中看到了SW开发人员手册(针对Intel处理器)中的此类声明. 参考: https://software.intel.com/sites/default/files/managed/22/0d/335592-sdm-vol-
..
我知道这个问题已经被问过很多次了,但是我正在寻找一个简单的解释. 假设我有C ++编译器生成的一些汇编代码. 现在,汇编程序开始工作,它必须将汇编代码转换为机器代码. 问题1). C ++汇编程序编译器会查看每个汇编指令具有相应机器代码指令的表吗? 问题2).如果C ++程序在intel处理器上运行,则汇编器需要查看Intel团队发布的表格,对吗?因为最后,C ++程序在英
..
在理解我遇到的两条指令时,我遇到了一些问题. 第一个如下: imul eax,DWORD PTR [esi + ebx * 4-0x4] 此指令是否意味着=>将您在括号之间计算的地址处的值乘以eax并将其存储在同一寄存器(eax)中?如果是这样,我们是否像这样计算括号之间的地址? ebx * 4 esi +操作1的结果 从结果中减去4 转到地址(结果)并获取其中的值.
..
有一个Intel DRNG库,可让您基于处理器的晶体熵效应使用随机数生成器. 库本身及其使用说明: https://software.intel.com/zh-cn/articles/intel-digital-random-number-generator-drng-library-implementation-and-uses 库中有一个示例,它仅打印随机生成的数组的内容.
..
当在x86-64代码中使用时,我试图了解代码段描述符中 D标志的工作原理.如下图所示,在代码段描述符的 D/B 位22中进行了设置: 3.4.5段描述符)表示以下内容: 解决方案 如果为代码段描述符设置了 L (长模式),则必须清除 D .L = 1/D = 1组合当前是无意义的/保留的.英特尔会在您正在查看的同一文档中对此进行记录. 如果清除了 L ,则 D 会在16位和32
..
是否有人在尝试使用当我测试AEP内存时,我发现重复刷新一条缓存行比刷新不同的缓存行具有更高的延迟.我想知道造成这种现象的原因.是英特尔论坛上的损耗平衡机制吗?这表明重复写入同一缓存行可能比您预期的还要糟糕. 我认为,UC还意味着强大的命令性,这会伤害OoO执行人员.我认为UC还会阻止您使用NT存储进行全行写入.它还会完全破坏读取性能,所以我认为这不值得考虑. WT也许值得考虑作为 clwb
..
我想在我的应用程序中检索 DRAM访问次数.确切地说,我需要在数据访问和代码访问之间区别.处理器是2.60GHz的 Intel(R)Core(TM)i7-4720HQ CPU ( Haswell ).基于 LLC-load-misses - mem_load_uops_retired.l3_miss = DRAM对代码的访问".不正确. 什么是local_dram和any_response?
..
在最近的Intel CPU上, POP 指令通常每个周期具有2条指令的吞吐量.但是,当使用寄存器 R12 (或 RSP ,除了前缀之外,具有相同的编码)时,如果指令通过旧式解码器,则吞吐量将下降至每个周期1(如果µops来自DSB,则吞吐量保持在每个周期2个左右). 可以使用 nanoBench 复制如下: sudo ./nanoBench.sh -asm"pop R12"; 在Ha
..
我看到编译成完全相同的机器指令但位于不同对齐地址上的同一C ++代码的性能下降了15%.当我的微小主循环从0x415220开始时,速度比在0x415250处更快.我正在Intel Core2 Duo上运行它.我在x86_64 Ubuntu上使用gcc 4.4.5. 有人可以解释速度下降的原因吗?我怎样才能迫使gcc最佳地对齐循环? 这是带有事件探查器注释的两种情况的反汇编: 4152
..
我有一个 Intel(R)Core(TM)i7-4720HQ CPU @ 2.60GHz ( Haswell )处理器.AFAIK, mem_load_uops_retired.l3_miss ,对 DRAM 需求(即, non-prefetch )数据读取访问次数进行计数.顾名思义, offcore_response.demand_data_rd.l3_miss.local_dram 计算针对D
..
我正在尝试编写一个使用OpenCL执行蒙特卡洛模拟的程序.我遇到了一个涉及指数的问题.当变量 steps 的值变大,大约为20000时,指数的计算将意外失败,并且程序将退出并显示"Abort Trap:6".鉴于步骤不应该影响内存分配,这似乎是一个奇怪的错误.我尝试将 normal , alpha 和 beta 设置为0,但这并不能解决问题,但是注释掉了指数并将其替换为常数1似乎可以解决此问题.我
..
我开始使用英特尔参考页来查找和了解操作码(而不是询问SO的所有内容).我想确保我的理解是正确的,并询问基本的asm程序和intel指令代码之间的输出问题. 这是我必须将各种 mov 指令比较到 rax -ish寄存器中的程序(是否有更好的说法"rax"及其32位代码,16位和8位组件?): .globl _start_开始:movq $ 1,%rax#立即移入8字节rax(rax)mov
..
我正在阅读有关控制寄存器的英特尔文档,但仍在努力了解如何使用CR8寄存器.引用文档( 但是与接收中断以查看是否必须阻止该中断相比,CR8中的优先级值是多少? 当中断被阻止时,这意味着什么?是“延迟"到以后,还是只是被丢弃,即丢失了? 解决方案 CR8指示CPU的当前优先级.当中断待处理时,将中断向量号的位7:4与CR8进行比较.如果向量较大,则将对其进行维修,否则将其保持待处理
..
我正在尝试使用intel vtune Amplifier估计我的应用程序的FLOPS,并且我在此处使用此帖子作为准则:
..
我有类似以下的代码(简单的加载,修改,存储)(我已对其进行了简化以使其更具可读性): __ asm__ __volatile__("vzeroupper":::);尽管(...) {__m128i in = _mm_loadu_si128(inptr);__m128i out = in;//实际代码的作用远不止于此,但我已经对其进行了简化_mm_stream_si12(outptr,out);
..