Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void matrix_mult_matrix_5(double * a, double * b, double * c, int n) {
- int bm, bi, nbm, nbi;
- int l, nl;
- int i, j, m;
- double * pa, * pb, * pc;
- double s00, s01, s10, s11;
- for (bm = 0; bm < n; bm += N) {
- nbm = (bm + N <= n ? bm + N : n);
- for (bi = 0; bi < n; bi += N) {
- nbi = (bi + N <= n ? bi + N : n); /* Вычислить результирующий блок матрицы cс верхним левым углом (bi, bm)и правым нижним (nbi-1, nbm-1) */ /* Вычисляем как произведения блоков матрицaиb*/
- for (m = bm, pc = c + bm; m < nbm; m++, pc++)
- for (i = bi; i < nbi; i++) pc[i * n] = 0.;
- for (l = 0; l < n; l += N) {
- 2.7.Использование параллелизма процессора53nl = (l + N <= n ? l + N : n); /* Вычисляем произведениеблока матрицы a [(bi,l) x (nbi-1,nl-1)]на блок матрицы b [(l,bm)x(nl-1,nbm-1)]и прибавляем к блокуматрицы c [(bi,bm) x (nbi-1,nbm-1)] */
- for (m = bm, pc = c + bm; m < nbm; m += 2, pc += 2)
- for (i = bi, pb = b + m; i < nbi; i += 2) {
- pa = a + l + i * n;
- s00 = s01 = s10 = s11 = 0.;
- for (j = l; j < nl; j++, pa++) {
- /* элемент (i, m) */
- s00 += pa[0] * pb[j * n]; /* элемент (i, m + 1) */
- s01 += pa[0] * pb[j * n + 1]; /* элемент (i + 1, m) */
- s10 += pa[n] * pb[j * n]; /* элемент (i + 1, m + 1) */
- s11 += pa[n] * pb[j * n + 1];
- }
- pc[i * n] += s00;
- pc[i * n + 1] += s01;
- pc[(i + 1) * n] += s10;
- pc[(i + 1) * n + 1] += s11;
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement