3

在使用cookiecutter 设置并使用xsimd启用 SIMD 内在函数之后,我正在尝试xtensor-python并开始编写一个非常简单的 sum 函数。

inline double sum_pytensor(xt::pytensor<double, 1> &m)
{
  return xt::sum(m)();
}
inline double sum_pyarray(xt::pyarray<double> &m)
{
  return xt::sum(m)();
}

用于setup.py构建我的 Python 模块,然后在由不同大小构造的 NumPy 数组上测试求和函数np.random.randn,与np.sum.

import timeit

def time_each(func_names, sizes):
    setup = f'''
import numpy; import xtensor_basics
arr = numpy.random.randn({sizes})
    '''
    tim = lambda func: min(timeit.Timer(f'{func}(arr)',
                                        setup=setup).repeat(7, 100))
    return [tim(func) for func in func_names]

from functools import partial

sizes = [10 ** i for i in range(9)]
funcs = ['numpy.sum',
         'xtensor_basics.sum_pyarray',
         'xtensor_basics.sum_pytensor']
sum_timer = partial(time_each, funcs)
times = list(map(sum_timer, sizes))

这个(可能有缺陷的)基准测试似乎表明,与 NumPy 相比,对于更大的数组,这个基本函数的 xtensor 性能下降了。

           numpy.sum  xtensor_basics.sum_pyarray  xtensor_basics.sum_pytensor
1           0.000268                    0.000039                     0.000039
10          0.000258                    0.000040                     0.000039
100         0.000247                    0.000048                     0.000049
1000        0.000288                    0.000167                     0.000164
10000       0.000568                    0.001353                     0.001341
100000      0.003087                    0.013033                     0.013038
1000000     0.045171                    0.132150                     0.132174
10000000    0.434112                    1.313274                     1.313434
100000000   4.180580                   13.129517                    13.129058

无花果

知道为什么我会看到这个吗?我猜这是 NumPy 使用的东西,而 xtensor 还没有(还),但我不确定它可以像这样简单地减少什么。我通过xmath.hpp进行了挖掘,但没有看到任何明显的内容,文档中也没有提到这样的内容。


版本

numpy                          1.13.3
openblas                       0.2.20
python                         3.6.3
xtensor                        0.12.1
xtensor-python                 0.14.0 
4

1 回答 1

6

哇,这是一个巧合!我正在研究这个加速!

xtensor 的 sum 是一种惰性操作——它不使用性能最高的迭代顺序进行(自动)向量化。但是,我们只是evaluation_strategy为减少(以及即将到来的累积)添加了一个参数,它允许您在减少之间进行immediate选择lazy

立即归约立即执行归约(而不是惰性),并且可以使用针对矢量化归约优化的迭代顺序。

您可以在此 PR 中找到此功能:https ://github.com/QuantStack/xtensor/pull/550

在我的基准测试中,这应该至少与 numpy 一样快或更快。我希望今天能把它合并。

顺便提一句。请不要犹豫,访问我们的 gitter 频道并发布问题的链接,我们需要更好地监控 StackOverflow:https ://gitter.im/QuantStack/Lobby

于 2017-11-23T10:55:47.120 回答