多核系统内存假共享问题

news2024/11/28 5:33:14
  1. 多核处理器(SMP)系统中, 每一个处理器都有一个本地高速缓存。内存系统必须保证高速缓存的一致性。当不同处理器上的线程修改驻留再同一高速缓存中的变量时就会发生假共享(false sharing),结果导致高速缓存无效,并强制更新,进而影响系统性能。

    什么是假共享(false sharing)

    假共享是 SMP 系统上的一种常见性能问题。在SMP系统中,每个处理器均有一个高速缓存。 当不同处理器上的线程修改驻留在同一高速缓存行(Cache Block,或Cache Line)中的变量时就会发生假共享。 这种现象之所以被称为假共享,是因为每个线程并非真正共享相同变量的访问权。 访问同一变量或真正共享要求编程式同步结构,以确保有序的数据访问。

    img

    线程 0 和线程 1 会用到不同变量,它们在内存中彼此相邻,并驻留在同一高速缓存块(Cache Block,或Cache Line)。 高速缓存行被加载到 CPU 0 和 CPU 1 的高速缓存中(灰色箭头)。 尽管这些线程修改的是不同变量(红色和蓝色箭头),高速缓存行(Cache Block,或Cache Line)仍会无效,并强制内存更新以维持高速缓存的一致性,这会降低应用性能

    避免False Sharing

    简单来说,就是用空间换时间,主动给struct填充一些字段,使它避免任意两个成员同时出现在同一个CacheLine中。

    golang示例

    • 未作优化的struct
    type noPad struct {
    	a uint64
    	b uint64
    	c uint64
    }
    
    func (np *noPad)Increase() {
        // 原语:原子操作自增1,目的是避免自增操作被干扰
    	atomic.AddUint64(&np.a, 1)
    	atomic.AddUint64(&np.b, 1)
    	atomic.AddUint64(&np.c, 1)
    }
    -----------------------------
    cpu: AMD Ryzen 7 5800H with Radeon Graphics         
    BenchmarkNoPad_Increase
    BenchmarkNoPad_Increase-16    	37386787	        32.68 ns/op
    PASS
    
    • 在struct中使用匿名数组填充Cache Line,避免两个成员同时出现在同一个CacheLine中
    type Pad7 struct {
    	a uint64
    	_ [7]uint64
    	b uint64
    	_ [7]uint64
    	c uint64
    	_ [7]uint64
    }
    
    func (p *Pad7)Increase() {
    	atomic.AddUint64(&p.a, 1)
    	atomic.AddUint64(&p.b, 1)
    	atomic.AddUint64(&p.c, 1)
    }
    ---------------------------
    cpu: AMD Ryzen 7 5800H with Radeon Graphics         
    BenchmarkPad7_Increase
    BenchmarkPad7_Increase-16    	65326725	        18.37 ns/op
    PASS
    
    • 可以看到,对struct优化过的程序执行速度是未优化过的三倍还多,这个差距简直离谱。

    像上面案例中的Pad7,就是通过填充匿名数组,使得任意两个具名成员分别处在不同的CacheLine上。

    需要注意的是,这种机械处理方式仅仅针对特定的平台,比如CacheLine为64Byte的平台,要是跨平台,这样的处理很可能就是纯粹的浪费Cache。而且在当今的处理器中Cache的命中率已经非常高了,与其花大量的精力去解决False Sharing问题,不如优先专注于业务

  2. javascript:😉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/528749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

长期封闭环境中与积极情绪相关的肠道菌群

谷禾健康 近年来,随着微生物群-肠-脑轴研究的深入,越来越多证据表明,微生物群-肠-脑轴在调节大脑功能方面发挥着关键作用,尤其是在情绪处理和行为方面。然而,肠道微生物群与长期封闭环境中的心理变化之间的相关性仍知之…

小魔推助力实体行业短视频创作,打爆UGC素人流量!

最近不止一次的和大家讲到UGC的玩法,相信很多朋友也有了一定的认知,UGC简单来说,就是通过用户来生产原创内容,通过实体店的门头、环境、特色服务等相关内容,并且带有门店地址发布,就可以提升实体商家的POI热…

tensorrt

【TensorRT】动态batch进行推理_tensorrt 动态batch_there2belief的博客-CSDN博客 https://www.cnblogs.com/harrymore/p/15387117.html 1.动态batch 2.tensor内存管理 3.

《河北教育》期刊简介及投稿邮箱

《河北教育》期刊简介及投稿邮箱 主管单位:河北省教育厅 主办单位:河北省教育宣传中心 国际刊号ISSN:1004-6208;国内刊号CN:13-1036/G4;邮发代号:18-67 出版周期:月刊 出版地:河北省石家庄…

pytorch中backward()函数与gradient 参数详解

矩阵乘法的例子1 以下例来说明backward中参数gradient的作用 注意在本文中表示矩阵乘法,*表示对应元素相乘 求A求偏导 试运行代码1 import torch# [1,2][2*3][1,3] A torch.tensor([[1., 2.]], requires_gradTrue) B torch.tensor([[10., 20., 30.], [100., 20…

『赠书活动 | 第五期』《人工智能数学基础》

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 『赠书活动 | 第五期』 本期书籍:《人工智能数学基础》 赠书规则:评论区:点赞|收藏|留言 评论…

DAP-seq技术鉴定葡萄MADS-box转录因子VvMADS28的靶基因,揭示葡萄胚珠发育的调控机制

