矩阵乘法的优化

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

>才智

/207

分析方法,分别a/b、c/a、t/a、d/l、h/a 对最大翘曲应力精确度的影响。限于文章篇幅有限,本文仅讨论h/a 对求最大翘曲应力精度的的影响。h/a 的变化情况可以直接反映连梁的数量以及杆件有效高度Z 的变化情况。

取a/b=1.30,c/a=0.30,t/a=0.06,并固定三者数值不变。然后分别取h/a=0.60、1.0、1.50、2.0、3.0。即截面尺寸为:a=10.0cm,b=8.0cm,c=2.50cm,壁厚t=0.50cm,杆件材料的弹性模量E=2.50×105N/cm2,泊松比V= V=0.1667,杆件顶端所受到的几种扭矩大小M=2010N.cm。对其最大翘曲应力进行计算,其中有限元计算结果同理论解的比较见表2。

表2有限元解同理论解的比较结果

从表2中可以看出,当h/a 的取值越小时,本文采用的连续法所得到的结果越接近理论值,随着h/a 比值的逐渐增大,有限元解同理论解之间的相对误差逐渐增大。

2 结语

本文以高层建筑筒体结构约束扭转为研究对象,较为详细的分析了连梁对开口薄壁筒体约束扭转的影响,最后,探讨了连续化方法求最大翘曲应力时对精确度的影响关系。希望本文的提出能起到抛砖引玉的作用,其他研究人员继续这方面的研究,为取得更大的研究成果而不懈努力。

参考文献:

[1] 往荫长. 高层建筑筒体结构的计算,科学出版社,1988.

[2] 鲍永方. 薄壁结构的约束扭转分析[D]. 北京农业工程大学学报,北京,1996.

矩阵乘法的优化

谢林川 武警警官学院电子技术系 610041

在科学与工程计算的许多问题中经常需要进行矩阵计算。矩阵乘、求解线性方程组和矩阵特征值问题是矩阵计算最基本的内核。许多先进的计算机上都配有高效的串行程序库。为了在并行计算环境上实现矩阵乘积,研究并行算法是非常必要的。本文主要讲述了如何在多核处理器上对矩阵乘法进行优化。

1. 矩阵乘法串行算法

矩阵乘法在实现上比较简单,可以通过3层循环得到。例如我们求C=Beta*C+Alpha*A*B,其中A,B,C,Alpha,Beta 都是双精度浮点数据。串行算法的实现原理是:矩阵A 中的一行和矩阵B 中的一列对应元素进行乘加得到矩阵C 中的对应元素。假设A 是一个m*k 的矩阵,B 是一个k*n 矩阵,因此C 是一个m*n 矩阵,我们可以得到串行算法程序如下:

for i=1, m for j=1, n

C(i,j)=C(i,j)*Beta for L=1, k

C(i,j)= C(i,j)+Alpha*A(i,L)*B(L,j) endfor endfor endfor

2.矩阵乘法分块算法

上面我们对矩阵乘法的串行算法做了分析,我们在计算矩阵C 的每一个数据时,都要用到矩阵A 的某行和矩阵B 的某列的数据,在实际计算过程中,A、B 的元素是存放在内存中的,所以为了提高计算速度,我们把存放在内存中的矩阵A、B 的元素调入Cache 中,这样寄存器可以首先寻访Cache,如果没有需要的数据才会访问内存。但是矩阵A、B 在实际应用中都包含大量的元素,数据量非常庞大,而处理器的Cache 往往很小,因此不可能将整个矩阵全部放入Cache。因此我们需要把这些大的矩阵按照某种方法进行分块,使得分块后的小矩阵可以放入Cache。但是分块不是随意分,有一定的分块原则,如果分块子矩阵太大,造成子矩阵不能放入Cache;如果分块子矩阵太小,那么为了计算一个大矩阵的数据,需要调入Cache 的子矩阵的次数会增多,会大大加剧处理器的负荷。因此,如何对矩阵进行分块,既能使得每次参与计算的矩阵块都能放入Cache,也不存在多次从内存中拷贝矩阵块到Cache 中增加处理器的负载,也是本文需要分析的地方。同样假设A 是一个m*k 的矩阵,B 是一个k*n 矩阵,因此C 是一个m*n 矩阵,矩阵A 的分块大小为m*k,矩阵B 的分块大小为k*n,下面是分块算法:

for i=1, m ,M for j=1,n,N for p=I,min(i+M,m) for q=j,min(j+N,n) C(p,q)=C(p,q)*Beta Endfor endfor

for L=1,k,K

for p=i,min(i+M,m) for q=j,min(j+N,n) for r=l,min(L+K,k)

C(p,q)=C(p,q)+Alpha*A(p,r)*B(r,q) endfor endfor endfor endfor 3.分层技术

因为处理器L1cache 和L2cache 到寄存器的带宽大致相同,L2cacahe 的大小明显大于L1cache,这样能够存放更多的数据,基于这种情况,提出把分块A 存放在L2cache 中,使得B 矩阵的运算访存比得到了提高。此外,对矩阵乘法划分方法进行了总结,通过分析得出:对矩阵A 和B 都进行划分,得到的性能是最优的。可以对 GEBP 算法的实现做了进一步的优化:在寄存器中预取A 和B,隐藏访存时间;增大分块参数kc,降低读写 C 子矩阵的平均开销;把 A 分块存放在L2cache 中,增大A 分块的参数,提高矩阵的运算访存比。

4.对矩阵乘法进行多线程(OPENMP)优化

在进行矩阵乘法的运算时候,考虑到在实际的工作中,矩阵都是相当大的,这就需要我们对矩阵进行分块,每个线程执行块A 和块B 的乘加运算。多核处理器一般又多个线程,这样就可以同时在多个线程中进行并行运算,可以大大的提高处理器的运算效率。因此,在实际编程过程中,我们可以采用OPENMP 多线程来对矩阵乘法进行优化。

5.封装技术

矩阵A、B 进行分块后,在存储空间有可能不是连续存放的,这也就意味着对这些不连续的分块进行映射需要更多条目的TLB。解决的方法就是将这些分块存放在连续的数组中,之后计算的数据直接从数组中读取,以保证这些数据的地址可以在TLB 中找到。这样做不会引入额外的开销,因为这些子矩阵被复制以后,其地址就已经保存在了TLB 中,而其数据则保存在cache 中。这样的过程称为Packing。在计算的时候,将矩阵A 、B 分别存放进连续的内存空间 和 中,计算C=C+ 。

相关文档
最新文档