intel compiler的表现

好久没弄这个东西,今天突然想试下,代码没写完,以后补。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 #include <math.h>
 5 #include <Windows.h>
 6 
 7 #define M      1024
 8 
 9 float matA[M][M];
10 float matB[M][M];
11 float matC[M][M];
12 
13 void InitMatrix( float* matrixX )
14 {
15     register int i;
16     for ( i = 0; i < M * M; i ++ )
17     {
18         *matrixX ++ = ( float )( rand() % 2000 ) / 1000;
19     }
20 }
21 
22 void MulMatrix( float* matrixA, float* matrixB, float* matrixC )
23 {
24     register int i, j, k;
25     register float* p, *q, f;
26     for ( j = 0; j < M; j ++ )
27     {
28         for ( i = 0; i < M; i ++ )
29         {
30             p = matrixA + j * M;
31             q = matrixB + i;
32             f = 0;
33             for ( k = 0; k < M; k ++ )
34             {
35                 f += *p * *q;
36                 p ++;
37                 q += M;
38             }
39 
40             matrixC[j * M + i] = f;
41         }
42     }
43 }
44 
45 int main()
46 {
47     DWORD t;
48     //register int i, j;
49 
50     srand( ( unsigned int )time( NULL ) );
51 
52     InitMatrix( ( float* )matA );
53     InitMatrix( ( float* )matB );
54 
55     t = ::GetTickCount();
56     MulMatrix( ( float* )matA, ( float* )matA, ( float* )matC );
57     t = ::GetTickCount() - t;
58 
59 
60     /*for ( j = 0; j < M; j ++ )
61     {
62         for ( i = 0; i < M; i ++ )
63         {
64             printf( "%.2f ", matC[j][i] );
65         }
66         printf( "
" );
67     }*/
68 
69     printf( "TIME:%d
", t );
70 
71 
72     return 0;
73 }

机器配置E3 1231V3              MEM:16G       VS2010SP1      ICC  2015XE   GTX660  将来把CUDA带来一起测下

1. CPU单线程 仅一个O2

4750ms     大体如此

多线程原来测过,这次代码没加上。 按物理核计算 4核  应该6秒左右  超线程估计会好些。应该能到5秒左右。

2. 单文件转为ICC编译  额外添加优化项/Qipo /Qparallel

2600ms左右

多线程依然没测,以后补

3. CUDA也没测

4.MKL没测。。 有点对不住这个CPU了。。呵呵,心血来潮,以后一定补上。

5. 比较搞笑的是,我在收工的时候突发奇想,要把MatrixC相关代码改为本地,试下有没有效果,这个还真有,平均少100ms

看来,高手们教的CACHE命中还是很有道理的。

上面代码是改后的,改之前为

void MulMatrix( float* matrixA, float* matrixB, float* matrixC )
{
    register int i, j, k, t;
    register float* p, *q;
    for ( j = 0; j < M; j ++ )
    {
        for ( i = 0; i < M; i ++ )
        {
            p = matrixA + j * M;
            q = matrixB + i;
            t = j * M + i;
            matrixC[t] = 0;
            for ( k = 0; k < M; k ++ )
            {
                matrixC[t] += *p * *q;
                p ++;
                q += M;
            }
        }
    }
}

 6. 更搞笑的是,把q += M; 中的M改为100.。。。。竟然变为了原来的1/10

难道也是CACHE。。

原文地址:https://www.cnblogs.com/javado/p/5540860.html