gpt4 book ai didi

c++ - 竞争条件会降低代码的性能吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:50 25 4
gpt4 key购买 nike

我正在运行以下矩阵乘法代码,我应该测量其性能:

for (int j = 0; j < COLUMNS; j++)
#pragma omp for schedule(dynamic, 10)
for (int k = 0; k < COLUMNS; k++)
for (int i = 0; i < ROWS; i++)
matrix_r[i][j] += matrix_a[i][k] * matrix_b[k][j];

是的,我知道它真的很慢,但这不是重点 - 它纯粹是为了性能测量目的。我正在运行 3 个版本的代码,具体取决于我放置 #pragma omp 指令的位置,因此也取决于并行化发生的位置。代码在 Microsoft Visual Studio 2012 中以 Release模式运行,并在 CodeXL 中进行分析。

我从测量中注意到的一件事是代码片段中的选项(在 k 循环之前并行化)是最慢的,然后是在 j 循环之前带有指令的版本,然后是在我循环。所提供的版本也是由于竞争条件而计算出错误结果的版本——多个线程同时访问结果矩阵的同一单元格。我理解为什么 i 循环版本是最快的——所有特定线程只处理 i 变量范围的一部分,增加了时间局部性。但是,我不明白是什么导致 k 循环版本最慢 - 它是否与它产生错误结果的事实有关?

最佳答案

当然,竞争条件会降低代码速度。当两个或多个线程访问内存的同一部分(同一缓存行)时,该部分必须一遍又一遍地加载到给定核心的缓存中,因为另一个线程通过写入缓存内容使缓存内容无效。他们争夺共享资源。

当内存中距离太近的两个变量被更多线程写入和读取时,也会导致速度变慢。这被称为 false sharing .在您的情况下更糟,它们不仅靠得太近,甚至重合。

关于c++ - 竞争条件会降低代码的性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34887801/

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