x86 平台实现一个原子加法操作

1,先上代码

#include <iostream>
#include <omp.h>

int atomicAdd(int* ptr, int value) {
    int result;
    asm volatile(
        "lock xaddl %0, %1\n"
        : "=r" (result), "=m" (*ptr)
        : "0" (value), "m" (*ptr)
        : "memory"
    );
    return result;
}

int main() {
    int sharedValue = 0;

    // 原子加法操作
//    int increment = 10;
#pragma omp parallel
{
	for(int i=0; i<10000; i++)
    		atomicAdd(&sharedValue, 10);
    		//atomicAdd(&sharedValue, increment);
}
    std::cout << "New value: " << sharedValue << std::endl;

    return 0;
}

Makefile:


EXE := hello_atomic
all: $(EXE)

%: %.cpp
	g++ -fopenmp $< -o $@


.PHONY: clean
clean:
	-rm -rf $(EXE)

2,实验运行效果

18核36线程,每个线程做1W次加法,没有加丢:

3,原理

        在 x86 架构的 CPU 中,原子操作通常是通过特殊的 CPU 指令来实现的,这些指令能够确保在多线程并发执行时,线程或进程使用这类指令对共享内存的操作是原子的,即不会被中断或打断。以下是一些常见的 x86 CPU 中用于实现原子操作的指令:


1. XCHG 指令:XCHG 指令用于交换内存中的值和寄存器中的值。在多线程编程中,可以使用 XCHG 指令来实现原子的读-修改-写操作。


2. CMPXCHG 指令:CMPXCHG 指令用于比较首操作数与 XAX的值,如果相等则将第二操作数的值复制给首操作数。这个指令通常用于实现原子的比较并交换操作(Compare and Swap)。


3. LOCK 前缀:LOCK 前缀可以与其他指令一起使用,用于将指令执行过程中的内存访问变为原子操作。例如,LOCK XCHG 或 LOCK CMPXCHG。


4. 内存屏障指令:MFENCE、SFENCE 和 LFENCE 指令用于确保内存操作的顺序性和可见性,以避免乱序执行带来的问题。


这些指令和前缀可以确保在多线程并发执行时,对共享内存的操作是原子的,从而避免竞态条件和数据不一致性问题。在编写并发程序时,可以利用这些原子操作来实现线程安全的共享内存访问。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序猿大战Python——Python与MySQL交互三

SQL注入 目标&#xff1a;了解什么是SQL注入&#xff1f; SQL注入指的是&#xff1a;恶意篡改或注入SQL条件。 当开发者的数据条件若被恶意篡改&#xff0c;那就达不到预期的查询效果。 为了了解SQL注入是怎么回事&#xff1f;通过一个案例来分析。 例如&#xff0c;使用命令…

综合布线实训室建设可行性报告

1、 建设综合布线实训室的目的和意义 1.1 响应国家职业教育政策 在国家对职业教育的高度重视和政策支持下&#xff0c;综合布线实训室的建设不仅是对国家教育方针的积极响应&#xff0c;也是对技术教育改革的有力推动。通过这一平台&#xff0c;我们旨在培育出一批具有强烈实…

ChatGPT智能对话绘画系统 带完整的安装源代码包以及搭建教程

系统概述 ChatGPT 智能对话绘画系统是一款集智能语言处理和绘画创作于一体的综合性系统。它利用了深度学习和自然语言处理技术&#xff0c;能够理解用户的意图和需求&#xff0c;并通过与用户的交互&#xff0c;生成富有创意的绘画作品。该系统的核心是一个强大的人工智能模型…

高考后的抉择:专业优先还是学校优先?

随着2024年高考的帷幕落下&#xff0c;高考生们面临的一个重要抉择再度浮上心头&#xff1a;在分数受限的情况下&#xff0c;是选择一个心仪的专业&#xff0c;还是选择一个知名度更高的学校&#xff1f;这是一个困扰了众多考生和家长的长期难题。在这个关键的时刻&#xff0c;…

“一团乱麻”到底什么是烟雾病呢?

当我们听到“烟雾病”这个名字时&#xff0c;可能会联想到与吸烟有关的疾病&#xff0c;但实际上&#xff0c;这是一种与吸烟毫无关系的罕见脑血管疾病。它的名字来源于在脑血管造影中&#xff0c;病变的血管网看起来像一团乱麻&#xff0c;又似吸烟时吐出的烟雾。 烟雾病&…

uniapp, ‍[⁠TypeError⁠]‍ “Failed to fetch dynamically imported module“ 报错解决思路

