GPUでlogの計算結果が不正
Closed this issue · 7 comments
0-kaz commented
logの計算結果が不正になります。
SELECT id, log(@a)
INTO test03p
FROM rt_data
WHERE id > 0;
結果の比較
id | gpu_result | cpu_result
------+-----------------------+-----------------------
1857 | 4.18872352220267 | 1.8191395119109728
1858 | -0.773075682166485 | -0.3357425028584966
1859 | 3.5137997314326848 | 1.5260238338743433
1860 | 3.7243584646643333 | 1.617468329833387
1861 | 4.275122519146093 | 1.8566621195254773
1862 | 4.335088098893453 | 1.8827048399138853
1863 | 4.218546039302069 | 1.8320912665237072
1864 | 3.3228816382142163 | 1.443109159494072
1865 | 1.8774897777046273 | 0.8153834502868826
1866 | 4.3556516111355075 | 1.8916354598091594
1867 | 3.6577153110306333 | 1.5885255759536405
1868 | 3.6802494540950446 | 1.5983120299409328
1869 | 3.987606352808934 | 1.7317954350272715
1870 | 3.9018373587564277 | 1.6945464341918755
結果比較クエリ
select g.id,g.log as gpu_result,p.log as cpu_result from test03g g, test03p p WHERE g.id = p.id AND @(g.log - p.log) > 0.00001;
全体クエリ
SET pg_strom.regression_test_mode = on;
SET client_min_messages = error;
DROP SCHEMA IF EXISTS regtest_dfunc_math_temp CASCADE;
CREATE SCHEMA regtest_dfunc_math_temp;
RESET client_min_messages;
CREATE TABLE rt_data (
id int,
a float8 -- values between -1.0 and 1.0
);
SELECT pgstrom.random_setseed(20190610);
INSERT INTO rt_data (
SELECT x,
pgstrom.random_float(1, -100.0, 100.0)
FROM generate_series(1,2000) x);
SET pg_strom.enabled = on;
EXPLAIN(verbose)
SELECT id, log(@a)
INTO test03g
FROM rt_data
WHERE id > 0;
SELECT id, log(@a)
INTO test03g
FROM rt_data
WHERE id > 0;
SET pg_strom.enabled = off;
SELECT id, log(@a)
INTO test03p
FROM rt_data
WHERE id > 0;
0-kaz commented
dlog10でも同様に値不一致発生
gpu_result | cpu_result
---------------------+---------------------
6.506057044571892 | 2.8255446734053518
6.013274292111318 | 2.611531843234628
5.82887909844951 | 2.531450028137823
6.569015521748754 | 2.8528871926322945
6.505775479921639 | 2.825422391431448
6.26766856470166 | 2.7220138720484055
5.0929267628081805 | 2.2118299898249845
5.606565950342345 | 2.4349006546603413
6.536715443598813 | 2.8388594469267314
5.433663446126519 | 2.3598100511721545
0-kaz commented
sin関数でも値不一致発生
gpu_result | cpu_result
-------------------------+------------------------
0.9860931274365792 | -0.1661936942917703
-0.8637871732780296 | -0.5038568440344454
0.6691453044862408 | 0.7431315909608581
0.9644891756736244 | 0.2641223769551014
0.9901306762041981 | -0.14014722273173047
0.9381171801641532 | 0.34631799878270486
0.47925026278390903 | 0.8776782927824717
0.33055356669023656 | 0.9437872321388774
0.21213967707174317 | -0.9772393552307933
0.7943059427891177 | -0.6075179579649402
kaigai commented
pgfn_sin()
を確認したら、コサインを計算していました…。
pgfn_log()
も、対数の底の違いですね…。
急いで移植したので慌てていたようです。
kaigai commented
80fc61d7879f08faad6736e3f09f945c4044310e
で修正しました。
0-kaz commented
確認したところ、log,dlog10,sinは一致していましたが、dlog1で発生しておりました(デグレード?)
SELECT g.dlog1, p.dlog1
FROM test03g g JOIN test03p p ON g.id = p.id
WHERE @(g.dlog1 - p.dlog1) > 0.000001;
dlog1 | dlog1
---------------------+---------------------
2.9643775406446657 | 6.825731535094758
2.549124574110272 | 5.869576244531108
2.254515958884451 | 5.191214838844513
2.9637022188648423 | 6.824176549231562
2.855262661197327 | 6.574485240255473
2.419403411919831 | 5.570882230225536
1.7833664528952506 | 4.106353009782272
2.9478770013626368 | 6.787737639317595
2.661932580617754 | 6.129326278685611
2.629185631808387 | 6.053923642516124
2.3656996139568705 | 5.447224665598859
2.986200791491819 | 6.875981427176082
2.7527630826929057 | 6.33847123875302
2.8802042511646997 | 6.631915373509916
1.990740226672146 | 4.583848769958871
kaigai commented
a3799fbb91a64c254b27b600c8ad86a9fa8b8ec3
で修正しました。ありがとうございます。
0-kaz commented
修正確認しました。ありがとうございました。