首先把Customer
和Order
表join成一张表, 利用 order_date
和 customer_category
来分partition
,
把相同(customer_category, order_date)
的行group到同一个partition。
我们实现了基于OpenMP的BucketSort实现这一group(对行做reorder)的目的,
并对每个partition按照order-key
进行排序来提高之后join时候的内存访问locality。
为了方便join LineItem表, 我们把reorder之后的行存储转为了列存储,
存到了 orders.txt_ORDER_KEY.rapids
, orders.txt_ORDER_DATE.rapids
以及meta数据 orders.txt_ORDER_META.rapids
。
其中meta数据包含了: partition
信息, category
映射信息, 还有min-max order_date
信息。
类似之前的partition思路, 我们按照ship_date
进行partition
, 并且将reorder之后的行存储转为了列存储,
存到了lineitem.txt_LINE_ITEM_KEY.rapids
, lineitem.txt_LINE_ITEM_PRICE.rapids
(之后aggregation用) 以及meta数据 lineitem.txt_LINE_ITEM_META.rapids
。
其中meta数据包含了: max order id
, partition
信息, min-max ship_date
信息。
Q3中有三个filter, Customer和Order有关的两个filter定位到对应的Order表中partition
; LineItem有关的filter定位到对应的LineItem表中partitions
。
然后对Order表filtered partions
建立bitmap-index, 用LineItem表进行probe和aggregation, 最终选出非0的行按照price
选出top-k。
GPU负责对keys
进行intersection
, 之后的price
有关的aggregation由CPU来做。
多GPU任务通过分割扫LineItem的filtered partition
来实现。
以下测试需要在当前目录进行。
./link_files.sh /data
./compile.sh
./run.sh customer.txt orders.txt lineitem.txt 1 BUILDING 1995-03-29 1995-03-27 5
- check with
gt_testcase_4.txt
./run.sh customer.txt orders.txt lineitem.txt 3 BUILDING 1995-03-29 1995-03-27 5 BUILDING 1995-02-29 1995-04-27 10 BUILDING 1995-03-28 1995-04-27 2
- check with
gt_testcase_3.txt
./run.sh customer.txt orders.txt lineitem.txt 1 BUILDING 1998-08-02 1992-01-02 5
请见 q3-src。
在详细测试步骤中已经提到。
在当前工作目录,名字为tpch-q3-submit
。