文章目录 1. 背景2. 报错3. 解决思路4. 思考参考1. 背景 最近基于uniapp开发一款设备参数调试的APP软件,在使用第三方插件的过程中,出现下面的报错。 2. 报错 [plugin:vite:import-analysis] Cannot find module ‘D:/leaning/uniapp/demo/jk-uts-udp示例/uni_modules/uts-…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP3001(SPI接口)的ADC转换器Proteus仿真

一、仿真原理图: 二、仿真效果: 三、STM32CubeMX配置: 1)、USART配置: 2)、SPI配置: 四、软件部分: 1)、时钟、SPI、USART初始化部分: /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RC…

Docker-Compose一键部署项目

Docker-Compose一键部署项目 目录 Docker-Compose一键部署项目介绍部署Django项目项目目录结构 docker-compose.ymlnginx的default.conf文件后端Dockerfile文件mysql.env一键部署DNS域名解析引起的跨域问题 介绍 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的…

网络世界的“握手”与“告别”:揭秘TCP的三次握手与四次挥手

在网络世界中&#xff0c;数据的传输就像是一场精心编排的舞蹈&#xff0c;而TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;则是这场舞蹈的指挥家。它确保数据在网络中的传输既稳定又可靠。那么&#xff0c;在这背后&#xff0c;TCP是如何…

红黑树原理 部分模拟实现

1.红黑树的概念及性质 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出…

Redis和PHP的Bitmap于二进制串的相互转换

Redis和PHP的Bitmap于二进制串的相互转换 场景 错题集的存储&#xff0c;需要有正确的题号id集合&#xff0c;错误的题号id集合&#xff0c;两者并集后在全量题的集合中取反就是未答题号id 选型 基于场景的数据结构设计&#xff0c;有试过列表等&#xff0c;测试结果&#xff1…

python笔记----少儿编程课程

第1课&#xff1a; 认识新朋友-python 知识点&#xff1a; 1、在英文状态下编写Python语句。 2、内置函数print()将结果输出到标准的控制台上&#xff0c;它的基本语法格式如下&#xff1a; print("即将输出的内容") #输出的内容要用引号引起来&#xff0c;可…

【Ant Design Vue的更新日志】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

SAP 创建BP 提示 CVI_MAPPING 011

原因编号不是外部给号的问题

腾讯云TI平台的大模型精调解决方案

腾讯云TI平台的大模型精调解决方案 随着人工智能和大数据技术的快速发展&#xff0c;大模型在各行各业的应用日益广泛。然而&#xff0c;大规模模型的训练和部署面临着诸多挑战&#xff0c;包括训练资源的高效利用、模型训练的稳定性和国产化适配需求。腾讯云TI平台凭借其强大…

智能网络构建:探索大模型在网络领域的应用

网络领域以其高度复杂性和快速迭代为特点&#xff0c;完成从网络设计、配置、诊断到安全的网络任务需要广泛的专业知识。这些任务的固有复杂性&#xff0c;加上网络技术和协议不断变化的格局&#xff0c;为传统基于机器学习的方法带来了显著的障碍。这些方法在泛化和自动化网络…

已训练好模型如何测试自己数据

1、前言 上一篇博客详细介绍了利用MNIST数据集训练模型,得到了训练参数,那么如何将这训练好的模型,用于训练自己的数据呢?本博客详细介绍,如何利用上篇博客训练好的模型参数,来预测自己的数据集。 2、测试数据 2.1 数据准备 在测试自己数据前,确保你的数据格式与训练时…

【linux/shell案例实战】解决Linux和Windows的换行符CRLF和LF问题

目录 一.什么是Linux 和 Windows 的换行符 CRLF 和 LF 二.使用Linux 中命令 dos2unix 和 unix2dos 实现CRLF 和LF的转换 三.使用 windows 中的代码编辑器实现 CRLF 和 LF 的转换&#xff08;Notepad&#xff09; 一.什么是Linux 和 Windows 的换行符 CRLF 和 LF CR是Carria…

EDA 虚拟机 Synopsys Sentaurus TCAD 2018.06-SP2 CentOS7.9

下载地址&#xff08;制作不易&#xff0c;下载使用需付费&#xff0c;不能接受的请勿下载&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1358rH_Ner1TYdc_TgoXrew?pwdyq3p 提取码&#xff1a;yq3p

瑞文标准IQ智商测验题其中三项

最近在网上看到想尝试一下&#xff0c;看到这三个题目感觉挺有意识&#xff01;&#xff01;&#xff01;
最新文章