首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

cpu是如何避免C++循环的

2012-02-17 
cpu是如何处理C++循环的?C++编程中都说:在多重循环中,应将最忙的循环放在最内层以减少CPU切入循环层的次

cpu是如何处理C++循环的?
C++编程中都说:在多重循环中,应将最忙的循环放在最内层;
以减少CPU切入循环层的次数   ,请问这个减少CPU切入循环层的次数是怎么解释的?cpu在执行循环的过程中要做那些操作呢?

[解决办法]
http://topic.csdn.net/t/20040923/15/3402105.html#
也讨论过 有些观点 我们这拉没有的
[解决办法]
在多重循环中,将最忙的循环放在最内层的好处是提高CPU的cache的命中率。
[解决办法]
分支预测的影响应该还是很大的, 我看 icc 生成的代码里特别注重提高分支预测的成功率.. 试了下下面的代码, 速度差距还是很明显的 ....

#include <stdio.h>
#include <stdlib.h>

#ifdef _MSC_VER
typedef __int64QW;
QW RDTSC(){__asm rdtsc }
#define OFMT "(%I64d,%I64d,%I64d) ---- (%I64d,%I64d,%I64d) "
#else
typedef long long QW;
QW RDTSC(){ __asm__ __volatile__ ( "rdtsc "); }
#define OFMT "(%lld,%lld,%lld) ---- (%lld,%lld,%lld) "
#endif


QW foo1( int p[][20] , int __i , int __j )
{
QW r = 0;
int i , j ;
for( i = __i; --i > = 0 ; )
for( j = __j; --j > = 0; )
r += p[i][j];
return r;
}
QW foo2( int p[][20] , int __i , int __j )
{
QW r = 0;
int i , j ;
for( j = __j; --j > = 0; )
for( i = __i ; --i > = 0; )
r += p[i][j];
return r;
}

#define CCC(10000)

int main()
{
static int b[CCC][20];

QWf1_min[21] = {0} , f1_max[21] = {0}, f1_q[21] = {0};
QWf2_min[21] = {0} , f2_max[21] = {0}, f2_q[21] = {0}, t1 , t2 , v1 , v2;
int x , xx;

srand( (int)RDTSC() );
for( x = 0; x < CCC; ++x ) for( xx = 0; xx < 20; ++xx ) b[x][xx] = rand();

for( x = 0; x < 10; ++x )
foo1( b , CCC , 20 ) , foo2( b , CCC , 20 );

for( x = 1; x <= 20; ++x )
{
t1 = RDTSC(); v1 = foo1( b , CCC , x ); f1_min[x] = f1_max[x] = f1_q[x] = RDTSC() - t1;
t2 = RDTSC(); v2 = foo2( b , CCC , x ); f2_min[x] = f2_max[x] = f2_q[x] = RDTSC() - t2;
if( v1 != v2 ) printf( "error.\n " );
}

for( xx = 1; xx < 10; ++xx )
{
for( x = 1; x <= 20; ++x )
{
t1 = RDTSC(); foo1( b , CCC , x ); t1 = RDTSC() - t1;
t2 = RDTSC(); foo2( b , CCC , x ); t2 = RDTSC() - t2;
if( t1 < f1_min[x] )
f1_min[x] = t1;
else if( t1 > f1_max[x] )
f1_max[x] = t1;
if( t2 < f2_min[x] )
f2_min[x] = t2;
else if( t2 > f2_max[x] )
f2_max[x] = t2;
f1_q[x] += t1;
f2_q[x] += t2;
}
}


for( x = 1; x <= 20; ++x )
{
printf ( "x == %d : " OFMT "\n " , x ,
f1_min[x] , f1_max[x] , f1_q[x]/10 , f2_min[x] , f2_max[x] , f2_q[x]/10);
}

return 0;
}

热点排行