cuda2D FDTD——share

news2024/11/15 11:31:00

在这里插入图片描述

https://www.coder.work/article/30133

shared memory只能在block内共享,之间无法互相通信

对于2D TM波动方程计算,我们可以使用以下策略来处理共享内存的边界:

将全局内存中的数据复制到共享内存中时,除了将每个线程需要的数据复制到共享内存中之外,还需要将共享内存中的边界区域额外复制一些数据,使得每个线程都可以访问到它所需要的边界数据。

在每个线程访问共享内存中的数据时,需要注意边界情况。对于位于共享内存边界的线程,需要从全局内存中读取数据,而不是从共享内存中读取。

为了保证线程之间的通信正确,需要使用 __syncthreads() 函数进行同步。在每个线程读取共享内存中的数据之前,需要先等待其他线程将它们所需要的数据复制到共享内存中。

总体来说,处理共享内存边界需要在程序中额外考虑一些边界情况,并且需要使用同步函数来保证线程之间的通信正确。

#define BLOCK_SIZE_X 32
#define BLOCK_SIZE_Y 32
#define HALO_SIZE 1 // 外壳大小

__global__ void calcEz(float* ezf, float* ezfm1, float* hxfm1, float* hyfm1, int width, int height, int t, float dl, float dt, float a, float b)
{
    int tx = threadIdx.x;
    int ty = threadIdx.y;
    int thx = blockIdx.x * blockDim.x + tx;
    int thy = blockIdx.y * blockDim.y + ty;

    // 计算当前线程处理的单元格的索引
    int idx = thy * width + thx;

    // 使用共享内存
    __shared__ float hx[BLOCK_SIZE_X + HALO_SIZE * 2][BLOCK_SIZE_Y + HALO_SIZE * 2];
    __shared__ float hy[BLOCK_SIZE_X + HALO_SIZE * 2][BLOCK_SIZE_Y + HALO_SIZE * 2];

    // 将数据从全局内存拷贝到共享内存中
    hx[tx + HALO_SIZE][ty + HALO_SIZE] = hxfm1[idx];
    hy[tx + HALO_SIZE][ty + HALO_SIZE] = hyfm1[idx];

    // 处理共享内存的边界
    if (tx < HALO_SIZE) {
        hx[tx][ty + HALO_SIZE] = hxfm1[idx - HALO_SIZE];
        hy[tx][ty + HALO_SIZE] = hyfm1[idx - HALO_SIZE];
    }
    if (ty < HALO_SIZE) {
        hx[tx + HALO_SIZE][ty] = hxfm1[idx - HALO_SIZE * width];
        hy[tx + HALO_SIZE][ty] = hyfm1[idx - HALO_SIZE * width];
    }
    if (tx >= BLOCK_SIZE_X - HALO_SIZE) {
        hx[tx + HALO_SIZE * 2][ty + HALO_SIZE] = hxfm1[idx + HALO_SIZE];
        hy[tx + HALO_SIZE * 2][ty + HALO_SIZE] = hyfm1[idx + HALO_SIZE];
    }
    if (ty >= BLOCK_SIZE_Y - HALO_SIZE) {
        hx[tx + HALO_SIZE][ty + HALO_SIZE * 2] = hxfm1[idx + HALO_SIZE * width];
        hy[tx + HALO_SIZE][ty + HALO_SIZE * 2] = hyfm1[idx + HALO_SIZE * width];
    }

    __syncthreads();

    // 计算Ez
    if (thx >= HALO_SIZE && thy >= HALO_SIZE && thx < width - HALO_SIZE && thy < height - HALO_SIZE) {
        if (thx == s_x && thy == s_y) {
            // Source
            float frq = 1.5e13;
            ezf[idx] = sin(t * dt * 2 * PI * frq);
        } else {
            // Recursion
            ezf[idx] = a * ezfm1[idx] + b * ((hy[tx + HALO_SIZE][ty + HALO_SIZE] - hy[tx + HALO_SIZE - 1][ty + HALO_SIZE]) / dl
                - (hx[tx + HALO_SIZE][ty +

在这个例子中,我们假设要对一个大小为1024x1024的二维数组进行FDTD TM模拟,使用一个大小为32x32的二维共享内存来存储每个块所需要处理的Ez场量数据。我们需要在kernel函数内部计算出当前线程所处理的元素在全局内存中的索引,并将其复制到共享内存中。
在计算Ez场量的更新值时,我们需要访问周围的Hx场量和Hy场量数据,这些数据在共享内存中并不一定存在,因此需要从全局内存中重新读取。由于这里每个线程只需要读取一次,因此对全局内存的访问不会带来太大的性能开销。
最后,我们将计算得到的Ez场量更新值写回到全局内存中

在这个CUDA kernel中,每个线程块都在处理矩形区域内的一部分计算任务。线程块内使用共享内存来共享数据,以避免在计算任务之间频繁地访问全局内存。在共享内存中,线程块需要存储其负责计算区域周围一圈的值,以便能够处理边界处的计算。为了实现这一点,代码复制了最外围一圈的值(也称为“halo”值),并将其存储在共享内存中的适当位置。

在 if (tx == 0 && thx != 0) 语句中,如果线程是该线程块内第一列的线程,但它不是该计算区域的最左边的一列,那么它需要访问其相邻线程块中的值。为此,代码复制了该线程块周围一圈中相邻线程块的值,并将其存储在共享内存中的适当位置(即 hy[0][ty+1])。

同样的,如果线程是该线程块内第一行的线程,但它不是该计算区域的最上面一行,那么它需要访问其相邻线程块中的值。为此,代码复制了该线程块周围一圈中相邻线程块的值,并将其存储在共享内存中的适当位置(即 hx[tx+1][0])。

通过这种方式,线程块内的所有线程都可以访问其计算区域周围一圈的值,无论它们在该线程块内的位置如何。这有助于确保算法正确处理边界情况。

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

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

相关文章

Python爬虫实践:优志愿 院校列表

https://www.youzy.cn/tzy/search/colleges/collegeList获取目标网址等信息打开开发人员工具&#xff08;F12&#xff09;&#xff0c;拿到调用接口的地址&#xff0c;以及接口请求参数等信息&#xff0c;如下curl https://uwf7de983aad7a717eb.youzy.cn/youzy.dms.basiclib.ap…

假如你知道这样的MySQL性能优化

1. 为查询缓存优化你的查询 大多数的 MySQL 服务器都开启了查询缓存。这是提高性最有效的方法之 一&#xff0c;而且这是被 MySQL 的数据库引擎处理的。当有很多相同的查询被执行了多次的时候&#xff0c;这些查询结果会被放到一个缓存中&#xff0c;这样&#xff0c;后续的相同…

Kogito -- 入门详解

Kogito -- 入门详解1. Introduction1.1 Version1.2 Introduction2.Environment Install2.1 JDK Install2.2 Maven Install&#xff08;3.8.6&#xff09;2.3 Idea2.4 VSCode3. Run Code3.1 Dependency3.2 Run3.3 Swagger4.Awakening4.1 Big Data -- Postgres5.Awakening5.1 Big…

如何做一个高级的文本编辑器 textarea,拥有快捷键操作

如何做一个高级的文本编辑器 textarea&#xff0c;拥有快捷键操作 最近想做一个高级点的 textarea &#xff0c;支持 JetBrains 系列软件的快捷键&#xff0c;比如&#xff1a; CTRL D 复制当前行。Tab 在前面插入 4 个空格。Shift Tab 删除行前的空格&#xff0c;多于4个&a…

google独立站和与企业官网的区别是什么?

google独立站和与企业官网的区别是什么&#xff1f; 答案是&#xff1a;独立站通过谷歌SEO优化可以更好的获取自然排名的流量。 随着互联网的不断发展&#xff0c;企业越来越重视自身网站的建设和优化&#xff0c;而在企业网站建设中&#xff0c;很多人会犯一个常见的错误&am…

模块、包和异常

目录1.模块import 导入from...import 导入2. 模块的搜索顺序3. __name__属性的使用4. 包包的使用步骤5. 发布模块6. 安装模块7. 卸载模块8. pip 安装第三方模块9. 异常处理异常捕获异常的传递抛出 raise 异常1.模块 模块是 Python 程序架构的一个核心概念 每一个以扩展名 py …

LPDDR4x 的 学习总结(4) - SDRAM chip的组织结构

上节总结cell的结构和基本操作 本节基于cell组合起来的DRAM组织结构 DDR Device 的组织结构 Cells 以特定的方式组成 Column/Row/Bank/Chip/Rank/DIMM/Channel等多层级组织结构如下图&#xff1a; 图1 - DRAM的组织结构 图2 - DRAM容量的组织结构图 Channel: 同1个DDR控制器 …

GIT基础常用命令-1 GIT基础篇

git基础常用命令-1 GIT基础篇1.git简介及配置1.1 git简介1.2 git配置config1.2.1 查看配置git config1.2.2 配置设置1.2.3 获取帮助git help2 GIT基础常用命令2.1 获取镜像仓库2.1.1 git init2.1.2 git clone2.2 本地仓库常用命令2.2.1 git status2.2.2 git add2.2.3 git diff2…

seata1.5.2使用从零快速上手(提供代码与安装包)

1.软件准备&#xff1a; 1.1 seata1.5.2 官网下载&#xff1a;地址:http://seata.io/zh-cn/ server源码:https://github.com/seata/seata 百度云下载&#xff08;建议&#xff09;: 百度下载 链接&#xff1a;https://pan.baidu.com/s/1eilbSI0YdmupHYI7FroTsw 提取码&…

【编程基础之Python】10、Python中的运算符

【编程基础之Python】10、Python中的运算符Python中的运算符算术运算符赋值运算符比较运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级运算符总结Python中的运算符 Python是一门非常流行的编程语言&#xff0c;它支持各种运算符来执行各种操作。这篇文章将详细介绍…

构造有向无环图(拓扑排序)

蓝桥杯集训每日一题 acwing3696 给定一个由 n 个点和 m 条边构成的图。 不保证给定的图是连通的。 图中的一部分边的方向已经确定&#xff0c;你不能改变它们的方向。 剩下的边还未确定方向&#xff0c;你需要为每一条还未确定方向的边指定方向。 你需要保证在确定所有边的…

独家揭秘:站外引流的十大技巧!

在今天的互联网时代&#xff0c;如何有效地引流已成为网站运营者面临的一个重要问题。 站外引流是指通过在其他网站或平台上建立链接或发布内容&#xff0c;将流量引导到自己的网站&#xff0c;提高自己网站的访问量。 本文将为大家揭秘站外引流的十大技巧&#xff0c;帮助大…

python项目搭建(上)

提示&#xff1a;惊觉相思不露&#xff0c;原来只因已入骨 文章目录前言软件的安装HTTP协议1.安装Django启动Django路由子表定义数据库创建数据库表过滤条件生成HTML前言 这里是用python搭建的一个**销售管理系统&#xff0c;用于记录个人遇到的一些错误 提示&#xff1a;以下…

软测入门(七)python操作数据文件(Json、yaml、csv、excel、xml)

python操作文件 txt文件 read() : 读取所有readline() : 读取一行readlines() : 读取所有&#xff0c;且以行为单位&#xff0c;放入list列表中 file open(r"F:\abc.txt", "r", encoding"utf-8") # 以utf-8格式读取文件 # 读取所有 # print…

IM即时通讯开发之常用加解密算法与通讯安全讲解

平时开发工作中&#xff0c;我们会经常接触加密、解密的技术。尤其在今天移动互联网时代&#xff0c;越来越多的用户会将数据存储在云端&#xff0c;或使用在线的服务处理信息。这些数据有些涉及用户的隐私&#xff0c;有些涉及用户的财产&#xff0c;要是没有一套的方案来解决…

儿童写作业的台灯怎么选择?2023给孩子买台灯最新推荐一下

儿童年龄比较小&#xff0c;所以眼睛也比较脆弱&#xff0c;然而现在的社会普遍节奏较快&#xff0c;无论是上班族&#xff0c;还是大中小学生&#xff0c;压力都比较大&#xff0c;儿童经常晚上看书、写字学习&#xff0c;眼睛难免劳累&#xff0c;所以儿童台灯最重要的就是柔…

CDGA|给金融科技数据治理的四大建议,从根基上解决问题

随着我国金融科技行业的发展&#xff0c;当前的数据治理水平已无法满足金融反哺实体经济发展的效率需要。 目前主要存在数据基础设施不完善导致的治理根基薄弱核心问题&#xff0c;建议从以下四个方面进行完善数据基础设施&#xff0c;构筑金融科技数据治理体系。 加强顶层设计…

Springboot整合RabbitMQ并使用

1、Springboot整合RabbitMQ 1、引入场景启动器 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>引入AMQP场景启动器之后&#xff0c;RabbitAutoConfiguratio…

变电站应用监控系统6大优势,你知道几个?

变电站是改变电压、控制和分配电能的场所&#xff0c;发展方向是自动化、数字化、网络化、智能化。 泛地缘科技针对电力行业用户的使用特点&#xff0c;利用电网现有的网络资源&#xff0c;推出集动力监控、环境监理、门禁系统、消防系统、视频监控于一身的物联网云盒监控系统。…

05-思维导图Xmind快速入门

文章目录5.1 认识思维导图5.2 Xmind的主要结构及主题元素5.2.1 Xmind的多种结构5.2.2 主题分类5.2.3 Xmind的主题元素章节总结5.1 认识思维导图 什么是思维导图&#xff1f; 思维导图是一种将思维进行可视化的实用工具。 具体实现方法是用一个关键词去引发相关想法&#xff0…