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

标签 c++ multithreading performance parallel-processing openmp

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

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/

相关文章:

java - java中的多线程客户端服务器聊天应用程序

.net - 生成调试信息 (pdb) 是否会使我的应用程序在运行时变慢?

android - Titanium:iPhone 应用程序到 android 的问题

C++ 关联容器 - 为什么标准没有定义交换和替换键的方法?

从签名文件中获取 SignedCms 的 C# 实现

c - 在 C 中在 main 外部定义一个数组,并在 main 内部分配其大小

c# - 使用未经检查的上下文是否会影响 C# 中的性能或可移植性?

c++ - 在 C++98 中 'dvd1' 必须由构造函数初始化,而不是 '{...}'

c++ - 模拟器,发送请求-响应并打开 TCP 连接

c++ - 我可以在 VS2010 中获取 VS2012 标准库吗