犰狳inplace_plus比“普通” plus操作要慢得多

大卫·K

我正在写与犰狳4.500.0一个计划,我体验就地计算,例如s += v * v.t() * q;有显著慢于同等s = s + v * v.t() * q;哪里sv以及q适当大小的矢量。

当我运行以下代码时,发现就位版本比其他版本慢了好几倍,在进行积极优化(-O3或-Ofast; Apple LLVM 6.0版)的情况下,速度降低了500个元素(从5.13秒到0.011秒)降低了480倍。 (clang-600.0.54))。

#include <iostream>
#include <armadillo>
#include <sys/time.h>

using namespace arma;
using namespace std;

#define N_ELEM 500
#define REP 10000

int main(int argc, const char * argv[]) {
    timeval start;
    timeval end;
    double tInplace, tNormal;
    vec s = randu<vec>(N_ELEM);
    vec v = randu<vec>(N_ELEM);
    vec q = randu<vec>(N_ELEM);

    gettimeofday(&start, NULL);

    for(int i = 0; i < REP; ++i) {
        s += v * v.t() * q;
    }

    gettimeofday(&end, NULL);

    tInplace = (end.tv_sec - start.tv_sec + ((end.tv_usec - start.tv_usec) / 1e6));

    gettimeofday(&start, NULL);

    for(int i = 0; i < REP; ++i) {
        s = s + v * v.t() * q;
    }

    gettimeofday(&end, NULL);

    tNormal = (end.tv_sec - start.tv_sec + ((end.tv_usec - start.tv_usec) / 1e6));

    cout << "Inplace: " << tInplace << "; Normal: " << tNormal << " --> " << "Normal is " << tInplace / tNormal << " times faster" << endl;

    return 0;
}

谁能解释为什么inplace运算符虽然可以使用已经可用的内存,但性能却如此差劲,所以它不需要复制任何内容?

mtall

用括号括起来v.t() * q将解决问题:

for(int i = 0; i < REP; ++i) {
    s += v * (v.t() * q);
}

使用方括号强制评估的顺序。该表达式(v.t() * q)将计算为标量(技术上为1x1矩阵),然后将其用于乘以v向量。括号也将防止v * v.t()变成明显的外部产品。

Armadillo可以在使用s = s + v * v.t() * q表达式时自动解决此问题,但是(当前)在使用inplace运算符时需要更多提示+=

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在线程中运行异步操作比纯任务或纯线程操作要慢得多

来自分类Dev

为什么在线程中运行异步操作比纯任务或纯线程操作要慢得多

来自分类Dev

为什么AngularFire比普通的Firebase API慢得多

来自分类Dev

Masked Numpy数组比普通numpy数组慢得多

来自分类Dev

为什么javascript中的变量要慢得多?

来自分类常见问题

为什么复制经过改组的列表要慢得多?

来自分类Dev

为什么Object.create比构造函数要慢得多?

来自分类Dev

为什么在Python中嵌套“ if”比并行“ and”要慢得多?

来自分类Dev

为什么纹理查找比直接计算要慢得多?

来自分类Dev

为什么写入内存比读取内存要慢得多?

来自分类Dev

与语句相比,用preparedStatement查询要慢得多

来自分类Dev

反转后,小数乘法的速度要慢得多

来自分类Dev

为什么在USB拇指驱动器上安装的操作系统比在同一拇指驱动器上运行的实时操作系统要慢得多?

来自分类Dev

fastLm()比lm()慢得多

来自分类Dev

Powershell-为什么使用Invoke-WebRequest比浏览器下载要慢得多?

来自分类Dev

与台式机相比,UWP上的FillGeometry要慢得多吗?

来自分类Dev

对于非常接近零的值,双重计算的运行速度要慢得多

来自分类Dev

为什么对于不相同(但相等)的String对象,String.equals要慢得多?

来自分类Dev

为什么AngularJs在iPad(相对于台式机)上要慢得多?

来自分类Dev

为什么对Azure Document DB的第一个请求比随后的请求要慢得多?

来自分类Dev

为什么使用Python生成器遍历二叉树要慢得多?

来自分类Dev

与仅计算答案相比,为什么打印答案要慢得多?

来自分类Dev

为什么push方法比通过Javascript中的数组索引放置值要慢得多

来自分类Dev

为什么大型邮箱上的PHP imap_headerinfo()函数要慢得多?

来自分类Dev

为什么遍历列表比遍历python中的迭代器要慢得多?

来自分类Dev

为什么取消分配堆内存比分配堆内存要慢得多?

来自分类Dev

为什么a.insert(0,0)比要慢得多[0:0] = [0]?

来自分类Dev

为什么带有参数的pandas.read_sql比内联参数要慢得多

来自分类Dev

使用`database / sql`查询比直接查询数据库要慢得多

Related 相关文章

  1. 1

    为什么在线程中运行异步操作比纯任务或纯线程操作要慢得多

  2. 2

    为什么在线程中运行异步操作比纯任务或纯线程操作要慢得多

  3. 3

    为什么AngularFire比普通的Firebase API慢得多

  4. 4

    Masked Numpy数组比普通numpy数组慢得多

  5. 5

    为什么javascript中的变量要慢得多?

  6. 6

    为什么复制经过改组的列表要慢得多?

  7. 7

    为什么Object.create比构造函数要慢得多?

  8. 8

    为什么在Python中嵌套“ if”比并行“ and”要慢得多?

  9. 9

    为什么纹理查找比直接计算要慢得多?

  10. 10

    为什么写入内存比读取内存要慢得多?

  11. 11

    与语句相比,用preparedStatement查询要慢得多

  12. 12

    反转后,小数乘法的速度要慢得多

  13. 13

    为什么在USB拇指驱动器上安装的操作系统比在同一拇指驱动器上运行的实时操作系统要慢得多?

  14. 14

    fastLm()比lm()慢得多

  15. 15

    Powershell-为什么使用Invoke-WebRequest比浏览器下载要慢得多?

  16. 16

    与台式机相比,UWP上的FillGeometry要慢得多吗?

  17. 17

    对于非常接近零的值,双重计算的运行速度要慢得多

  18. 18

    为什么对于不相同(但相等)的String对象,String.equals要慢得多?

  19. 19

    为什么AngularJs在iPad(相对于台式机)上要慢得多?

  20. 20

    为什么对Azure Document DB的第一个请求比随后的请求要慢得多?

  21. 21

    为什么使用Python生成器遍历二叉树要慢得多?

  22. 22

    与仅计算答案相比,为什么打印答案要慢得多?

  23. 23

    为什么push方法比通过Javascript中的数组索引放置值要慢得多

  24. 24

    为什么大型邮箱上的PHP imap_headerinfo()函数要慢得多?

  25. 25

    为什么遍历列表比遍历python中的迭代器要慢得多?

  26. 26

    为什么取消分配堆内存比分配堆内存要慢得多?

  27. 27

    为什么a.insert(0,0)比要慢得多[0:0] = [0]?

  28. 28

    为什么带有参数的pandas.read_sql比内联参数要慢得多

  29. 29

    使用`database / sql`查询比直接查询数据库要慢得多

热门标签

归档