heterodb/pg-strom

numeric型と比較演算子が2個以上使われていると組み合わさるとCUDA_ERROR_MISALIGNED_ADDRESS

Closed this issue · 2 comments

0-kaz commented

クエリ:

SELECT id, x = y eq, x <> y ne
  FROM rt_numeric
 WHERE id > 0;

発生したメッセージ

ERROR:  gpu_service.c:1952  failed on cuEventSynchronize: CUDA_ERROR_MISALIGNED_ADDRESS
HINT:  device at GPU-0, function at gpuservHandleGpuTaskExec

全体クエリ

---
--- Micro test cases for text / varchar operators / functions
---
SET pg_strom.regression_test_mode = on;
SET client_min_messages = error;
DROP SCHEMA IF EXISTS regtest_dtype_text_temp CASCADE;
CREATE SCHEMA regtest_dtype_text_temp;
RESET client_min_messages;

---
--- check database encoding (must be UTF-8)
---
SELECT getdatabaseencoding();

--- test database creation
SET search_path = regtest_dtype_text_temp,public;
--- SELECT pgstrom.random_setseed(20190616);

CREATE TABLE rt_int (
  id   int,
  myint4    int4,
  myint8    int8
);
INSERT INTO rt_int (
  SELECT x
  , pgstrom.random_int(0, -32000, 32000)
  , pgstrom.random_int(0, -32000, 32000)
    FROM generate_series(1,2000) x);

-- force to use GpuScan, instead of SeqScan
SET enable_seqscan = off;
-- not to print kernel source code
SET pg_strom.debug_kernel_source = off;

--- enable pg_strom
SET pg_strom.enabled = on;
EXPLAIN SELECT id, myint4+myint8 as v1
FROM rt_int
WHERE id > 1;
SELECT id, myint4+myint8 as v1
FROM rt_int
WHERE id > 1;


CREATE TABLE rt_numeric (
  id    int,
  x     numeric,
  y     numeric,
  z     numeric(12,3)
);
INSERT INTO rt_numeric (
  SELECT x, 
            pgstrom.random_float(1,  -32000.0,  32000.0),
            pgstrom.random_float(1,    -20000,    20000)::numeric,
            pgstrom.random_int(1, -2000000000,
                                   2000000000)::numeric / 1000::numeric
    FROM generate_series(1,3000) x);

-- force to use GpuScan, instead of SeqScan
SET enable_seqscan = off;
-- not to print kernel source code
SET pg_strom.debug_kernel_source = off;

SET pg_strom.enabled = on;
EXPLAIN (costs off, verbose)
SELECT id, x = y eq, y = z eq2
  FROM rt_numeric
 WHERE id > 0;

-- 1件ならば問題なし
SELECT id, x = y eq
  FROM rt_numeric
 WHERE id > 0;

SELECT id, x = y eq, y = z eq2
  FROM rt_numeric
 WHERE id > 0;
kaigai commented

numericの比較関数で、戻り値がboolを期待しているところ、numeric型を返すというチョンボでした。
このクエリだと、結果列の一個目がint4なのでたまたまアライメントの問題は無かった(データは化け化けのはず)の
ですが、二個目がint4 + boolでアラインされているため、アライメントの不正でGPU kernelが落ちたようです。

0-kaz commented

e60b779

解消確認しました。