0

可跳过的上下文:我有一个模拟循环(使用固定更新但可变渲染模式),它实例化根据用户输入和/或文件配置从数百万个组件的数据库(容器的数据库)动态生成的类的实体状态修改模式)。

我已经实现了一个系统,该系统自动...推导(某种我不知道名称的逻辑单元/数学)并在用户输入/配置忽略他们的一个选项需要其他组件这一事实时应用所需的组件.

怎么会这样?许多组件是复杂的公式或模糊逻辑(门?)或其他复杂的科学推理,以可以操作我的模拟结构、对象、环境的方式编码,因此有时一个组件依赖于另一个组件,我需要'推演算法/系统'能够将该依赖传递给类构造函数。

我在决定存储这些“知识片段”的方式中使用了最大粒度,因为考虑到模拟的大小和计算强度以及单个实例的数量,我真的不能浪费任何内存,但现在我正在运行这个问题单个实例需要数千个,有时是数万个组件,我需要将实例的“创建映射”保存并仍然绑定为私有成员,这样我就可以:第一 - 知道我的推导在哪里引导实例的构造函数,也许能够使用记忆来减少构建时间;第二 - 在模拟期间实现对实时实例的更改注入¹。

我认为我需要的是:我需要一个可能无限或至少很长的位掩码,因此我可以更快地迭代创建并让我的动态构造对象的最终组件树记录下来以备将来使用。

可能的方法,我不知道会起作用:第一种 - 使用 RAM 晶片作为我的位掩码,手动和顺序地存储每个 RAM 单元中位标志的值。第二 - 将映射分解为已知大小的较小位掩码(很难,因为在创建完成之前组件的最终数量是未知的,并且在不重构整个系统的情况下解耦推论甚至可能是不可能的)。第三 - 找出一种方法来制作一个无限位掩码,或者使用一些实现了非常长的整数(5.12e+11 或更大)的库。

我的代码是用 C++ 编写的,我的渲染和计算内核是 Vulkan。

我的客观问题: 我如何实现一个任意长的位掩码,它是内存和计算高效的?

如果允许我提出一个额外的问题,假设我没有架构(软件和硬件)限制,那么实现这种位掩码的最有效方法是什么?

¹ 在模拟过程中我无法浏览对象的树,我也无法暂停模拟并等待浏览完成后再注入修改,我需要知道并能够在任意模拟帧上进行任意更改以预先安排的方式和实时方式。

4

1 回答 1

2

实现这种位掩码的最有效方法是什么

放在std::vector<bool>那里并配置文件。如果/当您发现您花费大量时间使用该向量时,请进一步阅读。

没有最有效的方法,这完全取决于您的代码对这些位的确切作用。

一种标准方法是保持整数的连续向量,并将它们视为位向量。例如,std::vector<bool>在 Windows 上使用 32 位值,每个值保留 32 个布尔值。

但是,std::vector 的 API 太笼统了。如果您的向量具有大多数 0-s 或大多数 1-s,您将能够比执行许多操作(获取值、查找第一个/下一个/前一个 0/​​1)快得多std::vector<bool>

此外,根据您的访问模式,您可能需要更小或更大的元素。如果您决定使用大型 SIMD 类型__m128i,或者__m256i不要忘记对齐它们。

于 2018-02-16T23:20:09.220 回答