heterodb / pg-strom

PG-Strom - Master development repository
http://heterodb.github.io/pg-strom/
Other
1.3k stars 162 forks source link

(VTJ-JP)GPU is not used in spatial functions #610

Closed sakaik closed 1 year ago

sakaik commented 1 year ago

概要

 GIS関数にてGPUを使用するよう判断されない(常にCPUで実行される) (下例はST_Contains())

sakaitest_nvme5=# explain  SELECT a.c28_005 apname, a.c28_004 status, ST_SetSRID(ST_MakePoint(p.x, p.y),6668),  a.geom cnt 
sakaitest_nvme5-#   FROM points1000man p, c28_airport a
sakaitest_nvme5-#  WHERE ST_Contains(ST_SetSRID(a.geom,6668), ST_SetSRID(ST_MakePoint(p.x, p.y), 6668))
sakaitest_nvme5-#    AND a.c28_005='東京国際空港'
sakaitest_nvme5-#  ORDER BY apname;
                                              QUERY PLAN                                              
------------------------------------------------------------------------------------------------------
 Gather  (cost=1000.00..206326077.79 rows=10000 width=1165)
   Workers Planned: 2
   ->  Nested Loop  (cost=0.00..206324077.79 rows=4167 width=1165)
         Join Filter: st_contains(st_setsrid(a.geom, 6668), st_setsrid(st_makepoint(p.x, p.y), 6668))
         ->  Parallel Seq Scan on points1000man p  (cost=0.00..115196.67 rows=4166667 width=16)
         ->  Seq Scan on c28_airport a  (cost=0.00..24.35 rows=1 width=1133)
               Filter: ((c28_005)::text = '東京国際空港'::text)

詳細情報(client_min_messages=debug2)

sakaitest_nvme5=# set client_min_messages = debug2;
SET
Time: 0.140 ms
sakaitest_nvme5=# explain  SELECT a.c28_005 apname, a.c28_004 status, ST_SetSRID(ST_MakePoint(p.x, p.y),6668),  a.geom cnt 
  FROM points1000man p, c28_airport a
 WHERE ST_Contains(ST_SetSRID(a.geom,6668), ST_SetSRID(ST_MakePoint(p.x, p.y), 6668))
   AND a.c28_005='東京国際空港'
 ORDER BY apname;
DEBUG:  (__codegen_func_expression:1220) function st_contains(geometry,geometry) is not supported on the target device
DETAIL:  problematic expression: {FUNCEXPR :funcid 57220 :funcresulttype 16 :funcretset false :funcvariadic false :funcformat 0 :funccollid 0 :inputcollid 0 :args ({FUNCEXPR :funcid 57045 :funcresulttype 56712 :funcretset false :funcvariadic false :funcformat 0 :funccollid 0 :inputcollid 0 :args ({VAR :varno 2 :varattno 19 :vartype 56712 :vartypmod 1707032 :varcollid 0 :varlevelsup 0 :varnosyn 2 :varattnosyn 19 :location 174} {CONST :consttype 23 :consttypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :location 181 :constvalue 4 [ 12 26 0 0 0 0 0 0 ]}) :location 163} {FUNCEXPR :funcid 57045 :funcresulttype 56712 :funcretset false :funcvariadic false :funcformat 0 :funccollid 0 :inputcollid 0 :args ({FUNCEXPR :funcid 56974 :funcresulttype 56712 :funcretset false :funcvariadic false :funcformat 0 :funccollid 0 :inputcollid 0 :args ({VAR :varno 1 :varattno 2 :vartype 701 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnosyn 1 :varattnosyn 2 :location 212} {VAR :varno 1 :varattno 3 :vartype 701 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnosyn 1 :varattnosyn 3 :location 217}) :location 199} {CONST :consttype 23 :consttypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :location 223 :constvalue 4 [ 12 26 0 0 0 0 0 0 ]}) :location 188}) :location 151}
DEBUG:  (__codegen_func_expression:1220) function st_contains(geometry,geometry) is not supported on the target device
DETAIL:  problematic expression: {FUNCEXPR :funcid 57220 :funcresulttype 16 :funcretset false :funcvariadic false :funcformat 0 :funccollid 0 :inputcollid 0 :args ({FUNCEXPR :funcid 57045 :funcresulttype 56712 :funcretset false :funcvariadic false :funcformat 0 :funccollid 0 :inputcollid 0 :args ({VAR :varno 2 :varattno 19 :vartype 56712 :vartypmod 1707032 :varcollid 0 :varlevelsup 0 :varnosyn 2 :varattnosyn 19 :location 174} {CONST :consttype 23 :consttypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :location 181 :constvalue 4 [ 12 26 0 0 0 0 0 0 ]}) :location 163} {FUNCEXPR :funcid 57045 :funcresulttype 56712 :funcretset false :funcvariadic false :funcformat 0 :funccollid 0 :inputcollid 0 :args ({FUNCEXPR :funcid 56974 :funcresulttype 56712 :funcretset false :funcvariadic false :funcformat 0 :funccollid 0 :inputcollid 0 :args ({VAR :varno 1 :varattno 2 :vartype 701 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnosyn 1 :varattnosyn 2 :location 212} {VAR :varno 1 :varattno 3 :vartype 701 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnosyn 1 :varattnosyn 3 :location 217}) :location 199} {CONST :consttype 23 :consttypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :location 223 :constvalue 4 [ 12 26 0 0 0 0 0 0 ]}) :location 188}) :location 151}
                                              QUERY PLAN                                              
------------------------------------------------------------------------------------------------------
 Gather  (cost=1000.00..206326077.79 rows=10000 width=1165)
   Workers Planned: 2
   ->  Nested Loop  (cost=0.00..206324077.79 rows=4167 width=1165)
         Join Filter: st_contains(st_setsrid(a.geom, 6668), st_setsrid(st_makepoint(p.x, p.y), 6668))
         ->  Parallel Seq Scan on points1000man p  (cost=0.00..115196.67 rows=4166667 width=16)
         ->  Seq Scan on c28_airport a  (cost=0.00..24.35 rows=1 width=1133)
               Filter: ((c28_005)::text = '東京国際空港'::text)
kaigai commented 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)
sakaik commented 1 year ago

最新 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