据说CSDN有点高手,那么深入理解omp cache line问题的进来比划比划了

kunfpanda 2009-02-17 05:01:23
先看小程序:
/*------------------------------------------------------
int a[4],b[4],c[4],d[4];
int global[16];
for(int i=0;i<16;i++)
global[i]=1;
for(int i=0;i<4;i++)
{
a[i]=global[i];
b[i]=global[4+i];
c[i]=global[8+i];
d[i]=global[12+i];
}
//////////////////////////////parallel
#pragma omp parallel sections
{
#pragma omp section
{
double startwtime,endwtime;
startwtime=MPI_Wtime();
for (int i = 0; i < 5000000; i++)
{
int m=0;
for(int j=1;j<4;j++)
a[0]+=a[j];
}
}
#pragma omp section
{
double startwtime,endwtime;
startwtime=MPI_Wtime();
for (int i = 0; i < 5000000; i++)
{
int a=0;
for(int j=0;j<4;j++)
b[0]+=b[j];
}
}
#pragma omp section
{
double startwtime,endwtime;
startwtime=MPI_Wtime();
for (int i = 0; i < 5000000; i++)
{
int a=0;
for(int j=0;j<4;j++)
c[0]+=c[j];
}
}
#pragma omp section
{
double startwtime,endwtime;
startwtime=MPI_Wtime();
for (int i = 0; i < 5000000; i++)
{
int a=0;
for(int j=1;j<4;j++)
d[0]+=d[j];
}
}
}

}
***************************************************************************/
上述代码由于分别a,b,c,d四个数组落在同一cache line,所以并行时间比串行更慢的多。
但为什么把上述代码中的int a[4],b[4],c[4],d[4];换为
int *a = new int[4];
int *b = new int[4];
int *c = new int[4];
int *d = new int[4];
就可以正确并行呢?
在栈中和在堆中定义的变量在拷入cache时有什么区别?
有理解而且能说清楚的人吗
...全文
213 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kunfpanda 2009-02-23
  • 打赏
  • 举报
回复
谢谢
liangyi571 2009-02-22
  • 打赏
  • 举报
回复
这个问题很好回答,
int a[4],b[4],c[4],d[4];
这样写数据都在一个 128 字节 cache line 内,所以冲突会很严重
而采用 new int[4]; 后,则至少这四个变量不会在一个 cache line 内,由于这四个变量分别位于四个线程,所以冲突现象不严重,速度会提高很多。
kunfpanda 2009-02-17
  • 打赏
  • 举报
回复
上述代码修正一下:
/*------------------------------------------------------
int a[4],b[4],c[4],d[4];
int global[16];
for(int i=0;i <16;i++)
global[i]=1;
for(int i=0;i <4;i++)
{
a[i]=global[i];
b[i]=global[4+i];
c[i]=global[8+i];
d[i]=global[12+i];
}
//////////////////////////////parallel
#pragma omp parallel sections
{
#pragma omp section
{
for (int i = 0; i < 5000000; i++)
{
for(int j=1;j <4;j++)
a[0]+=a[j];
}
}
#pragma omp section
{
for (int i = 0; i < 5000000; i++)
{
for(int j=0;j <4;j++)
b[0]+=b[j];
}
}
#pragma omp section
{
for (int i = 0; i < 5000000; i++)
{
for(int j=0;j <4;j++)
c[0]+=c[j];
}
}
#pragma omp section
{
for (int i = 0; i < 5000000; i++)
{
for(int j=1;j <4;j++)
d[0]+=d[j];
}
}
}
***************************************************************************/

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