1.GPU编程9:共享内存3→线程同步和数据布局
2.基于 VUE3 可视化低代码表单设计器
GPU编程9:共享内存3→线程同步和数据布局
并行线程间的栅栏栅栏同步是所有并行计算语言的重要机制,确保数据一致性与程序顺序执行。源码共享内存可以同时被线程块中的实现多个线程访问,当不同步的代码多个线程修改同一个共享内存地址时,将导致线程内的栅栏栅栏冲突。CUDA提供障碍(barrier)和内存栅栏(memory fences)来实现块内同步。源码收源码时代
在弱排序内存模型下,实现GPU线程在不同内存写入数据的代码顺序不一定和这些数据在源码中的顺序相同,且一个线程的栅栏栅栏写入顺序对其他线程可见时,可能与写操作被执行的源码实际顺序不一致。为了显式地强制程序确切顺序执行,实现必须在代码中插入内存栅栏和障碍。代码
同步方法包括显式障碍和内存栅栏。栅栏栅栏收盘买源码显式障碍只能在同一线程块的源码线程间执行,通过调用void __syncthreads()函数来指定一个barrier点。实现__syncthreads作为barrier点要求块中的线程必须等待直到所有线程都到达该点。内存栅栏功能可确保栅栏前的任何内存写操作,对栅栏后的其他线程都是可见的,包括块、网格或系统级的内存栅栏。
Volatile修饰符用于防止编译器优化,避免数据在寄存器或本地内存中被缓存。GPU全局内存常驻在设备内存(DRAM),访问粒度可以是个字节或个字节,共享内存的星空解析源码访问粒度为4字节或8字节存储体宽。
数据布局通过选择共享内存的形状和访问方式来优化全局内存加载。方形共享内存块可以通过相邻线程访问邻近元素来优化,最佳实现方式是按行主序写、按行主序读。对于行列不等长的矩阵转置,可以使用共享内存进行并行归约或展开并行归约,以减少全局内存的访问。
通过全局内存进行矩阵转置时,读取行、存储列或读取列、存储行都会有一次读写的交叉访问。使用共享内存作为中转可以提高效率,公司源码坐牢因为共享内存相比全局内存有更好的带宽。共享内存中的交叉访问效率也高于全局内存。
性能上下限在不同硬件下表现可能不同,具体原因尚不明确。在实际编码中需要注意这个问题。
基于 VUE3 可视化低代码表单设计器
格子表单/GRID-FORM已在Github开源,如能帮到您麻烦给个星点此查看在线文档及演示
楔子
大概4年前,我做了一个简单的动态表单功能,开发人员通过UI界面配置表单(其实就是添加常用的控件,如文本框、下拉框等)就能向用户提供数据查询,反响不错,私卖公司源码尤其是偏后端开发的小伙伴。
时至今日,上述功能存在以下问题:
目前书面上已经有不少优秀开源的同类产品,这里列出可二次开发的,同时具备表单渲染、表单设计的工具(截止至年底)
再造个轮子吧
同类型的开源产品各有千秋,适合不同的应用场景,然而跟我想要的还不够契合。权衡后,还是觉得自己弄一个。技术选型为vue3 + naive UI,使用pnpm进行包管理(monorepo结构)。
不同于同类型产品的组件拖拽,我采用栅栏布局来堆积组件(实现起来简单,省事,暂不支持容器嵌套、子表单),通过设置组件占据的格子数可以使其独占一行,故取名GRID-FORM(栅栏表单),源码详见Github。
表单设计器
得益于VUE的响应式,设计器所见即所得显得尤为丝滑,不然得自己手撸监听配置项变动事件及界面重绘。
编辑器分为左中右三个区域(这是业内约定俗成的标准设计),有别于兄弟产品,我把左区域用作表单整体的参数编辑。为方便用户自定义组件,设计器对外暴露组件库参数,并封装了常用的组件(诸如输入框、单选/多选框、日期选择)。
组件分为数据型(对应上图中的输入组件、选择组件)及展示型(上图的展示组件)两类,后者不参与表单提交。
渲染器组件渲染
每个组件有唯一编号,渲染函数为一个Object(key即为组件编号),需要扩展组件时添加对应的渲染函数即可。渲染时属性分为基本信息(名称我用_开头加以区分)及组件层面两类,分别对应了组件渲染函数的两个参数:attrs、props。
渲染引擎处理完属性后,调用Render函数(不同UI库各自实现,使用者可根据业务需要自行覆写)得到组件实例。此处以文本输入框INPUT为例:
默认值
表单项默认值可以填写常量或占位符(在初始化时被模板引擎赋值),占位符格式为${ code},用户可自行扩展处理函数。
校验
此处校验分为非空、内容格式两种
当表单项勾选是否必填,则在提交前渲染器会对该值进行非空检测;若设置了校验正则,则对非空值进行正则表达式校验。
事件&钩子函数
参数说明
数据联动
常规的做法是输入类表单项增加事件(如onChange、onBlur、onFocus等),但是这样操作(实现)繁琐(困难),我的做法只需要填写一处代码(直观简单)
要启用联动需要满足以下条件:
渲染器初始化后,会对勾选监听值变动的表单项开启监听(没错,是每个表单值有独立的监听)从而获取到新旧值。注意,若在回调函数中对form改动会重新触发onChange事件。
示例
适配更多UI库
目前已实现Naive UI、Vant4的渲染器
我封装了渲染器的基础框架(组合式API),帮助使用者根据需要快速适配心仪的UI库。
结语
因个人能力有限,此工具在设计、实现上存在诸多不足,仅作学习交流。