Closed sakaik closed 1 year ago
類似のクエリですが、st_contains(geometry,geometry)
はGPUで実行するようになっています。
もしかすると、xpu_opcodes.h
が更新されて、それに依存する codegen.o
が再ビルドされていない可能性があります。
make clean && make -J NCPUS
した後ではどうでしょうか?
postgres=# set pg_strom.enable_gpugistindex = off;
SET
postgres=# set enable_indexscan = off;
SET
postgres=# set enable_bitmapscan = off;
SET
postgres=# explain verbose SELECT pref, city, count(id+1)
FROM giscity j, dpoints p
WHERE st_contains(j.geom, st_point(x,y))
GROUP BY pref,city;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Finalize GroupAggregate (cost=1556520666103.55..1556550394050.18 rows=11890 width=29)
Output: j.pref, j.city, count((p.id + 1))
Group Key: j.pref, j.city
-> Gather Merge (cost=1556520666103.55..1556550393752.93 rows=23780 width=29)
Output: j.pref, j.city, (PARTIAL count((p.id + 1)))
Workers Planned: 2
-> Partial GroupAggregate (cost=1556520665103.53..1556550390008.10 rows=11890 width=29)
Output: j.pref, j.city, PARTIAL count((p.id + 1))
Group Key: j.pref, j.city
-> Sort (cost=1556520665103.53..1556526610060.66 rows=2377982854 width=25)
Output: j.pref, j.city, p.id
Sort Key: j.pref, j.city
-> Parallel Custom Scan (GpuJoin) on public.dpoints p (cost=9028.23..1555922748457.79 rows=2377982854 width=25)
Output: j.pref, j.city, p.id
GPU Projection: pref, city, id
GPU Join Quals [1]: st_contains(geom, st_point(x, y)) ... [nrows: 20000020 -> 2377983000]
GPU-Direct SQL: enabled (GPU-0)
KVars: nslots: 6, nbytes: 112
Scan VarLoads OpCode: {LoadVars: depth=0 kvars=[2:p.id, 4:p.x, 5:p.y]}
Join VarLoads OpCode: {Packed items[0]={LoadVars: depth=1 kvars=[0:j.pref, 1:j.city, 3:j.geom]}}
Join Quals OpCode: {Packed items[0]={JoinQuals: {Func::st_contains(bool) args=[{Var(geometry): slot_id=3}, {Func::st_point(geometry) args=[{Var(float8): slot_id=4}, {Var(float8): slot_id=5}]}]}}}
GPU Projection OpCode: {Projection <0,1,2>}
-> Parallel Seq Scan on public.giscity j (cost=0.00..7937.41 rows=49541 width=2091)
Output: j.pref, j.city, j.geom
(24 rows)
最新 fa1562d2be7de572c59282f8a67bbb8d70d29b3b
を取得しビルドしたところ、explainでGPUを使う判断をしてくれるようになりました。
ただし、実際にクエリを実行すると膨大な時間がかかるので、これはもう少し調査して別途issue報告させていただければと思います。本件(GPUを使うという判断をしてくれない)についてはOKとなったので、クローズします。
なお、手元の make コマンドでは "-Jオプションがない" とのエラーになったので、オプション抜きでmakeしております。
sakaitest_nvme5=# EXPLAIN SELECT a.c28_005 apname, a.c28_004 status,p.x,p.y geom_with_coord
FROM points100man p, c28_airport a
WHERE ST_Contains(a.geom, ST_SetSRID(ST_MakePoint(p.x, p.y), 6668))
ORDER BY apname;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Sort (cost=169628213.40..169628483.40 rows=108000 width=40)
Sort Key: a.c28_005
-> Custom Scan (GpuJoin) on points100man p (cost=126.24..169619184.24 rows=108000 width=40)
GPU Projection: c28_005, c28_004, x, y
GPU Join Quals [1]: st_contains(geom, st_setsrid(st_makepoint(x, y), 6668)) ... [nrows: 1000000 -> 108000]
GPU-Direct SQL: enabled (GPU-0)
-> Seq Scan on c28_airport a (cost=0.00..24.08 rows=108 width=1133)
(7 rows)
Time: 36.119 ms
概要
GIS関数にてGPUを使用するよう判断されない(常にCPUで実行される) (下例はST_Contains())
詳細情報(client_min_messages=debug2)