HDU4920 Matrix multiplication(CPU cache가 프로그램에 미치는 영향)

2429 단어
Problem Description
Given two matrices A and B of size n×n, find the product of them.
bobo hates big integers. So you are only asked to find the result modulo 3.
 
Input
The input consists of several tests. For each tests:
The first line contains n (1≤n≤800). Each of the following n lines contain n integers -- the description of the matrix A. The j-th integer in the i-th line equals A
ij. The next n lines describe the matrix B in similar format (0≤A
ij,B
ij≤10
9).
 
Output
For each tests:
Print n lines. Each of them contain n integers -- the matrix A×B in similar format.
 
Sample Input

   
   
   
   
1 0 1 2 0 1 2 3 4 5 6 7

 
Sample Output

   
   
   
   
0 0 1 2 1

고전적인 행렬 곱셈은 3층 순환(최내층 순환)이 k에 대한 순환이기 때문에 b[k][j]는 b에 대한 열을 따라 접근한다.우리는 메모리에서 2차원 그룹이 행위 단위로 연속적으로 저장되는 것을 알고 있으며, 열별로 방문하면 매번 1000*4 (bytes) 를 뛴다.cpu cache의 교체 정책에 따라 대량의 cache가 효력을 상실할 것입니다.
그래서 square2.cpp는 j 순환과 k 순환을 위치를 교환합니다. 이렇게 하면 보장합니다.
c[i][j] += a[i][k] * b[k][j];
이 문장은 메모리에 대한 접근이 연속적이며cache의 명중률을 증가시켜 프로그램의 실행 속도를 크게 향상시켰다.
구체적인 예:http://blog.csdn.net/a775700879/article/details/11750703
코드는 다음과 같습니다.
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 810;

int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];

int n;

int main()
{
    while(~scanf("%d",&n)){
        int i,j,k;
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                scanf("%d",&a[i][j]);
                a[i][j]%=3;
                c[i][j]=0;
            }
        }
        for(i=0;i<n;i++)
            for(int j=0;j<n;j++){
                scanf("%d",&b[i][j]);
                b[i][j]%=3;
            }
        for(i=0;i<n;i++)
            for(k=0;k<n;k++)
                for(j=0;j<n;j++)
                    c[i][j]=c[i][j]+a[i][k]*b[k][j];
        for(i=0;i<n;i++){
            for(j=0;j<n-1;j++)
                printf("%d ",c[i][j]%3);
            printf("%d
",c[i][n-1]%3); } } return 0; }

좋은 웹페이지 즐겨찾기