heterodb / pg-strom

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

(JP) numericデータ型のGpuPreAggスキャンでOpenCL Execution Error #95

Closed onlyindreams closed 9 years ago

onlyindreams commented 9 years ago

最新のpg_stromにアップグレードしたらnumericデータ型のGpuPreAggスキャンで以下のエラーが発生するようになりました。デグレードバグでしょうか?

ERROR:  PG-Strom: OpenCL execution error (build program failure)
DETAIL:  :1664:14: error: unknown type name 'kern_toastbuf'
                                        __global kern_toastbuf *ktoast,
                                                 ^
        :3005:3: error: implicit declaration of function 'pg_numeric_vstore' is invalid in C99
          pg_numeric_vstore(kds_src,kds_in,errcode,3,rowidx_out,KVAR_2);
          ^

*再現クエリ

drop table if exists errtbl;
create table errtbl as select generate_series(1,1000)::integer as id,random()::numeric as nume_x;
set pg_strom.debug_force_gpupreagg to on;
set pg_strom.enabled=on;
select avg(nume_x) from errtbl;
regress=# explain verbose select avg(nume_x) from errtbl;
                                               QUERY PLAN                                                
---------------------------------------------------------------------------------------------------------
 Aggregate  (cost=506.03..506.04 rows=1 width=11)
   Output: pgstrom.avg((pgstrom.nrows((nume_x IS NOT NULL))), (pgstrom.psum(nume_x)))
   ->  Custom (GpuPreAgg)  (cost=500.00..506.03 rows=1 width=72)
         Output: NULL::integer, NULL::numeric, pgstrom.nrows((nume_x IS NOT NULL)), pgstrom.psum(nume_x)
         Bulkload: On
         ->  Custom (GpuScan) on public.errtbl  (cost=0.00..6.00 rows=1000 width=11)
               Output: id, nume_x
 Planning time: 0.195 ms
(8 rows)
ERROR:  PG-Strom: OpenCL execution error (build program failure)
        #ifndef PG_BYTEA_TYPE_DEFINED
        STROMCL_VARLENA_TYPE_TEMPLATE(bytea)
        #endif
        #ifndef PG_INT4_TYPE_DEFINED
        STROMCL_SIMPLE_TYPE_TEMPLATE(int4,cl_int)
        #endif
        #ifndef PG_NUMERIC_TYPE_DEFINED
        STROMCL_VARLENA_TYPE_TEMPLATE(numeric)
        #endif

        static bool
        gpupreagg_qual_eval(__private cl_int *errcode,
                            __global kern_parambuf *kparams,
                            __global kern_data_store *kds,
                            __global kern_data_store *ktoast,
                            size_t kds_index)
        {
          return true;
        }

        static cl_int
        gpupreagg_keycomp(__private int *errcode,
                          __global kern_data_store *kds,
                          __global kern_data_store *ktoast,
                          size_t x_index,
                          size_t y_index)
        {
          pg_int4_t comp;

          return 0;
        }

        static void
        gpupreagg_aggcalc(__private cl_int *errcode,
                          cl_int resno,
                          __local pagg_datum *accum,
                          __local pagg_datum *newval)
        {
          switch (resno)
          {
          case 2:
            GPUPREAGG_AGGCALC_PSUM_INT(errcode,accum,newval);
            break;
          case 3:
            GPUPREAGG_AGGCALC_PSUM_NUMERIC(errcode,accum,newval);
            break;
          default:
            break;
          }
        }

        static void
        gpupreagg_projection(__private cl_int *errcode,
                    __global kern_parambuf *kparams,
                    __global kern_data_store *kds_in,
                    __global kern_data_store *kds_src,
                    __global void *ktoast,
                    size_t rowidx_in, size_t rowidx_out)
        {
          pg_numeric_t KVAR_2 = pg_numeric_vref(kds_in,ktoast,errcode,1,rowidx_in);
          pg_int4_t temp_int4;

          /* projection for resource 0 */
          pg_common_vstore(kds_src,kds_in,errcode,0,rowidx_out,true);
          /* projection for resource 1 */
          pg_common_vstore(kds_src,kds_in,errcode,1,rowidx_out,true);
          /* projection for resource 2 */
          temp_int4.isnull = false;
          if (EVAL(pgfn_numeric_isnotnull(errcode, KVAR_2)))
            temp_int4.value = 1;
          else
            temp_int4.value = 0;
          pg_int4_vstore(kds_src,kds_in,errcode,2,rowidx_out,temp_int4);
          /* projection for resource 3 */
          pg_numeric_vstore(kds_src,kds_in,errcode,3,rowidx_out,KVAR_2);
        }

