OpenCL 学习step by step (10) 矩阵转置

简介: 本章学习一下在opencl中如何实现矩阵的转置,主要的技巧还是利用好local memory,防止bank conflit以及使得全局memory的读写尽量是合并(coalensing)读写。

      本章学习一下在opencl中如何实现矩阵的转置,主要的技巧还是利用好local memory,防止bank conflit以及使得全局memory的读写尽量是合并(coalensing)读写。

     我们的矩阵是一副二维灰度图像256*256,矩阵的转置也就是图像的转置。每个thread处理16(4*4)个pixel(uchar),workgroup的size是(16,16)。

     下面直接看shader代码:

uint wiWidth  = get_global_size(0);

uint gix_t = get_group_id(0);
uint giy_t = get_group_id(1);   
uint num_of_blocks_x = get_num_groups(0);


uint giy = gix_t;
uint gix = (gix_t+giy_t)%num_of_blocks_x;

uint lix = get_local_id(0);
uint liy = get_local_id(1);

uint blockSize = get_local_size(0);

uint ix = gix*blockSize + lix;
uint iy = giy*blockSize + liy;
int index_in = ix + (iy)*wiWidth*4;


// 通过合并读写把输入数据装入到lds中

int ind = liy*blockSize*4+lix;

block[ind]        = input[index_in];
block[ind+blockSize]    = input[index_in+wiWidth];
block[ind+blockSize*2] = input[index_in+wiWidth*2];
block[ind+blockSize*3] = input[index_in+wiWidth*3];

     因为workgroup size是(16,16),所以lix,liy的取值范围都是0-15,下面我们通过图片看下,lix=0 liy=0,lix=1 liy=0时候,ind,以及index_in的值,从而得到输入图像数据如何映射到local memory中。

lix=0 liy=0

image

lix=1 liy=0

image

      下面是影射关系,(0,0) thread处理的16个pixel用血红色表示,它们映射到lds的0bank和16bank,(1,0)thread处理的像素用绿色表示,它们映射到lds的bank1和bank17,有效的避免了bank conflit,而全局memory的访问不同thread对应连续的全局memory空间,可以实现合并读写,从而提高程序性能。

image

  把转置的数据写到全局memory中的代码如下:

ix = giy*blockSize + lix;
iy = gix*blockSize + liy;
int index_out = ix + (iy)*wiWidth*4;

ind = lix*blockSize*4+liy;
uchar4 v0 = block[ind];
uchar4 v1 = block[ind+blockSize];
uchar4 v2 = block[ind+blockSize*2];
uchar4 v3 = block[ind+blockSize*3];

// 通过合并读写把lds中数据写回到全局memory中
output[index_out]            = (uchar4)(v0.x, v1.x, v2.x, v3.x);
output[index_out+wiWidth]    = (uchar4)(v0.y, v1.y, v2.y, v3.y);
output[index_out+wiWidth*2]    = (uchar4)(v0.z, v1.z, v2.z, v3.z);
output[index_out+wiWidth*3]    = (uchar4)(v0.w, v1.w, v2.w, v3.w);

对应copy关系图如下:

image

完整的代码请参考:

工程文件gclTutorial9

代码下载:

稍后提供

 

相关文章
|
运维 负载均衡 网络协议
linux网络管理(链路聚合、桥接网络、故障排查、常用工具)
网卡的链路聚合就是将多块网卡连接起来,当一块网卡损坏,网络依旧可以正常运行,可以有效的防止因为网卡损坏带来的损失,同时也可以提高网络访问速度。
1926 0
linux网络管理(链路聚合、桥接网络、故障排查、常用工具)
|
小程序 API
uniapp中uview组件库丰富的Calendar 日历用法
uniapp中uview组件库丰富的Calendar 日历用法
2332 0
|
机器学习/深度学习 PyTorch 算法框架/工具
详解三种常用标准化Batch Norm & Layer Norm & RMSNorm
通过本文的介绍,希望您能够深入理解Batch Norm、Layer Norm和RMSNorm的原理和实现,并在实际应用中灵活选择和使用,提升深度学习模型的性能和稳定性。
4719 5
|
机器学习/深度学习 自动驾驶 搜索推荐
大模型技术的端侧部署
【1月更文挑战第14天】大模型技术的端侧部署
1266 4
大模型技术的端侧部署
|
机器学习/深度学习 自然语言处理 算法
[大语言模型-工程实践] 手把手教你-基于BERT模型提取商品标题关键词及优化改进
[大语言模型-工程实践] 手把手教你-基于BERT模型提取商品标题关键词及优化改进
|
机器学习/深度学习 人工智能 算法
【机器学习】十大算法之一 “线性回归”
机器学习是人工智能的一个重要分支,它利用各种算法和模型,通过分析和理解数据,让机器学习到一个智能模型,从而对数据作出预测和判断。回归分析是一种基于统计学方法的数学分析技术,用于描述两个或多个变量之间的关系。线性回归是一种最简单的回归分析方法,它使用最小二乘法来拟合一个关于自变量的线性函数,以预测其与因变量之间的相互作用关系。线性回归是机器学习领域中最为常见的算法之一,它是一个简单但非常有效的算法,常用于数据挖掘和机器学习的预测分析,例如房价预测、销售额预测等等。
1217 0
【机器学习】十大算法之一 “线性回归”
如何优雅的给SpringBoot部署的jar包瘦身?
我们知道Spring Boot项目,是可以通过java -jar 包名 启动的。 那为什么Spring Boot项目可以通过上述命令启动,而其它普通的项目却不可以呢? 原因在于我们在通过以下命令打包时
|
SQL 算法 关系型数据库
Hive中order by,sort by,distribute by和cluster by详解
Hive中order by,sort by,distribute by和cluster by详解
2046 0
|
9天前
|
存储 弹性计算 缓存
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
本文更新了2026年阿里云全系列云服务器租赁活动报价,所有特惠资源均可前往阿里云活动中心选购,整体覆盖从个人入门到企业级高性能场景的全梯度需求。其中轻量应用服务器主打极致性价比,2核2G峰值200M带宽配置每日10点、15点限时抢购价仅38元/年,2核4G配置379元/年起;高性价比的经济型e实例、通用算力型u2i实例覆盖2核4G至4核32G全档位,适配开发测试与中小型企业业务;搭载英特尔至强6处理器的第九代c9i企业级实例算力较上代提升20%,支撑高并发生产环境,不同实例规格价差清晰,用户可根据自身业务负载与预算灵活选型。
1912 119
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考