问题标签 [expression-templates]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
220 浏览

c++ - boost::uBLAS 如何处理矩阵的嵌套乘积?

我读了一篇关于使用动态编程优化矩阵嵌套乘积的文章,我想看看它是如何在 boost::uBLAS 中实现的。

我不确定我是否理解文档(他们在页面的最后谈论它),但似乎他们处理了这个问题。当您编写时,R = prod(A, prod(B,C));库会根据和的大小计算A x (B x C)或。(A x B) x CABC

如何实现?图书馆如何“移动括号”?在编写这样的代码行时,我认为prod将评估 的参数,然后运行该函数。

FAQ提到了表达式模板的概念。有联系吗?

0 投票
1 回答
292 浏览

c++ - 如何实际使用表达式模板

维基百科文章中,它提供了一些模板类。我想在实际代码中使用它。我怎样才能做到这一点?我发现我几乎没有办法实例化一个Vec对象。

0 投票
1 回答
236 浏览

c++ - 在表达式模板中需要非常量表达式类

我正在尝试编写表达式模板,但遇到了一个我不知道如何解决的问题。我读过 C++ Templates: The Complete Guide 但他们似乎没有解决这个问题。

作为一个例子,考虑一个集合类型set(整数)的表达式模板,它具有标准集合操作交集、联合、否定、异或、差异等。这些函数在迭代器方面都有有效的实现,所以我想要我的表达式模板类具有类似迭代器的接口。例如,

然后我有表达式模板类set_expr_union等。现在,问题是,与表达式模板表达式相对应创建的对象都是临时的,因此是常量,但是要评估表达式我需要遍历值(调用++val),而这些是非常量的。我不能声明set::operator = (set_expr &)为非常量,因为临时对象不会绑定非常量参数。我可以抛弃 const-ness operator =,但这感觉不是正确的解决方案。

我的例子没有足够的细节来说明问题,我很乐意澄清。

编辑:这里有更多细节。假设set_expr_union也有上面的set_expr_intersection接口:operator ++和。另外,假设我有valoperator bool

其中 T 旨在成为set_expr_union等之一,并且set_expr还导出t++, val, bool接口。

表达式模板对象通过各种运算符产生,例如:

确实,与运算符返回值对应的临时值是问题所在。

现在,考虑

我想在类似的东西中使用它set3 = set1 & set2

这是我想写的那种代码。

0 投票
3 回答
591 浏览

c++ - 为什么游戏不使用数学表达式模板?

我可以想象表达式模板会为诸如向量/矩阵/四元数等普遍存在的事物编译时间做可怕的事情,但是如果它的速度提升如此之大,为什么游戏不使用它呢?很明显,SIMD 指令可以很好地利用数据级并行性。表达式模板和惰性求值结合起来似乎很有意义,至少在消除临时变量方面是这样。

因此,虽然像 Eigen 这样的库宣传这些功能,但我认为这在中间件(例如 Havok)或对速度至关重要的游戏中并不常见。任何人都可以对此有所了解吗?它与非确定性或分支预测有关吗?

0 投票
2 回答
560 浏览

c++ - 基于 C++11 中的表达式模板和范围

据我了解,表达式模板将在 C++11 中基于范围的 for 中断,因为其中for (auto x : expr)有一个隐含auto&& __range = expr的含义,这将导致悬空引用。

有没有办法创建表达式模板类,以便它们在基于范围的 for 中正确运行,或者至少引发编译错误?

基本上,我想防止表达式模板正确编译但由于悬空引用而在运行时失败的可能性。我不介意在基于范围的 for 中使用表达式模板之前必须将它们包装在某些东西中,只要在用户忘记包装表达式模板时没有静默运行时错误。

0 投票
2 回答
833 浏览

c++ - 防止表达式模板绑定到右值引用

我了解执行以下操作:

如果矩阵运算使用表达式模板(例如boost::ublas),将导致静默运行时错误。

有没有什么方法可以设计表达式模板来防止编译器编译可能导致在运行时使用过期临时文件的代码?

