我认为,你可以做的事情并不多,这会产生很大的不同。也许您可以使用 OpenMP 或 SSE 加快速度。但是现代 CPU 已经相当快了。在某些应用程序中,内存带宽/延迟实际上是瓶颈,而且会变得更糟。我们已经有了三级缓存,需要智能预取算法来避免巨大的延迟。因此,考虑内存访问模式也是有意义的。例如,如果您实现这样的 amultiply
和 anadd
并像这样使用它:
void multiply(float vec[], float factor, int size)
{
for (int i=0; i<size; ++i)
vec[i] *= factor;
}
void add(float vec[], float summand, int size)
{
for (int i=0; i<size; ++i)
vec[i] += summand;
}
void foo(float vec[], int size)
{
multiply(vec,2.f,size);
add(vec,9.f,size);
}
你基本上在内存块上传递了两次。根据向量的大小,它可能不适合 L1 缓存,在这种情况下,通过它两次会增加一些额外的时间。这显然很糟糕,您应该尝试将内存访问保持为“本地”。在这种情况下,单个循环
void foo(float vec[], int size)
{
for (int i=0; i<size; ++i) {
vec[i] = vec[i]*2+9;
}
}
可能会更快。根据经验:尝试线性访问内存并尝试“本地”访问内存,我的意思是,尝试重用已经在 L1 缓存中的数据。只是一个想法。