我有一个问题....我正在while循环中将数据写入数组.关键是我经常这样做.似乎这篇文章现在是代码中的瓶颈.所以我认为它是由写入内存引起的.这个数组不是很大(像300个元素一样).问题是可以这样做:将它存储在缓存中并仅在while循环完成后才在内存中更新?
[编辑 - 复制自Alex添加的答案]
double* array1 = new double[1000000]; // this array has elements
unsigned long* array2 = unsigned long[300];
double varX,t,sum=0;
int iter=0,i=0;
while(i<=max_steps)
{
varX+=difX;
nm0 = int(varX);
if(nm1!=nm0)
{
array2[iter] = nm0; // if you comment this string application works more then 2 times faster :)
nm1=nm0;
t = array1[nm0]; // if you comment this string , there is almost no change in time
++iter;
}
sum+=t;
++i;
}
Run Code Online (Sandbox Code Playgroud)
首先,我要感谢你们所有人的回答.实际上,不放置代码有点蠢.所以我现在决定这样做.
double* array1 = new double[1000000]; // this array has elements
unsigned long* array2 = unsigned long[300];
double varX,t,sum=0;
int iter=0,i=0;
while(i<=max_steps)
{
varX+=difX;
nm0 = int(varX);
if(nm1!=nm0)
{
array2[iter] = nm0; // if you comment this string application works more then 2 times faster :)
nm1=nm0;
t = array1[nm0]; // if you comment this string , there is almost no change in time
++iter;
}
sum+=t;
++i;
}
Run Code Online (Sandbox Code Playgroud)
就是这样.如果有人有任何想法会很好.再一次非常感谢你.
真诚的Alex
Mic*_*hne 13
不是故意的,没有.除此之外,你不知道缓存有多大,所以你不知道什么是适合的.此外,如果允许应用程序锁定部分缓存,则对操作系统的影响可能会对整体系统性能造成破坏.这完全属于我的"你不能这样做,因为你不应该这样做.永远."
你可以做的是改善你的引用位置 - 尝试安排循环,这样你就不会多次访问这些元素,并尝试在内存中按顺序访问它们.
如果没有关于您的申请的更多线索,我认为不能给出更具体的建议.
CPU通常不提供细粒度的缓存控制,不允许您选择被驱逐的内容或将内容固定在缓存中.您在某些CPU上有一些缓存操作.就像你可以做的一些信息一样:这里有一些关于较新的x86 {-64} CPU的有趣的缓存相关指令(做这样的事情会让可移植性变得很糟糕,但我觉得你可能很好奇)
非时间指令是prefetchnta,它将数据提取到二级缓存中,从而最大限度地减少缓存污染.
时间指令如下:
Run Code Online (Sandbox Code Playgroud)* prefetcht0 – fetches the data into all cache levels, that is, to the奔腾®4处理器的二级缓存.
Run Code Online (Sandbox Code Playgroud)* prefetcht1 – Identical to prefetcht0 * prefetcht2 – Identical to prefetcht0
此外,还有一组用于访问内存中数据的指令,但明确告诉处理器不要将数据插入缓存中.这些被称为非时间指令.一个例子是:MOVNTI.
您可以对缓存中不需要的每个数据使用非时间指令,希望其余数据始终保留在缓存中.我不知道这是否会真正提高性能,因为当涉及缓存时需要注意微妙的行为.这听起来像是相对痛苦的.
我怀疑这是可能的,至少在高级多任务操作系统上是这样。你不能保证你的进程不会被抢占,从而失去CPU。如果您的进程拥有缓存,其他进程就无法使用它,这将使它们的执行速度非常慢,并使事情变得更加复杂。您确实不想仅仅因为一个应用程序将所有其他应用程序锁定在没有缓存的情况下运行现代的几 GHz 处理器。