DETAIL:  :1664:14: error: unknown type name 'kern_toastbuf'
                                        __global kern_toastbuf *ktoast,
                                                 ^
        :3005:3: error: implicit declaration of function 'pg_numeric_vstore' is invalid in C99
          pg_numeric_vstore(kds_src,kds_in,errcode,3,rowidx_out,KVAR_2);
          ^

STATEMENT:  select avg(nume_x) from errtbl;
ERROR:  PG-Strom: OpenCL execution error (build program failure)
#ifndef PG_BYTEA_TYPE_DEFINED
STROMCL_VARLENA_TYPE_TEMPLATE(bytea)
#endif
#ifndef PG_INT4_TYPE_DEFINED
STROMCL_SIMPLE_TYPE_TEMPLATE(int4,cl_int)
#endif
#ifndef PG_NUMERIC_TYPE_DEFINED
STROMCL_VARLENA_TYPE_TEMPLATE(numeric)
#endif

static bool
gpupreagg_qual_eval(__private cl_int *errcode,
                    __global kern_parambuf *kparams,
                    __global kern_data_store *kds,
                    __global kern_data_store *ktoast,
                    size_t kds_index)
{
  return true;
}

static cl_int
gpupreagg_keycomp(__private int *errcode,
                  __global kern_data_store *kds,
                  __global kern_data_store *ktoast,
                  size_t x_index,
                  size_t y_index)
{
  pg_int4_t comp;

  return 0;
}

static void
gpupreagg_aggcalc(__private cl_int *errcode,
                  cl_int resno,
                  __local pagg_datum *accum,
                  __local pagg_datum *newval)
{
  switch (resno)
  {
  case 2:
    GPUPREAGG_AGGCALC_PSUM_INT(errcode,accum,newval);
    break;
  case 3:
    GPUPREAGG_AGGCALC_PSUM_NUMERIC(errcode,accum,newval);
    break;
  default:
    break;
  }
}

static void
gpupreagg_projection(__private cl_int *errcode,
            __global kern_parambuf *kparams,
            __global kern_data_store *kds_in,
            __global kern_data_store *kds_src,
            __global void *ktoast,
            size_t rowidx_in, size_t rowidx_out)
{
  pg_numeric_t KVAR_2 = pg_numeric_vref(kds_in,ktoast,errcode,1,rowidx_in);
  pg_int4_t temp_int4;

  /* projection for resource 0 */
  pg_common_vstore(kds_src,kds_in,errcode,0,rowidx_out,true);
  /* projection for resource 1 */
  pg_common_vstore(kds_src,kds_in,errcode,1,rowidx_out,true);
  /* projection for resource 2 */
  temp_int4.isnull = false;
  if (EVAL(pgfn_numeric_isnotnull(errcode, KVAR_2)))
    temp_int4.value = 1;
  else
    temp_int4.value = 0;
  pg_int4_vstore(kds_src,kds_in,errcode,2,rowidx_out,temp_int4);
  /* projection for resource 3 */
  pg_numeric_vstore(kds_src,kds_in,errcode,3,rowidx_out,KVAR_2);
}

DETAIL:  :1664:14: error: unknown type name 'kern_toastbuf'
                                __global kern_toastbuf *ktoast,
                                         ^
:3005:3: error: implicit declaration of function 'pg_numeric_vstore' is invalid in C99
  pg_numeric_vstore(kds_src,kds_in,errcode,3,rowidx_out,KVAR_2);
  ^
kaigai commented 9 years ago

最新版とは 7ed21b5e8f173992f9b6440073a4e1c5df0de492 を指していますか?

onlyindreams commented 9 years ago

はい、7ed21b5e8f173992f9b6440073a4e1c5df0de492です。

kaigai commented 9 years ago

おかしいな…。 kern_toastbuf という定義自体既に消えてしまっているんだけど。 opencl_common.c は最新? make clean 後でも再現する?

onlyindreams commented 9 years ago

レグレッションテスト用にブランチ切ってマージを繰り返したりしていたのでリポジトリ管理ミスかもしれません。新しくクローンして試してみます

