多线程伪共享(false sharing)问题分析

2023-10-31

#include<stdio.h> 
#include<omp.h> 
#include<string.h> 
#include<time.h>
#include<stdlib.h>
#include<iostream>
using namespace std;



#define NMAX 4096 * 10 
#define NUM_CORE 4 

int g_iBuff[NMAX];


int main()
{
    int alignPos = 0;
    for (int i = 0; i < 65; ++i)
    {
        int * addr = &g_iBuff[i];
        char buf[32];
        int int_addr = atoi(buf);
        if ( int_addr % 64 == 0)
        {
            alignPos = i;
            cout<<"alignPos:"<<int_addr<<endl;
            break;
        }
    }

    for (int pos = 1; pos <= 4096; pos <<= 1)
    {
        memset(g_iBuff, 0 , sizeof(g_iBuff));
        time_t beg = time(0);
#pragma omp parallel for num_threads(NUM_CORE) 
        for (int i = 0; i < NUM_CORE; ++i)
        {
            int tp = i * pos + alignPos;
            for (int j = 0; j < 999999999; ++j)
            {
                g_iBuff[tp]++;
            }
        }
        time_t end = time(0);

        cout << "false shareing: step = "<<pos<<" time = "<< end - beg << "s" <<endl;
    }

    return 0;
}


# g++ XX.cpp -o xx -fopenmp

# ./xx 

我们首先来看一下这段代码的输出结果:

false shareing: step = 1 time = 12s
false shareing: step = 2 time = 13s
false shareing: step = 4 time = 13s
false shareing: step = 8 time = 6s
false shareing: step = 16 time = 3s
false shareing: step = 32 time = 3s
false shareing: step = 64 time = 3s
false shareing: step = 128 time = 3s
false shareing: step = 256 time = 3s
false shareing: step = 512 time = 3s
false shareing: step = 1024 time = 3s
false shareing: step = 2048 time = 3s
false shareing: step = 4096 time = 3s


接下来我们来分析一个程序:


上面这段代码的功能是找到地址是64倍数的内存位置, alignPos;

r接下来我们在4核的机器来来验证伪共享对程序的影响。

当 step = 1时,4个线程写入的位置(相对alignPos开始位置)0,4,8和12,显然存在伪共享。

当 step = 2时,写入的位置分别为0,8,16和24,同样也是伪共享

当 step = 4时,写入的位置分别为0,16,32和48,同样也是伪共享

当 step = 8时,写入的位置分别为0,32,64和96,由于cache是64B对齐,因此,0和32以及64和96存在伪共享,但是比前3种情况要好。

对 step = 16时,写的位置分别为0,64,128,和192,刚好完全不再具有伪共享的问题。

step > 16, 也不会再存在伪共享。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程伪共享(false sharing)问题分析 的相关文章

  • IIS应用程序池回收+quartz调度

    我正在 IIS 7 5 上运行一个 Web 应用程序 它需要偶尔回收 否则内存使用情况会失控 这是我正在研究的问题 当它回收时 它实际上不会运行 直到另一个请求到来 而quartz不会运行 有没有办法让IIS在回收应用程序池后立即自动启动1
  • CMake 找不到请求的 Boost 库

    既然我已经浏览了其他人的解决方案几个小时 但找不到适合我的问题的正确答案 我想将我的具体问题带给您 我正在尝试使用 CMake 构建 vsomeip 为此 我之前构建了 boost 1 55 但是 我在 CMake 中收到以下错误 The
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne

