好久没弄这个东西,今天突然想试下,代码没写完,以后补。
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。。