kaigai commented 9 years ago

件の pg_numeric_vstore は以下の定義で作られていて、

/* pg_numeric_vstore() is same as template */ 
STROMCL_SIMPLE_VARSTORE_TEMPLATE(numeric, cl_ulong)

それが↓のように展開されるから、kern_toastbufなんて出てこないハズなんだが…。

#define STROMCL_SIMPLE_VARSTORE_TEMPLATE(NAME,BASE)         \
    static void                                             \
    pg_##NAME##_vstore(__global kern_data_store *kds,       \
                       __global kern_data_store *ktoast,    \
                       __private int *errcode,              \
                       cl_uint colidx,                      \
                       cl_uint rowidx,                      \
                       pg_##NAME##_t datum)                 \
    {                                                       \
        __global Datum *daddr;                              \
        union {                                             \
            BASE        v_base;                             \
            Datum       v_datum;                            \
        } temp;                                             \
        daddr = pg_common_vstore(kds, ktoast, errcode,      \
                                 colidx, rowidx,            \
                                 datum.isnull);             \
        if (daddr)                                          \
        {                                                   \
            temp.v_datum = 0;                               \
            temp.v_base = datum.value;                      \
            *daddr = temp.v_datum;                          \
        }                                                   \
    }
onlyindreams commented 9 years ago

新しくクローンしたら再現しませんでした...すみません。クローズします..

kaigai commented 9 years ago

どんまい :-)

ahase commented 9 years ago

長谷川です。

先ほどの問題ですが、こちらで再現テストをしてみたところ、 Xeon phi のみ以下のエラーで落ちます。

postgres=# select avg(nume_x) from errtbl; LOG: PG-Strom's shared memory segment has not been ready STATEMENT: select avg(nume_x) from errtbl; ERROR: out of shared memory STATEMENT: select avg(nume_x) from errtbl; ERROR: out of shared memory postgres=#

-----Original Message----- From: KaiGai Kohei [mailto:notifications@github.com] Sent: Monday, December 22, 2014 3:47 PM To: pg-strom/devel Subject: Re: devel numericデータ型のGpuPreAggスキャンでOpenCL Execution Error (#95)

どんまい :-)

— Reply to this email directly or view it on GitHub https://github.com/pg-strom/devel/issues/95#issuecomment-67806952 . https://github.com/notifications/beacon/AHBsQ7I8oOqU_aaiKwp9nn0XhHibAM1Eks5nZ7XTgaJpZM4DLH6N.gif

kaigai commented 9 years ago

LOG: PG-Strom's shared memory segment has not been ready

と言っているので、もう少し待っててあげてください。 おそらく、メモリを Page Locked Memory として登録するのに時間がかかっているだけでは。

ahase commented 9 years ago

コーヒー入れてきました。 5分以上たっているはずなのですが、再度、同じエラーになります。

postgres=# select avg(nume_x) from errtbl; LOG: PG-Strom's shared memory segment has not been ready STATEMENT: select avg(nume_x) from errtbl; ERROR: out of shared memory STATEMENT: select avg(nume_x) from errtbl; ERROR: out of shared memory

-----Original Message----- From: KaiGai Kohei [mailto:notifications@github.com] Sent: Monday, December 22, 2014 3:52 PM To: pg-strom/devel Cc: Hasegawa Atsushi(長谷川 篤史) Subject: Re: devel numericデータ型のGpuPreAggスキャンでOpenCL Execution Error (#95)

LOG: PG-Strom's shared memory segment has not been ready

と言っているので、もう少し待っててあげてください。 おそらく、メモリを Page Locked Memory として登録するのに時間がかかっているだけでは。

— Reply to this email directly or view it on GitHub https://github.com/pg-strom/devel/issues/95#issuecomment-67807212 . https://github.com/notifications/beacon/AHBsQ8n4he0PuCmeS-eZxStnzpU6MOkPks5nZ7cbgaJpZM4DLH6N.gif

kaigai commented 9 years ago

ログを見て、本当にPG-Strom用のメモリが確保されているか確認できますか?

すいません、G会議中につき少々反応遅れます。

ahase commented 9 years ago

すみません、私の勘違いです。 存在しないデバイスを指定した場合に上記にエラーになるようです。 GTX980に換装したので、Xeon Phi は存在しないことを忘れてました。