MonetDB 是否使用 SIMD 指令
Is MonetDB using SIMD instructions
我想知道 MonetDB 是否使用 SIMD(单指令多数据),如果不是,我如何实现它以进行过滤或聚合。
我不知道 MonetDB,但在大多数情况下它会知道——仅仅是因为现代编译器能够检测到可能被矢量化的特定结构。
但是,您的问题非常针对 monetDB 社区。阅读 MonetDB 源代码(可在 monetDB 主页上在线获取),找出您要优化的内容所在的位置,并与维护该软件的人员交谈。
一般来说,从你相对幼稚的提问方式来看,我有点怀疑你是否能够为这样一个成熟的项目做出很多优化。
如果我有一些 SIMD 指令的实践经验,我可以告诉您:这比您想象的要难。聚合对于编译器自动矢量化是可行的,但我怀疑 GCC 是否这样做(它需要为每个 SIMD 通道保留一个聚合并最终减少它)。我可以想象 ICC 会那样做。
过滤非常困难(即使是手动过滤)。问题是应用谓词是不够的——你必须压缩结果(即,丢弃不合格的值)并且还没有 SIMD 指令来做到这一点(在 AVX-2 中)。有很多非常聪明的数据库人员在考虑如何手工完成,即使用内在函数。不幸的是,生成的代码不会进入 MonetDB 代码库,因为它们会导致可移植性问题。
更笼统地说:您能简要说明一下您要解决的问题吗?这似乎有点像(定义模糊)class 纯学术价值的分配。
我想知道 MonetDB 是否使用 SIMD(单指令多数据),如果不是,我如何实现它以进行过滤或聚合。
我不知道 MonetDB,但在大多数情况下它会知道——仅仅是因为现代编译器能够检测到可能被矢量化的特定结构。
但是,您的问题非常针对 monetDB 社区。阅读 MonetDB 源代码(可在 monetDB 主页上在线获取),找出您要优化的内容所在的位置,并与维护该软件的人员交谈。
一般来说,从你相对幼稚的提问方式来看,我有点怀疑你是否能够为这样一个成熟的项目做出很多优化。
如果我有一些 SIMD 指令的实践经验,我可以告诉您:这比您想象的要难。聚合对于编译器自动矢量化是可行的,但我怀疑 GCC 是否这样做(它需要为每个 SIMD 通道保留一个聚合并最终减少它)。我可以想象 ICC 会那样做。
过滤非常困难(即使是手动过滤)。问题是应用谓词是不够的——你必须压缩结果(即,丢弃不合格的值)并且还没有 SIMD 指令来做到这一点(在 AVX-2 中)。有很多非常聪明的数据库人员在考虑如何手工完成,即使用内在函数。不幸的是,生成的代码不会进入 MonetDB 代码库,因为它们会导致可移植性问题。
更笼统地说:您能简要说明一下您要解决的问题吗?这似乎有点像(定义模糊)class 纯学术价值的分配。