heterodb/pg-strom

ARRAY型のANY()でCUDA_ERROR_MISALIGNED_ADDRESS発生

Closed this issue · 3 comments

以下のクエリでCUDA_ERROR_MISALIGNED_ADDRESSが発生します。

SELECT id,x INTO test01g FROM regtest_data
 WHERE 72 = ANY(x);
DROP TABLE IF EXISTS regtest_data;
CREATE TABLE regtest_data (
  id    int,
  x     int[]
);

SELECT pgstrom.random_setseed(20190630);

INSERT INTO regtest_data (
  SELECT x, array[pgstrom.random_int(2,0,1000),
                  pgstrom.random_int(2,0,1000),
                  pgstrom.random_int(2,0,1000)]
    FROM generate_series(1,5000) x
);
SET pg_strom.enabled = on;
SELECT id,x INTO test01g FROM regtest_data
 WHERE 72 = ANY(x);

参考:EXPLAIN結果

                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
 Custom Scan (GpuScan) on regtest_data  (cost=100.00..147.11 rows=20 width=37)
   GPU Projection: id, x
   GPU Scan Quals: (72 = ANY (x)) [rows: 5000 -> 20]
(3 rows)

あらー。PostgreSQLの配列型ってヘッダ1バイトの後ろにデータが詰まってる事もあるから、油断するとすぐmisalignedなっちゃうのよね。。。

325b6b4d187d7473399c7c623db7c132650a5a08 で修正。

スカラ―値ならアライメントが保証されているんですが、配列の要素として int4 などインラインデータ型が参照される時にアライン保証がないという話でした。

確認できました。クローズします。