(我试图解决这个问题没有成功,尝试在这里

0 投票
1 回答
458 浏览

c++ - CRTP:表达式模板的编译器相关问题

我使用以下代码(存储在 crtp.cc 中)遇到了与编译器相关的问题:

事实上,当我编译它时:

我得到:

这是预期的行为。当我使用 icpc 时:

我获得了一个Segmentation fault. 跑步

指向源代码中的第 29 行

由于我对 C++ 很陌生,并且我花了很长时间寻找一个没有任何结果的错误,我想请教更有经验的人的意见,以了解这个问题是否是由于我引入的一些错误(如我所料)或到编译器错误。

编辑:在 Mike Seymour 的回答之后,我改变了现在的代码。现在我没有收到编译器警告,但我仍然得到与以前相同的行为(具有相同的 valgrind 响应)。有人尝试用 Intel 编译吗?

编辑:我试图在Wikipedia的Expression Templates页面中编译代码。我获得了与我提供的示例相同的行为。

编辑:我已经进一步调查了这个问题,似乎与英特尔一起编译icpc运营商

递归调用自身。我发现的一种解决方法是用一种方法替换此运算符:

并相应地修改各种类的构造函数。谁能指出这两种行为中哪一种是正确的,可能指向解释这一点的标准?

0 投票
1 回答
747 浏览

c++ - 表达式模板与手写代码

我目前正在编写一个 C++ 模板表达式库,并将一些实例化与汇编级别的手写代码进行比较。手写功能如下:

该类vector只是四个双精度的包装器,可以使用at<index>()成员函数读取。由于设计决策,四个组件的索引是使用而不是通常1, 2, 4, 8访问的。at<index>()0, 1, 2, 3

此函数的目的是返回两个向量相乘的结果(在 Minkowski 空间中)。如果您熟悉几何代数,您将看到点积( 的第一个分量,在和result的交换下对称)和楔积(其余分量,在和的交换下反对称)。如果您不熟悉几何代数,只需将此函数作为向量相乘的处方。abab

如果我用 GCC 4.7 编译上面的函数并查看objdump -SC a.out它给出的反汇编,我会得到以下输出:

这对我来说看起来很不错——第一个 ( %rsi) 和第二个 ( %rdx) 向量的分量只被访问一次,并且实际计算只在寄存器中完成。最后,将结果写入寄存器中的地址%rdi。由于这是第一个参数寄存器,我认为这里采用了返回值优化。

将其与上述函数的表达式模板版本的以下清单进行比较:

这个函数的签名是

我希望你相信我,两个版本都给出了相同的结果。前两行提取作为引用存储在 中的第一个和第二个向量product。我想知道以下几点:

  • movsd 0x1f1(%rip),%xmm4结合做什么xorpd %xmm4,%xmm0?我已经发现这被称为“RIP 相对寻址”,请参阅 http://www.x86-64.org/documentation/assembly.html
  • 为什么 GCC 不使用更多的寄存器,例如缓存0x10(%rax)被读取四次?

我还通过生成 100000000 个随机向量并花费两个函数所需的时间来对这两个函数进行基准测试:

手写功能快10%左右。有没有人有表达模板的经验并且知道如何让它们的表现更接近他们的手写对应物?

0 投票
3 回答
1002 浏览

algorithm - 根据霍纳的方案,将多项式的解析树转换为其评估的解析树

您能否指出一种算法,该算法采用(二进制)解析树来评估单个变量中的多项式表达式,并返回一个等效的解析树,该解析树根据霍纳规则评估多项式。

预期的用例在表达式模板中。这个想法是,对于一个矩阵x,解析树从

会被优化成对应的解析树

0 投票
4 回答
1312 浏览

c++ - 如何集成使用表达式模板的库?

我想在我的程序中使用 Eigen 矩阵库作为线性代数引擎。Eigen 使用表达式模板来实现惰性求值并简化循环和计算。

例如:

由于 Eigen 使用表达式模板,因此代码如

在上面提到的示例中,减少到长度为 10 的单个循环(不是 40,浮点数按 4 块放入寄存器中)而不创建临时。多么酷啊?

但是如果我像这样集成库:

然后像这样的表达式:

不能利用 Eigen 的实现方式。这不是最后一个。还有许多其他示例,在 Eigen 中使用了表达式模板。

简单的解决方案是不要自己定义运算符,data_公开并编写如下表达式:

这打破了封装,但它保留了 Eigen 的效率。

其他方式可能是制作我自己的运算符,但让它们返回表达式模板。但由于我是 C++ 的初学者,我不知道这是否是正确的方法。

如果这个问题本质上太笼统,我很抱歉。我是初学者,没有人问。到目前为止,我std::vector<float>到处都在使用,但现在我也需要使用矩阵。在我的整个项目中切换std::vector<float>到 Eigen 是一大步,我害怕一开始就打错电话。欢迎任何建议!