葡萄是一种营养丰富、美味可口的水果,深受世界各地消费者的喜爱。近年来,无籽葡萄也越来越受大家的欢迎,因此,无籽葡萄品种的培育成为一个重要的育种目标,而了解葡萄种子发育的分子遗传调控机制对于无籽栽培品种的培育…

Kyligence Zen 产品体验-好用的指标平台

文章目录 一、Kyligence Zen概念一、BI发展历史1.以报表为核心的IT响应式服务2.以宽表为核心的自助可视化分析3.以指标为核心的可视化分析、增强分析 二、什么是Kyligence Zen?1.官网的介绍2.个人的理解 二、产品体验一、创建账号二、指标1.直接创建指标2.导入指标数…

postgresql集群编译安装

postgreSQL集群部署1环境准备(三台服务器全部执行) 2.1.1 准备三台虚拟机 服务器名称 服务器IP 描述 Pgsql-0 xxx.xxx.xxx.xxx master节点 Pgsql-1 xxx.xxx.xxx.xxx slave1节点 Pgsql-2 xxx.xxx.xxx.xxx slave2节点 2.1.2 安装编译需要的相…

ANR实战案例 - 通用方法总结

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、业务耗时1.登录Dialog优化2.子线程更新通知栏 二、频繁调用1.底部Tab资源初始…

【LLM系列之LLaMA】LLaMA: Open and Efficient Foundation Language Models

论文题目:《LLaMA: Open and Efficient Foundation Language Models》 论文链接:https://arxiv.org/pdf/2302.13971.pdf github链接:https://github.com/facebookresearch/llama/tree/main huggingface链接:https://huggingface.c…

[离散数学] 函数

文章目录 函数判断函数的条件复合函数复合函数的性质 逆函数 函数 判断函数的条件 dom F A ⇔ \Leftrightarrow ⇔所有x 都有 F&#xff08;x&#xff09;与之对应 有唯一的与其对应 < x , y > ∈ f ∧ < y , z > ∈ f ⇒ y z <x,y>\in f \land <y,z…

【C++】2. 进入面向对象 - 类和对象的初步认识

专栏导读 &#x1f341;作者简介&#xff1a;余悸&#xff0c;在读本科生一枚&#xff0c;致力于 C 方向学习。 &#x1f341;收录于 C专栏&#xff0c;本专栏主要内容为 C 初阶、C 进阶、STL 详解等&#xff0c;持续更新中&#xff01; &#x1f341;相关专栏推荐&#xff1a;…

TikTok新手做什么账号,Tiktok类目怎么选

有很多刚入驻TikTok的小白不知道要选择什么类目才比较容易起量。看完这篇后&#xff0c;相信你们的疑惑就会烟消云散。选择对了类目对以后的产品带货有很大的促进作用&#xff0c;今天我给你们分享6种适合TikTok小店运营的账号类型&#xff0c;以及一些比较推荐的类目。 TikTok…

测试和调试之Python高级篇

测试和调试 在软件开发过程中&#xff0c;测试和调试是非常重要的环节。测试用于验证代码的正确性和可靠性&#xff0c;而调试则是为了找到并解决代码中存在的问题。下面将会详细介绍单元测试、集成测试、断言、测试框架、调试工具和技巧。 单元测试 单元测试是指对软件中的…

linux环境安装使用redis详解

Redis 1. NoSQL的引言 NoSQL ( Not Only SQL )&#xff0c;意即 不仅仅是SQL , 泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。 2. 为什么是NoSQL 随着互联网网站的兴起&#xff0c;传统的关系数据库在应付动态网站&#xff0c;特别是超大…

OpenPCDet系列 | 5.1 PointPillars算法——PillarVFE特征构建与编码模块

文章目录 PillarVFE模块1. PillarVFE初始化2. PillarVFE数据处理2.1 特征构造2.2 掩码构造2.3 特征编码 OpenPCDet的整个结构图&#xff1a; PillarVFE模块属于VFE结构的其中一种&#xff0c;所以可以在PCDet中的backbone_3d目录下&#xff0c;可以找到vfe目录结构。在OpenPCDe…

【JOSEF约瑟 JL-8GA/12端子排电流继电器 整定范围宽、功耗低】

JL-8GA/12端子排电流继电器名称:端子排电流继电器型号:JL-8GA/12品牌:JOSEF约瑟功率消耗:≤5W触点容量:250V5A额定电压:58,100,110,220V 系列型号&#xff1a; JL-8GA/11端子排电流继电器&#xff1b; JL-8GA/12端子排电流继电器&#xff1b; JL-8GA/13端子排电流继电器&am…

MySQL(1) ---- 数据库介绍与MySQL概述

介绍 1、什么是数据库&#xff1f; 数据库&#xff1a;DateBase&#xff08;DB&#xff09;&#xff0c;是存储和管理数据的仓库。数据库管理系统&#xff1a;DataBase Management System&#xff08;DBMS&#xff09;&#xff0c;操纵和管理数据库的大型软件。SQL&#xff1…

【C语言】手把手教你文件操作

文章目录 一、前言二、文件的打开和关闭1. fopen函数2. fclose函数 三、文件的顺序读写四、文件的随机读写1. fseek函数2. ftell函数3. fwind函数 一、前言 程序运行时&#xff0c;数据存放在内存中&#xff0c;而当程序退出后&#xff0c;数据也就不复存在。 想做到数据持久化…