伪代码:
- for (i = 0; i < M; ++i){
- for (j = 0; j < P; ++j){
- C[i][j] = 0;
- for (k = 0; k < N; ++k){
- C[i][j] += A[i][k] * B[k][j];
- }
- }
- }
时间复杂度为O(M*N*P)。
(1). 多线程
- #prama omp parallel for num_threads(CORE_NUM)
- (2)
-
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]。
故进一步的并行算法为:
- #prama omp parallel for num_threads(NUM)
- for (z = 0; z < M * P; ++z){
- i = z / P;
- j = z % P;
- C[i][j] = 0;
- for (k = 0; k < N; ++k){
- C[i][j] += A[i][k] * B[k][j];
- }
- }
(3)最里面一层的计算
- for (k = 0; k < N; ++k){
- C[i][j] += A[i][k] * B[k][j];
- for (k = 0; k < N; ++k){
- C[i][j] += A[i][k] * B[j][k];
另外一点需要注意的就是C[i][j] += A[i][k] * B[j][k];计算时的伪共享问题。