我一直在寻找最快的方法来处理popcount大数据.我遇到了一个很奇怪的效果:改变从循环变量unsigned至uint64_t50%在我的电脑上所做的性能下降.
#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; ++i)
charbuffer[i] = rand()%256;
uint64_t count,duration;
chrono::time_point<chrono::system_clock> startP,endP;
{
startP = chrono::system_clock::now();
count = 0;
for( unsigned k = 0; k < …Run Code Online (Sandbox Code Playgroud) 我被告知并且从英特尔的手册中读到可以将指令写入内存,但是指令预取队列已经获取了陈旧的指令并将执行那些旧的指令.我没有成功观察到这种行为.我的方法如下.
英特尔软件开发手册从第11.6节开始说明
对当前在处理器中高速缓存的代码段中的存储器位置的写入导致相关联的高速缓存行(或多个行)无效.此检查基于指令的物理地址.此外,P6系列和奔腾处理器检查对代码段的写入是否可以修改已经预取执行的指令.如果写入影响预取指令,则预取队列无效.后一种检查基于指令的线性地址.
所以,看起来如果我希望执行陈旧的指令,我需要有两个不同的线性地址引用相同的物理页面.所以,我将内存映射到两个不同的地址.
int fd = open("code_area", O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
assert(fd>=0);
write(fd, zeros, 0x1000);
uint8_t *a1 = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_FILE | MAP_SHARED, fd, 0);
uint8_t *a2 = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_FILE | MAP_SHARED, fd, 0);
assert(a1 != a2);
Run Code Online (Sandbox Code Playgroud)
我有一个汇编函数,它接受一个参数,一个指向我想要更改的指令的指针.
fun:
push %rbp
mov %rsp, %rbp
xorq %rax, %rax # Return value 0
# A far jump simulated with a far return
# Push the …Run Code Online (Sandbox Code Playgroud) C语言用于编写UNIX以实现可移植性 - 使用不同编译器编译的相同C语言程序生成不同的机器指令.为什么Windows操作系统能够在Intel和AMD处理器上运行?
在学习x86-64汇编时,我遇到了我的第一个"x86-64"的Intel 64和AMD64实现之间的不兼容性:为什么syscall在NASM 32位输出中编译而popa不能在64位编译? syscall在一个而不是另一个的兼容模式下有效.
除了仔细阅读这两本手册并进行比较之外,还有更好的方法可以找出这些不兼容性吗?这样会容易出错,并且在针对可移植性时会重复我的手动阅读工作吗?
例如,如果有以下任何一种情况会更容易:
正如我一直所理解的那样,AMD 通过对英特尔的指令集进行逆向工程来构建他们的 CPU,现在支付给英特尔使用他们的指令集,而英特尔对 AMD 的 64 位指令也是如此。
这就是 Windows 可以安装在两种类型的 CPU 上的方式,而无需购买特定版本,例如为 ARM 编译的版本,因此所有应用程序、游戏等都以相同的方式工作,可在 CPU 上互换工作......
然而最近有些事情让我质疑其中的一些......
首先,我注意到一些游戏在我的系统 (AMD) 上有点滞后,阅读后发现游戏针对 Intel CPU 进行了优化......
此外,OSX 是在 Intel CPU 上销售的,但在发现 hackintosh 社区之后,事实证明让 OSX 在 AMD 上运行是可能的,但非常困难。这是因为 OSX 再次是为英特尔设计的......
这些事情之后..
针对 Intel 或 AMD 进行优化意味着什么?如果它们旨在相互替换,怎么可能对一个而不是另一个进行不同/优化?即都支持相同的指令等。
这个问题是关于 32 位与 64 位 x86 的术语。
如果我有 2 个包含相同程序源代码的目录 - 一个用于 32 位 Windows,另一个用于 64 位 Windows,那么这些文件夹的更正确名称是什么:
我已经阅读了一些网络资源,但无法理解。仅作记录:
x86 ×6
assembly ×2
c ×2
intel ×2
x86-64 ×2
64-bit ×1
amd ×1
c++ ×1
caching ×1
optimization ×1
performance ×1
terminology ×1