gpt4 book ai didi

c - CPU乱序影响测试程序

转载 作者:行者123 更新时间:2023-12-04 11:31:04 24 4
gpt4 key购买 nike

我写了一个多线程程序来演示Intel处理器的乱序效果。该程序附在本文末尾。预期的结果应该是当 x 被 handler1 打印为 42 或 0 时。然而,实际结果始终是 42,这意味着乱序效应不会发生。

我用命令“gcc -pthread -O0 out-of-order-test.c”编译程序我在 Intel IvyBridge 处理器 Intel(R) Xeon(R) CPU E5-1650 v2 上的 Ubuntu 12.04 LTS(Linux 内核 3.8.0-29-generic)上运行编译程序。

有谁知道我应该怎么做才能看到乱序效果?

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int f = 0, x = 0;

void* handler1(void *data)
{
while (f == 0);
// Memory fence required here
printf("%d\n", x);
}

void* handler2(void *data)
{
x = 42;
// Memory fence required here
f = 1;
}

int main(int argc, char argv[])
{
pthread_t tid1, tid2;

pthread_create(&tid1, NULL, handler1, NULL);
pthread_create(&tid2, NULL, handler2, NULL);

sleep(1);
return 0;
}

最佳答案

您正在将竞争条件与乱序执行范式混合在一起。不幸的是,我很确定你不能“暴露”乱序执行,因为它是明确设计和实现的,以保护你(正在运行的程序及其数据)免受其影响。

更具体地说:乱序执行完全发生在 CPU“内部”。无序指令的结果不会直接发布到寄存器文件,而是排队以保持顺序。因此,即使指令本身被乱序执行(基于主要确保这些指令可以彼此独立运行的各种规则),它们的结果也总是按照外部观察者所期望的正确顺序重新排序.

您的程序所做的是:它尝试(非常粗略地)模拟一种竞争条件,在这种情况下您希望看到 f 的分配在 x 之前完成并且同时您希望在那个时刻恰好发生上下文切换并且您假设新线程将被安排在与另一个完全相同的 CPU 核心。然而,正如我上面所解释的——即使你足够幸运满足所有列出的条件(在 f 赋值之后但在 x 赋值之前安排第二个线程 < strong> 和 将新线程安排在同一个 CPU 内核上)——这本身就是一个极低概率的事件——即使那样你真正暴露的只是一个潜在的竞争条件,而不是一个 out-of-订单执行。

很抱歉让您失望了,您的程序无法帮助您观察乱序执行的影响。至少没有足够高的可能性来实用。

您可以在这里阅读更多关于乱序执行的内容: http://courses.cs.washington.edu/courses/csep548/06au/lectures/introOOO.pdf

更新经过一些思考后,我认为您可以即时修改指令,以期暴露无序执行。但即便如此,我担心这种方法也会失败,因为新的“更新”指令不会正确反射(reflect)在 CPU 的管道中。我的意思是:CPU 很可能已经获取并解析了您将要修改的指令,因此将要执行的内容将不再匹配内存字的内容(即使是 CPU 的 L1 缓存中的指令)。但是这种技术,假设它可以帮助你,需要直接在 Assembly 中进行一些高级编程,并且需要你的代码在最高特权级别(ring 0)下运行。我建议在编写自修改代码时要格外小心,因为它很可能会产生副作用。

关于c - CPU乱序影响测试程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33849209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com