你如何比较valarrays与内置数组的性能?

Ser*_*gio 3 c++ performance

使用比内置阵列更加用户友好的valarray会有很大的损失吗?你知道一些基准吗?

Jer*_*fin 7

valarray打算改善得到很好的优化的机会.无论好坏,它都成为标准库中被遗忘的继子之物; 我不知道有什么实现可以利用它提供的功能.更糟糕的是,该设计实际上是为矢量处理器设计的,并且对于使用缓存的处理器不能很好地工作 - 这几乎就是一切.

我不知道任何真正严重的基准测试,但在我的(不可否认,非常非正式)测试中,只要你处理少量数据,即使是内置数组(或std :: vector)也是如此. ,但是如果你有足够的数据使它不适合缓存,那么合理地小心使用内置数组或std::vector通常会更快.

至于"相当小心",它归结为:为了使缓存友好,你通常想要读取一段特定的数据,对它进行所有处理,然后将其写回.valarray几乎完全相反:它对整个数组应用单个操作,然后将下一个操作应用于整个数组,依此类推,直到你完成.

在Cray(例如)运行良好的情况下 - 它有三组64个寄存器(理想情况下)可以旋转,因此在任何给定的时钟周期内,您从内存中读取一组64个寄存器,应用单个操作第二组,然后写出第三组.下一个周期你要"旋转"它们,所以你对刚刚读过的64个操作进行了操作,写出了你刚刚创建的结果,并将数据读入你刚写完的寄存器中.当事情发生时,与标量处理相比,你获得了64倍的加速.大多数当前的处理器都有一些矢量处理,但每个时钟周期只有大约2到4个操作数 - 同时,它们通常主要受到主存储器带宽的限制,这正是该模式最需要的.