多核平台上的多级存储问题

weenyaimac 2010-03-05 09:33:52
大家都知道,多核平台上存储是分层次的,一般有内存、二级缓存、一级缓存,有的体系结构还有三级缓存,我的问题是在算法或者程序中如何表示(如命令或者函数)数据从主存读到二级缓存和数据从二级缓存读到一级缓存;数据从一级缓存写到二级缓存和数据从二级缓存写到主存,在这个过程中,如何控制这些数据在各级存储层次中的存储位置。请高手多多指点!谢谢~
...全文
195 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
恩 我也想到过这个问题 最近在做英特尔的比赛 在看关于多核编程的问题 多多学习
weenyaimac 2010-04-02
  • 打赏
  • 举报
回复
谢谢楼上的,有什么问题再向你请教!
intel_www 2010-03-08
  • 打赏
  • 举报
回复
在IA32和Intel64系统中可以进行有限的控制。详细的描述可以参考 http://www.intel.com/Assets/PDF/manual/248966.pdf 的第7章,尤其是第7.5小节里面的内容。
uuussseeennn 2010-03-07
  • 打赏
  • 举报
回复
呵呵,有啥研究成果记得多分享分享哦:)
weenyaimac 2010-03-06
  • 打赏
  • 举报
回复
谢谢!我理解你的意思!调整数据结构以减少线程之间的乒乓现象,L1 cache的一行一般为64字节,所以char数组的大小为64的倍数应该都可以。不过这只是优化内存的一个方面,我再研究研究!
uuussseeennn 2010-03-05
  • 打赏
  • 举报
回复
给一个样例程序,尝试调整结构体Count里面的space大小,如用16,32,60,128等值来替换64,观察执行结果会有所不同,原因就是我上面说的:
#include <iostream>
#include <windows.h>
using namespace std;

struct Count
{
long count1;
char space[128];
long count2;
};
DWORD WINAPI Calculate1(void *p)
{
double x = 0,y = 0;
long* c1 = (long*)p;
for(; x <= 0.5;x += 0.0001)
for(y = 0;y <= 1;y += 0.0001)
{
if (x*x + y*y <= 1) (*c1)++;
}
return 0;
}
DWORD WINAPI Calculate2(void *p)
{
double i = 0,j = 0;//16
long* c2 = (long*)p;
for(i=0.5001;i <=1;i+=0.0001)
for(j=0;j <=1;j+=0.0001)
{
if(i*i+j*j <=1) (*c2)++;
}
return 0;
}

int main()
{
DWORD pThreadID;
Count cnt;

DWORD startTime = 0,endTime = 0;
startTime= GetTickCount();
Calculate1(&cnt.count1);
Calculate2(&cnt.count2);
cout << "Serial calculate cost " << GetTickCount() - startTime << "ms." << endl;

cnt.count1 = 0;
cnt.count2 = 0;
startTime= GetTickCount();

HANDLE hThread1 = CreateThread (NULL,
0,
Calculate1,
&cnt.count1,
0,
&pThreadID);

HANDLE hThread2 = CreateThread (NULL,
0,
Calculate2,
&cnt.count2,
0,
&pThreadID);


WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
endTime=GetTickCount();

cout << "Parallel calculate cost " << endTime-startTime << "ms." << endl;
}
uuussseeennn 2010-03-05
  • 打赏
  • 举报
回复
看一下此贴:http://topic.csdn.net/u/20100304/09/1c5143c5-d886-450a-80a0-bf9a92f7c789.html以及我的回复。
我不知道能不能在应用层直接控制数据在不同存储器之间的移动,凭感觉应该是很难做到的,即使能做到,我们要自己设计一个比CPU自身更好的算法,难度也会很大。所以我们最好是对已有的数据结构进行调整,调整的原则就是使得不在同一个计算逻辑里的数据位于不同的cache行(cpu存取的数据的最小单位,是一级缓存中的一行),从而减少数据因“写后读 或 写后写”造成的同步开销(一级缓存之间的数据同步)。

567

社区成员

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

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