Questions tagged «x86»

x86是派生自Intel 8086 CPU的体系结构。x86系列包括32位IA-32和64位x86-64架构,以及传统的16位架构。关于后者的问题应标记为[x86-16]和/或[emu8086]。如果您的问题特定于64位x86-64,请使用[x86-64]标记。对于x86 FPU,使用标签[x87]。对于SSE1 / 2/3/4 / AVX *,也请使用[sse],以及适用的[avx] / [avx2] / [avx512]中的任何一个

10
将32位循环计数器替换为64位会在Intel CPU上使用_mm_popcnt_u64引起疯狂的性能偏差
我一直在寻找处理popcount大量数据的最快方法。我遇到了一个非常奇怪的效果:将loop变量从更改为unsigned,uint64_t使PC上的性能下降了50%。 基准测试 #include <iostream> #include <chrono> #include <x86intrin.h> int main(int argc, char* argv[]) { using namespace std; if (argc != 2) { cerr << "usage: array_size in MB" << endl; return -1; } uint64_t size = atol(argv[1])<<20; uint64_t* buffer = new uint64_t[size/8]; char* charbuffer = reinterpret_cast<char*>(buffer); for (unsigned i=0; i<size; …

11
用于测试Collat​​z猜想的C ++代码比手写汇编要快-为什么?
我用汇编语言和C ++语言为Euler Q14项目编写了这两种解决方案。它们是用于测试Collat​​z猜想的相同相同的蛮力方法。组装解决方案与 nasm -felf64 p14.asm && gcc p14.o -o p14 C ++使用 g++ p14.cpp -o p14 部件, p14.asm section .data fmt db "%d", 10, 0 global main extern printf section .text main: mov rcx, 1000000 xor rdi, rdi ; max i xor rsi, rsi ; i l1: dec rcx …



4
在英特尔Sandybridge系列CPU中取消对管道程序的优化
我已经花了一个星期的时间来尝试完成这项任务,我希望这里的人可以带领我走上正确的道路。让我从讲师的指示开始: 您的分配与我们的第一个实验分配相反,后者是优化素数程序。您在此作业中的目的是简化程序,即使其运行缓慢。这两个都是占用大量CPU的程序。他们需要几秒钟才能在我们的实验室PC上运行。您可能无法更改算法。 要优化程序,请使用有关Intel i7管道运行方式的知识。想像一下重新排序指令路径以引入WAR,RAW和其他危险的方法。想办法最大限度地减少缓存的有效性。令人作呕的无能。 作业中选择了磨刀石或蒙特卡洛程序。缓存效率注释大部分仅适用于Whetstone,但我选择了蒙特卡洛模拟程序: // Un-modified baseline for pessimization, as given in the assignment #include <algorithm> // Needed for the "max" function #include <cmath> #include <iostream> // A simple implementation of the Box-Muller algorithm, used to generate // gaussian random numbers - necessary for the Monte Carlo method below …

12
如何使用SSE4.2和AVX指令编译Tensorflow?
这是从运行脚本以检查Tensorflow是否正常运行时收到的消息: I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use …

3
什么是retpoline,它如何工作?
为了减轻对内核或跨进程的内存泄露(在幽灵攻击),Linux内核1将用新的选项进行编译,-mindirect-branch=thunk-extern推出gcc通过一个所谓的执行间接调用retpoline。 这似乎是一个新发明的术语,因为Google搜索仅在最近才使用(通常在2018年全部使用)。 什么是retpoline?它如何防止最近发生的内核信息泄露攻击? 1它不是特定于Linux的-类似或相同的构造似乎被用作其他OS 的缓解策略的一部分。

10
多核汇编语言是什么样的?
曾几何时,例如,编写x86汇编器时,您将需要说明“加载EDX寄存器值为5”,“递增EDX”寄存器等指令。 对于具有4个内核(甚至更多)的现代CPU,在机器代码级别上看起来是否只有4个独立的CPU(即,是否只有4个不同的“ EDX”寄存器)?如果是这样,当您说“增加EDX寄存器”时,由什么决定增加哪个CPU的EDX寄存器?x86汇编器中现在有“ CPU上下文”或“线程”概念吗? 内核之间的通信/同步如何工作? 如果您正在编写操作系统,则通过硬件公开什么机制以允许您计划在不同内核上的执行?这是一些特殊的特权说明吗? 如果您正在为多核CPU编写优化的编译器/字节码VM,那么您需要特别了解x86,以使其生成可在所有内核上高效运行的代码? 对x86机​​器代码进行了哪些更改以支持多核功能?
243 assembly  x86  cpu  multicore  smp 


8
基本指针和堆栈指针到底是什么?他们指出了什么?
使用来自维基百科的示例,其中DrawSquare()调用DrawLine(), (请注意,此图在底部具有高地址,在顶部具有低地址。) 任何人都可以解释我什么ebp,并esp在这方面? 从我所看到的,我会说堆栈指针总是指向堆栈的顶部,而基本指针指向当前函数的开头?或者是什么? 编辑:我的意思是在Windows程序的上下文中 edit2:又如何eip运作? edit3:我有以下来自MSVC ++的代码: var_C= dword ptr -0Ch var_8= dword ptr -8 var_4= dword ptr -4 hInstance= dword ptr 8 hPrevInstance= dword ptr 0Ch lpCmdLine= dword ptr 10h nShowCmd= dword ptr 14h 它们似乎都是双字,因此每个占用4个字节。所以我可以看到从hInstance到var_4有4个字节的距离。这些是什么?我认为这是寄信人地址,如维基百科的图片所示? (编者注:从迈克尔的答案中删除了一个长引号,该引号不属于该问题,但编辑了一个后续问题): 这是因为函数调用的流程是: * Push parameters (hInstance, etc.) * Call function, which pushes return …
225 c++  c  assembly  x86 

5
ARM体系结构与x86有何不同?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使它成为Stack Overflow 的主题。 4年前关闭。 改善这个问题 x86体系结构是否专门设计为与键盘一起使用,而ARM希望可以移动?两者之间的主要区别是什么?
189 x86  arm 

3
为什么GCC对于几乎相同的C代码生成如此根本不同的汇编?
在编写优化ftol函数时,我在中发现了一些非常奇怪的行为GCC 4.6.1。首先让我向您展示代码(为清楚起见,我标记了不同之处): fast_trunc_one,C: int fast_trunc_one(int i) { int mantissa, exponent, sign, r; mantissa = (i & 0x07fffff) | 0x800000; exponent = 150 - ((i >> 23) & 0xff); sign = i & 0x80000000; if (exponent < 0) { r = mantissa << -exponent; /* diff */ } else { r …

4
运行计算机程序会怎样?
我知道一般的理论,但我不适合细节。 我知道程序驻留在计算机的辅助存储器中。一旦程序开始执行,它将被完全复制到RAM中。然后,处理器一次检索几条指令(取决于总线的大小),将它们放入寄存器中并执行它们。 我也知道计算机程序使用两种内存:堆栈和堆,它们也是计算机主内存的一部分。堆栈用于非动态内存,堆用于动态内存(例如,与newC ++中的运算符相关的所有内容) 我不明白的是这两件事是如何联系的。堆栈在什么时候用于执行指令?指令从RAM到堆栈,再到寄存器?



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.