相关疑难解决方法(0)

为什么这个延迟循环在没有睡眠的几次迭代后开始运行得更快?

考虑:

#include <time.h>
#include <unistd.h>
#include <iostream>
using namespace std;

const int times = 1000;
const int N = 100000;

void run() {
  for (int j = 0; j < N; j++) {
  }
}

int main() {
  clock_t main_start = clock();
  for (int i = 0; i < times; i++) {
    clock_t start = clock();
    run();
    cout << "cost: " << (clock() - start) / 1000.0 << " ms." << endl;
    //usleep(1000);
  }
  cout << "total cost: " << …
Run Code Online (Sandbox Code Playgroud)

c++ linux performance benchmarking

71
推荐指数
1
解决办法
6808
查看次数

x86中"PAUSE"指令的目的是什么?

我正在尝试创建一个自旋锁的哑版.浏览网页时,我在x86中遇到了一个名为"PAUSE"的汇编指令,该指令用于向处理器提供当前在此CPU上运行自旋锁的提示.英特尔手册和其他可用信息说明了这一点

在大多数情况下,处理器使用此提示来避免内存顺序违规,从而大大提高了处理器性能.因此,建议在所有自旋等待循环中放置PAUSE指令.文档还提到"等待(一些延迟)"是指令的伪实现.

上段的最后一行很直观.如果我没有成功抓住锁,我必须等待一段时间然后再抓住锁.

但是,在旋转锁定的情况下,内存顺序违规是什么意思?"内存顺序违规"是否意味着旋转锁定后指令的错误推测加载/存储?

关于堆栈溢出之前已经询问了自旋锁定问题但是内存顺序违规问题仍未得到解决(至少对于我的理解).

parallel-processing x86 x86-64 intel critical-section

53
推荐指数
2
解决办法
8336
查看次数

x86如何在spinlock*中暂停指令,*可以在其他场景中使用吗?

暂停指令通常用于测试自旋锁的循环,当一些其他线程拥有自旋锁时,以缓解紧密循环.据说这相当于一些NOP指令.有人能告诉我它是如何适用于自旋锁优化的吗?在我看来,即使是NOP指令也浪费了CPU时间.它们会降低CPU使用率吗?

另一个问题是我可以将暂停指令用于其他类似目的.例如,我有一个忙线程,它不断扫描一些地方(例如队列)以检索新节点; 但是,有时队列是空的,线程只是在浪费cpu时间.睡眠线程并通过其他线程唤醒它可能是一个选项,但线程是关键的,所以我不想让它睡觉.可以暂停指令工作以减轻CPU使用率吗?目前它使用100%cpu的物理核心?

谢谢.

x86 multithreading spinlock

37
推荐指数
3
解决办法
2万
查看次数

在自旋锁的实现中,有什么好的替代 PAUSE 的方法?

我正在为我的最新项目制作一个基于光纤的作业系统,该系统将依赖于使用自旋锁来实现正确的功能。我本来打算使用 PAUSE 指令,因为这似乎是普通现代自旋锁等待部分的黄金标准。然而,在对实现我自己的光纤进行一些研究时,我发现最近机器上的暂停周期持续时间已增加到不利的程度。

我从这里发现了这一点,其中引用了英特尔优化手册,“上一代微架构中 PAUSE 指令的延迟约为 10 个周期,而在 Skylake 微架构上它已扩展到多达 140 个周期,”和“由于 PAUSE 延迟显着增加,对 PAUSE 延迟敏感的工作负载将遭受一些性能损失。”

因此,我想找到 PAUSE 指令的替代方案以在我自己的自旋锁中使用。我读过,在过去,暂停一直是首选,因为它以某种方式节省了能源使用,我猜测这是由于另一个经常引用的事实,即使用暂停以某种方式向处理器发出信号,表明它处于自旋锁之中。我还猜测,这是在功率范围的另一端,为所需的周期数进行一些虚拟计算。

鉴于此,是否有一种最佳情况的解决方案能够接近 PAUSE 的表观能源效率,同时具有作为重复“丢弃”计算的灵活性和低周期计数?

c++ concurrency x86-64 energy spinlock

3
推荐指数
1
解决办法
533
查看次数

通过施加内存压力来降低 CPU 频率

我强调我的系统,看看它如何影响我使用stress-ng编写的一些程序。

程序本身是一个神经网络,主要由一些嵌套循环组成,进行一些乘法运算,并使用大约 1G 的 RAM 整体用 C++ 编码。

我使用以下方法对系统施加了一些内存压力:

stress-ng --vm 4 --vm-bytes 2G -t 100s
Run Code Online (Sandbox Code Playgroud)

这会创建 4 个工作人员在 mmap 上旋转,每个工作人员分配 2G 的 RAM。这显着减慢了我的程序的执行速度(从大约 150 毫秒到 250 毫秒)。但是程序变慢的原因不是缺少内存或内存带宽之类的。相反,CPU 周期从 3.4GHz(无压力 ng)减少到 2.8GHz(有压力 ng)。正如预期的那样,CPU 利用率保持大致相同 (99%)。

我使用以下方法测量了 CPU 频率

sudo perf stat -B ./my_program
Run Code Online (Sandbox Code Playgroud)

有人知道为什么内存压力会降低 CPU 的速度吗?

我的 CPU 是 Intel(R) Core(TM) i5-8250U,我的操作系统是 Ubuntu 18.04。

亲切的问候 lpolari

c++ linux cpu intel cpu-architecture

2
推荐指数
1
解决办法
622
查看次数