随机推荐

  • 求全排列(JAVA)

    输出自然数1输出自然数1到n所有不重复的排列 即n的全排列 到n所有不重复的排列 即n的全排列 package n的全排列 import java util Scanner author admin public class Main st
  • 【HTML+CSS+JS】登录注册页面大合集

    前言 学JS也学了一段时间 正巧碰上了人工智能要调用人脸识别接口进行真人人脸识别 于是便萌生了用人脸来进行注册和登录的想法 这样的话就需要开发一个登录注册页面 然后用JS绑定注册事件调用人脸识别接口进行登录注册 饭要一口一口吃 路要一步一步
  • Vue项目启动内存溢出 js stack overflow

    方法1 在node modelus目录下的 vue cli service bin vue cli service js文件中的首行加入 usr bin env node max old space size 4096 方法二 修改本地项目
  • 入门卷积神经网络必备,基础、理论、实战一网打尽!

    目录 前言 教程安排 1 基本概念 2 论文解读 3 模型结构与原理 4 模型实战 5 问题解答 6 目标检测领域 相关技术群 前言 其实 挺早之前就有更新有关于卷积神经网络文章的想法 这些时间里 因为一些事情 更新进度确实慢了一些 但是也
  • 三星显示器服务器网络设置方法,三星显示器也有这样的通病,看完你就知道怎么解决...

    原标题 三星显示器也有这样的通病 看完你就知道怎么解决 小编今天在网上看到一个教程说三星显示器能开机 关键是屏幕还会提示无信号输入 看完非常兴奋 因为小编店里就有一台三星的显示器出现一模一样的故障 就是开机接上电脑后提示无信号输入 但是显示
  • Java Redis三种客户端对比(优缺点对比+使用建议)

    Redis的Java客户端很多 官方推荐的有三种 Jedis Redisson和lettuce 在这里对Jedis和Redisson进行对比介绍 Jedis 轻量 简洁 便于集成和改造 支持连接池 支持pipelining 事务 LUA S
  • 12. 微积分 - 梯度&积分

    Hi 大家好 我是茶桁 上一节课 我们讲了方向导数 并且在最后留了个小尾巴 是什么呢 就是梯度 我们再来回看一下但是的这个式子 f x f y
  • matlab练习程序(圆柱投影)

    圆柱投影就是将一张二维的图像投影到三维的圆柱体上 不过在显示图像的时候依然是以二维的形式给出 投影最重要的步骤就是计算投影变换公式 和图像旋转类似 只要得到变换公式 再依照公式进行代码编写就很容易了 这里就不写投影变换公式的推导过程了 直接
  • 区块链在金融领域的应用案例

    区块链这一颠覆性的技术作为当下多种热门概念的交集 将在可预见的未来深刻地影响包括金融业在内的多个行业 制造跨领 域合作的机会 提高资源配置效率 助力产业转型升级 对区块链技术的积极应对或是被动接受 也将导致各行业内部的重新洗牌 在金融领域
  • vs2010main.cpp不能检测到main.h

    今天想更改在github找到的人脸识别代码 主要想添加一个main h在原有代码中 并且把main cpp的一些东西挪到 h中 出现问题 在解决方案中添加了main h 但是在 cpp中添加 include main h 时出现错误 系统找
  • QT窗体禁止拖动缩放:使用setFixedSize方法

    QT窗体禁止拖动缩放 使用setFixedSize方法 需求 我想实现窗体在正常状态 Qt WindowNoState 边框不能通过鼠标拖动改变窗体大小 不影响窗体的正常最大化和还原状态 1024 768 屏幕的初始大小是可使用屏幕的大小
  • Qt5 安装教程

    Qt 是一个支持windows linux android等系统平台的集成开发环境 可以作为C 软件开发界面设计及代码编写的开发工具 并且其具有诸多基于C 底层封装的类库 对于新手程序猿来说 使用起来比较友好 1 官网下载需要安装的版本 h
  • vue 显示txt显示到页面_CDR页面“外”的内容在每个页面外都显示的方法

    前言 正常情况下 CDR软件中页面外的为 桌面 在哪个页面可以看到的 但是有粉丝反应 在CDR 2019版本中 将第一页的内容拖出页面以外时 在第二页面是看不到这些内容的 X4版有时也会这样 今天小编给大家分享CDR X4和2019版页面
  • snprintf函数使用

    int snprintf char restrict buf size t n const char restrict format 函数说明 最多从源串中拷贝n 1个字符到目标串中 然后再在后面加一个0 函数返回值 若成功则返回写入的字符
  • redis set zset key 常用命令

    list 可以重复 set不可以 list 有序 set元素位置无序 key常用命令 1 存储数据 sadd key member member 获取的结果是无序的 2 获取数据 获取全部数据 smembers key 3 随机获取一个数据
  • 书剑宠物疫苗接种管理软件操作教程

    软件简介 书剑宠物疫苗接种管理软件是一款宠物疫苗接种管理的工具 适合宠物诊所使用 具有动物主人建档 宠物疫苗接种登记管理 每日提醒 打印疫苗接种通知卡 自定义短信提醒模板等完善的功能 另外本软件的特色是同时具有手机网页版功能 手机扫一扫即能
  • 神经网络:多层感知机-MLP

    参考别人的 别看了 我自己做笔记玩的 最基本的神经网络 MLP 相应的变种的神经网络 误差反向传播 Back Propagation BP 神经网路 概率神经网络 卷积神经网络 Convolutional Neural Network CN
  • 有一行电文,已按以下规律译成密码: A-Z a-z B-Y b-y C-X c-x,即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程将密码译回原文,并

    有一行电文 已按以下规律译成密码 A Z a z B Y b y C X c x 即第一个字母变成第26个字母 第i个字母变成第 26 i 1 个字母 非字母字符不变 要求编程将密码译回原文 并输出密码和原文 include
  • requests中header的介绍及使用

    文章目录 在我们的学习工作中 写代码做一个简单的接口测试的时候 就会发现 即使是发送了一个post或get请求 但是系统提示我非法参数 无效请求 为什么呢 因为有一些系统或者网站对于请求做出一系列的反爬虫机制 他会效验你的header 是不
  • 多线程伪共享(false sharing)问题分析

    include