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

代码下载:

稍后提供

 

相关文章
|
4月前
|
机器学习/深度学习 JavaScript 算法
GAN Step By Step -- Step7 WGAN
GAN Step By Step -- Step7 WGAN
GAN Step By Step -- Step7 WGAN
|
4月前
|
机器学习/深度学习 算法 定位技术
神经网络epoch、batch、batch size、step与iteration的具体含义介绍
神经网络epoch、batch、batch size、step与iteration的具体含义介绍
281 1
|
机器学习/深度学习 编解码 计算机视觉
GAN Step By Step -- Step5 ACGAN
GAN Step By Step -- Step5 ACGAN
GAN Step By Step -- Step5 ACGAN
|
PyTorch 算法框架/工具
Pytorch疑难小实验:Torch.max() Torch.min()在不同维度上的解释
Pytorch疑难小实验:Torch.max() Torch.min()在不同维度上的解释
151 0
|
机器学习/深度学习
GAN Step By Step -- Step4 CGAN
GAN Step By Step -- Step4 CGAN
GAN Step By Step -- Step4 CGAN
|
机器学习/深度学习 数据挖掘 PyTorch
GAN Step By Step -- Step3 DCGAN
GAN Step By Step -- Step3 DCGAN
GAN Step By Step -- Step3 DCGAN
|
机器学习/深度学习
GAN Step By Step -- Step6 LSGAN
GAN Step By Step -- Step6 LSGAN
GAN Step By Step -- Step6 LSGAN
|
TensorFlow 算法框架/工具
[TensorFlow笔记乱锅炖] tf.multinomial(logits, num_samples)使用方法
tf.multinomial(logits, num_samples) 第一个参数logits可以是一个数组,每个元素的值表示对应index的选择概率。假设logits有两个元素,即[0.6,0.4],这表示的意思是取 0 的概率是0.6, 取 1 的概率是0.4。
3716 0
|
TensorFlow 算法框架/工具 索引
[转载]Tensorflow 的reduce_sum()函数的axis,keep_dim这些参数到底是什么意思?
转载链接:https://www.zhihu.com/question/51325408/answer/125426642来源:知乎 这个问题无外乎有三个难点: 什么是sum 什么是reduce 什么是维度(indices, 现在均改为了axis和numpy等包一致) sum很简单,就是求和,那么问题就是2和3,让我们慢慢来讲。
1540 0
|
算法
关于CS231N-Assignment1-KNN中no-loop矩阵乘法代码的讲解
在使用无循环的算法进行计算距离的效率是很高的 可以看到No loop算法使用的时间远远小于之前两种算法 Two loop version took 56.
1278 0