矩阵乘法的并行算法优化

伪代码:

  1. for (i = 0; i < M; ++i){  
  2.     for (j = 0; j < P; ++j){  
  3.         C[i][j] = 0;  
  4.         for (k = 0; k < N; ++k){  
  5.             C[i][j] += A[i][k] * B[k][j];  
  6.         }  
  7.     }  
  8. }  
时间复杂度为O(M*N*P)。
      (1). 多线程 
  1. #prama omp parallel for num_threads(CORE_NUM)  
  2.  (2)
  3. C矩阵的大小为M * P,我们可以将C的计算下平均分配到每个核心上,即每个核分配ceil(M*P/CORE_NUM)个计算任何,即将上面的第一和第二层并行化。

    首先将C转换成一维的数组T[M*P] , 则C[i][j] = T[i * M + j], 反过来T[z] = C[z/M] [ z %P]。

    故进一步的并行算法为:

    1. #prama omp parallel for num_threads(NUM)  
    2. for (z = 0; z < M * P; ++z){  
    3.         i = z / P;  
    4.         j = z % P;  
    5.         C[i][j] = 0;  
    6.         for (k = 0; k < N; ++k){  
    7.             C[i][j] += A[i][k] * B[k][j];  
    8.     }  
    9. }

    (3)最里面一层的计算

    1. for (k = 0; k < N; ++k){  
    2.     C[i][j] += A[i][k] * B[k][j];  
    由于内存中二维数组是以行优先进行存储的,因此B[k][j]存在严重的cache命中率问题,解决这个问题的方法是也将B进行一次沿对角线进行翻转,使得最里面的计算变成

    1. for (k = 0; k < N; ++k){  
    2.     C[i][j] += A[i][k] * B[j][k];  

    另外一点需要注意的就是C[i][j] += A[i][k] * B[j][k];计算时的伪共享问题。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值