我正在寻找有关如何使用模板在 C++ 中实现 DAG 的建议。主要思想是设计一种框架,用户可以使用自己的类(节点)对其他节点提供的输入执行一些工作。鉴于类之间的这种关系,DAG 似乎是一个自然的选择。同时,我想避免依赖虚拟抽象接口,因为我认为用户实现带有明确说明所有所需输入的签名的工作方法会更清楚,例如,Node::process(const AnotherNodeA&, const AnotherNodeB&)而不是Node::process(const set<AbstractNode*>&).
我想我已经弄清楚如何使用类型列表来实现类型的层次结构。例如,下面实现了一个像这样的简单图表:
strict digraph "" {
NodeY -> Node1;
NodeX -> Node1;
Node1 -> NodeA;
NodeX -> Node2;
Node2 -> NodeB;
NodeY -> NodeB;
}
Run Code Online (Sandbox Code Playgroud)
strict digraph "" {
NodeY -> Node1;
NodeX -> Node1;
Node1 -> NodeA;
NodeX -> Node2;
Node2 -> NodeB;
NodeY -> NodeB;
}
Run Code Online (Sandbox Code Playgroud)
上面打印了定义类型的层次结构:
NodeA
Node1
NodeX
NodeY
NodeB
Node2
NodeX
NodeY
Run Code Online (Sandbox Code Playgroud)
std::pair<ChildNode, ParentNode>在节点之间实现“边缘”是一个不错的选择,即ChildNode -> ParentNode?可以使用一组这样定义的对来验证和/或对节点进行拓扑排序吗?
在我的项目中,我使用Eigen3.3库来进行6x6矩阵的计算.我决定调查AVX指令是否真的让我对SSE加速.我的CPU确实支持这两组:
model name : Intel(R) Xeon(R) CPU E5-1607 v2 @ 3.00GHz
flags : ... sse sse2 ... ssse3 ... sse4_1 sse4_2 ... avx ...
Run Code Online (Sandbox Code Playgroud)
所以,我用gcc4.8编译了一个小测试,使用两组不同的标志:
$ g++ test-eigen.cxx -o test-eigen -march=native -O2 -mavx
$ g++ test-eigen.cxx -o test-eigen -march=native -O2 -mno-avx
Run Code Online (Sandbox Code Playgroud)
我确认第二个案例-mno-avx没有产生任何ymm寄存器指令.然而,这两个案例给出了非常相似的结果,约为520毫秒perf.
这是程序test-eigen.cxx(它与两个矩阵的总和相反,只是接近我正在处理的实际任务):
#define NDEBUG
#include <iostream>
#include "Eigen/Dense"
using namespace Eigen;
int main()
{
typedef Matrix<float, 6, 6> MyMatrix_t;
MyMatrix_t A = MyMatrix_t::Random();
MyMatrix_t B = MyMatrix_t::Random();
MyMatrix_t C = MyMatrix_t::Zero();
MyMatrix_t D …Run Code Online (Sandbox Code Playgroud)