【发布时间】:2015-06-05 07:22:34
【问题描述】:
我想知道 MonetDB 是否使用 SIMD(单指令多数据),如果不是,我如何实现它以进行过滤或聚合。
【问题讨论】:
我想知道 MonetDB 是否使用 SIMD(单指令多数据),如果不是,我如何实现它以进行过滤或聚合。
【问题讨论】:
我不知道 MonetDB,但在大多数情况下它会 - 仅仅是因为现代编译器能够检测到可能被矢量化的特定结构。
但是,您的问题非常针对 monetDB 社区。阅读 MonetDB 源代码(可在 monetDB 主页上在线获取),找出您要优化的内容所在的位置,并与维护该软件的人员交谈。
不过,一般来说,从你相对幼稚的提问方式来看,我有点怀疑你是否能够为这样一个成熟的项目做出大量优化。
【讨论】:
拥有一些 SIMD 指令的实践经验,我可以告诉您:这比您想象的要难。聚合对于编译器进行自动矢量化是可行的,但我怀疑 GCC 是否会这样做(它需要为每个 SIMD 通道保留一个聚合并最终减少它)。我可以想象 ICC 会这样做。
过滤非常困难(即使是手动过滤)。问题是应用谓词是不够的 - 你必须压缩结果(即,丢弃不合格的值)并且还没有 SIMD 指令来做到这一点(在 AVX-2 中)。有很多非常聪明的数据库人在考虑如何手动完成,即使用内在函数。不幸的是,生成的代码不会进入 MonetDB 代码库,因为它们会导致可移植性问题。
更笼统地说:您能否简要解释一下您要解决的问题?这似乎有点像(定义模糊的)纯学术价值的课堂作业。
【讨论】:
pmovmskb、查找表和pshufb 将所有“谓词真”通道打包在寄存器的低端,使用未对齐写入将其附加到输出缓冲区,然后使用pmovmskb和popcnt 获取计数以将输出指针递增.. 我确定我不只是发明了一些激进的东西,所以我错过了什么?