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が落ちたようです。