我对优化是个新手,我在一个友好的竞赛中编写最快的算法,在有障碍物的领域中找到一个正方形。我认为我的算法相当快( 10k * 10k网格中的2.07s,密度为70% ),但我想让它更快。我最常用的函数是找到正方形中给定坐标的最大尺寸。这就是它:
int max_size(int i, int j, int **tab, int offset)
{
int a;
a = offset;
if (i > 0 && j > 0)
{
while (i + a < g_ymax && j + a < g_xmax &&am
我从来没有完全理解函数中的堆栈对齐和堆栈的“对齐加载/存储”之间的区别。
我正在阅读一些PTX代码,我看到了以下内容:
function()
.local .align 16 .byte stack_memory[200];
// This should mean the stack memory starts at an address aligned to 16 (why would this be necessary?)
load_byte_from_stack reg, [stack_memory+1];
// It seems reading 1 byt
在csapp教科书中,对内存山的描述表明,增加工作大小会恶化时间局部性,但我觉得size和stride因素都只对空间局部性有贡献,因为当更多的数据稀疏地存储在较低级别的缓存中时,吞吐量会下降。 在这里,时间局部性在哪里发挥作用?据我所知,这意味着在不久的将来会再次引用相同的特定内存地址,如下面的答案所示:What is locality of reference? ?
我在Windows10(都是64位)上运行python 3.6,有一个快速的固态硬盘,32 on的RAM和一个非常快的处理器(AMD Threadripper)。我在英特尔i7上也得到了类似的结果。我正在打开大约5MB大小的XML文本文件,注意到即使使用lxml性能也非常慢。我将问题归结为磁盘读取性能。如果我加载为二进制文件,速度会快8倍以上。对已在磁盘缓存中的文件执行了以下测试。在这些运行期间,磁盘从未命中。冷读也得到了类似的结果。
%%timeit
with open(xmlpath + fn, 'rb') as f:
r = f.read()
1.66 ms ±
这是代码,
int array[X][Y] = {0,};
// 1 way to access the data
for (int x = 0; x < X; x++)
for(int y = 0; y < Y; y++)
array[x][y] = compute();
// the other way to access the data
for (int y = 0; y < Y; y++)
for (int x = 0; x < X; x++)
array[x][y] = compute();
自从CPU cache(L1,L2?)