cuda2D FDTD——share
创始人
2024-05-29 07:48:50
0

在这里插入图片描述

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();// 计算Ezif (thx >= HALO_SIZE && thy >= HALO_SIZE && thx < width - HALO_SIZE && thy < height - HALO_SIZE) {if (thx == s_x && thy == s_y) {// Sourcefloat frq = 1.5e13;ezf[idx] = sin(t * dt * 2 * PI * frq);} else {// Recursionezf[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])。

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

相关内容

热门资讯

软件如何兼容安卓8系统,助您软... 你有没有发现,随着科技的飞速发展,手机软件更新换代的速度也是越来越快呢!这不,安卓8系统已经悄然来临...
安卓通用版系统下载,畅享智能生... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是安卓通用版系统下载!这可是个让无数安卓用户兴奋不...
安卓无线点餐系统ph,PH技术... 你有没有想过,点餐也能变得如此轻松愉快?没错,就是那个我们每天都要面对的吃饭问题,现在有了安卓无线点...
安卓门禁系统怎么样,便捷通行新... 你有没有想过,每天回家时,只需轻轻一刷,门就自动打开了?这就是安卓门禁系统的魅力所在!今天,就让我带...
在电脑上模拟安卓系统,探索虚拟... 你有没有想过,在电脑上也能体验安卓系统的乐趣呢?没错,就是那种随时随地都能玩手机的感觉,现在也能在电...
飞机送餐安卓系统,空中美食新体... 你有没有想过,飞机上的美食是如何送到你手中的?是不是觉得这背后有着神秘的力量?其实,这一切都离不开高...
findx耍原生安卓系统,深度... 亲爱的读者们,你是否厌倦了那些花里胡哨的定制系统,渴望回到那个纯净的安卓世界?今天,我要带你一起探索...
一加系统属于安卓系统吗,引领智... 你有没有想过,手机里的那个神奇的“一加系统”到底是不是安卓系统的一员呢?这可是个让人好奇不已的问题哦...
小米2刷安卓系统吗,探索安卓系... 亲爱的读者,你是否曾经对小米2这款手机刷安卓系统的事情感到好奇呢?今天,就让我带你一探究竟,揭开小米...
安卓7.0系统线刷包,深度解析... 你有没有发现,你的安卓手机最近有点儿“蔫儿”了?别急,别急,今天就来给你揭秘如何让你的安卓手机重焕生...
白菜系统和安卓拍照,开启智能生... 你知道吗?最近我在用手机拍照的时候,发现了一个超级酷的功能,简直让我爱不释手!那就是——白菜系统和安...
安卓系统查杀病毒,全方位守护您... 手机里的安卓系统是不是有时候会突然弹出一个查杀病毒的提示?别慌,这可不是什么大问题,今天就来给你详细...
iso系统与安卓各系统哪个好,... 你有没有想过,手机操作系统就像是我们生活中的不同交通工具,各有各的特色和优势。今天,咱们就来聊聊这个...
中柏怎么换安卓系统,解锁更多可... 你有没有发现,中柏的安卓系统有时候用起来还挺不顺手的?别急,今天就来手把手教你如何给中柏手机升级安卓...
安卓热点绕过系统验证,揭秘操作... 你是不是也遇到过这种情况?手机里的安卓热点突然不灵光了,系统验证总是跳出来,让人头疼不已。别急,今天...
安卓系统怎么关闭小艺,安卓系统... 亲爱的安卓用户们,你是否也和我一样,对手机里的小艺助手有些爱恨交加呢?有时候,它贴心得让人感动,有时...
安卓系统计划软件推荐,精选计划... 你有没有发现,手机里的安卓系统越来越智能了?这不,最近我可是挖到了一些超棒的安卓计划软件,它们不仅能...
收钱吧安卓系统插件,便捷支付新... 你有没有发现,现在的生活越来越离不开手机了?手机里装满了各种应用,而今天我要跟你聊聊一个特别实用的工...
鸿蒙系统是否还属于安卓,独立于... 你有没有想过,那个在我们手机上默默无闻的鸿蒙系统,它到底是不是安卓的“亲戚”呢?这个问题,估计不少手...
安卓系统手机用什么钱包,轻松管... 你有没有想过,你的安卓系统手机里装了那么多应用,但最离不开的,可能就是那个小小的钱包了。没错,就是那...