矩阵转置
――众核计算与并行程序设计作业报告
本次大作业,我们选择的题目是矩阵转置,并且最终完成了两个程序一一二维矩阵转置和五维矩阵 转置,两个程序我们都尽我们所能进行了优化,下面对两个程序的优化方法即优化效果进行分析。
二维矩阵转置的提高,说明还另有更
邑致命的因素限制着程序的速度。
4、优化 partition camping
一次同时访问global mem or y, GPU对各个分区的访问越平均越好,一个分区的宽度是64个 floats,而我每一个block的处理的数据宽度是16或32个floats,在数据的横向读取过程中对各个分 区的访问是平均的。但是在数据写入的过程中,block是纵向地写入数据的,这便会导致多个block只 在某一个分区中疯狂的写数据,也便违背了平均使用分区的原则。(如下图所示)
idata odata
解决这个问题的方法便是,沿横向方向,把block访问的存储空间对角化,如下图。这样每一个同 一时刻运行的block在读写时对global memory的各个分区都会进行平均的访问。(如下图所示)
程序主要修改代码:
un sig ned int blockldx_y = ;
un sig ned int blockldx_x = + % gr ;
〃并把原来 kernel 中的所有 和 分别换成 blockldx_y 和 blockldx_x。
程序运行情况:
数据规模
Kernel运行时间
存储带宽
1024 * 1024
2048 * 2048
4096 * 4096
8192 * 8192
这一下,程序效率提升的幅度可不小了,但是离目标还有一定的距
巨离。
5、优化 block size
前面的程序,我每一个线程都只转一个元素,每一次转一个元素,都要重新计算坐标,而若一个线 程能转有规律的多个元素,则就可以每次充分利用这个计算出来的坐标,但是线程的减少又可能导致程 序并行度降低,从而减慢程序运行速度,所以要在这两个之间达到一个平衡。经我测试每个block有 32*8,每一个线程转四个元素,可以达到最佳状态。
程序主要修改代码:
程序开头添加
#defi ne BLOCK_DIM 32
#defi ne BLOCK_ROWS 8
kernel中添力口
for (int i = 0; i < BLOCK_DIM; i += BLOCK_ROWS)
to_M[out + i * r esult_pitch] = sha reM[th ][th + i]; 主机代码中修改
dim3 thr eadsPe rBlock(BLOCK_DIM ,BLOCK_ROWS);
程序运行情况:
数据规模
Kernel运行时间
存储带宽
1024 * 1024
204
众核程序设计 来自淘豆网m.daumloan.com转载请标明出处.