コード例 #1
0
ファイル: gpuarrow.py プロジェクト: jcrist/pygdf
 def open_parser(schema_ptr, schema_len):
     "context to destroy the parser"
     _logger.debug('open IPCParser')
     ipcparser = libgdf.gdf_ipc_parser_open(schema_ptr, schema_len)
     yield ipcparser
     _logger.debug('close IPCParser')
     libgdf.gdf_ipc_parser_close(ipcparser)
コード例 #2
0
ファイル: gpuarrow.py プロジェクト: xennygrimmato/pygdf
 def open_parser(schema_ptr, schema_len):
     "context to destroy the parser"
     _logger.debug('open IPCParser')
     ipcparser = libgdf.gdf_ipc_parser_open(schema_ptr, schema_len)
     yield ipcparser
     _logger.debug('close IPCParser')
     libgdf.gdf_ipc_parser_close(ipcparser)
コード例 #3
0
ファイル: gpuarrow.py プロジェクト: michael-balint/pygdf
 def open_parser(devptr):
     "context to destroy the parser"
     _logger.debug('open IPCParser')
     ipcparser = libgdf.gdf_ipc_parser_open(devptr)
     yield ipcparser
     _logger.debug('close IPCParser')
     libgdf.gdf_ipc_parser_close(ipcparser)
コード例 #4
0
ファイル: test_ipc.py プロジェクト: mattip/pearu-sandbox
def test_ipc():
    schema_bytes = b'\xa8\x01\x00\x00\x10\x00\x00\x00\x0c\x00\x0e\x00\x06\x00\x05\x00\x08\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x02\x00\x10\x00\x00\x00\x00\x00\n\x00\x08\x00\x00\x00\x04\x00\x00\x00\n\x00\x00\x00\x04\x00\x00\x00\x03\x00\x00\x00\x18\x01\x00\x00p\x00\x00\x00\x04\x00\x00\x00\x08\xff\xff\xff\x00\x00\x01\x03@\x00\x00\x00$\x00\x00\x00\x14\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00$\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x08\x00\x06\x00\x06\x00\x00\x00\x00\x00\x02\x00\xe8\xfe\xff\xff@\x00\x01\x00\xf0\xfe\xff\xff\x01\x00\x02\x00\x06\x00\x00\x00weight\x00\x00\x14\x00\x1e\x00\x08\x00\x06\x00\x07\x00\x0c\x00\x10\x00\x14\x00\x18\x00\x00\x00\x14\x00\x00\x00\x00\x00\x01\x05|\x00\x00\x00T\x00\x00\x00\x18\x00\x00\x00D\x00\x00\x000\x00\x00\x00\x00\x00\n\x00\x14\x00\x08\x00\x04\x00\x00\x00\n\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xff\xff\xff\x00\x00\x00\x01 \x00\x00\x00\x03\x00\x00\x000\x00\x00\x00$\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x00\x00|\xff\xff\xff\x08\x00\x01\x00\x08\x00\x08\x00\x06\x00\x00\x00\x08\x00\x00\x00\x00\x00 \x00\x94\xff\xff\xff\x01\x00\x02\x00\x04\x00\x00\x00name\x00\x00\x00\x00\x14\x00\x18\x00\x08\x00\x06\x00\x07\x00\x0c\x00\x00\x00\x10\x00\x14\x00\x00\x00\x14\x00\x00\x00\x00\x00\x01\x02L\x00\x00\x00$\x00\x00\x00\x14\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x000\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x08\x00\x0c\x00\x08\x00\x07\x00\x08\x00\x00\x00\x00\x00\x00\x01 \x00\x00\x00\xf8\xff\xff\xff \x00\x01\x00\x08\x00\x08\x00\x04\x00\x06\x00\x08\x00\x00\x00\x01\x00\x02\x00\x03\x00\x00\x00idx\x00\xc8\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x14\x00\x06\x00\x05\x00\x08\x00\x0c\x00\x0c\x00\x00\x00\x00\x02\x02\x00\x14\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x08\x00\x12\x00\x08\x00\x04\x00\x08\x00\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x18\x00\x0c\x00\x04\x00\x08\x00\n\x00\x00\x00d\x00\x00\x00\x10\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x0b\x00\x00\x00\x0f\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00orangeapplepeargrape\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    cpu_data = np.ndarray(shape=len(schema_bytes), dtype=np.byte,
                          buffer=bytearray(schema_bytes))

    # Use GDF IPC parser
    schema_ptr = ffi.cast("void*", cpu_data.ctypes.data)

    ipch = libgdf.gdf_ipc_parser_open(schema_ptr, cpu_data.size)
    if libgdf.gdf_ipc_parser_failed(ipch):
        print(libgdf.gdf_ipc_parser_get_error(ipch))

    jsonraw = libgdf.gdf_ipc_parser_get_schema_json(ipch)
    jsontext = ffi.string(jsonraw).decode()
    json_schema = json.loads(jsontext)

    pprint(json_schema)

    recordbatches_bytes = b'\x1c\x01\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x16\x00\x06\x00\x05\x00\x08\x00\x0c\x00\x0c\x00\x00\x00\x00\x03\x02\x00\x18\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x18\x00\x0c\x00\x04\x00\x08\x00\n\x00\x00\x00\xac\x00\x00\x00\x10\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x14\x00\x00\x00\x15\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\x0c\x00\x00\x00\r\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x93\xb7<\xac*\xde?\x00Y\x94@"\x0eo?\xf8+\xee\xac\xf2#\xdc?\xa4\xcauw68\xe2?\xf8\xaa\xc9\x9f*\x9f\xda?\xe0\x1e\x1b-\x8b\xa4\xd7?\xe6y\x8a\x9b\xe4<\xef?\x08\x89\xc4.0W\xc5?h\xa5\x0f\x14\xa2\xe3\xbb?\xc0\xa9/\x8f\xeap\xb8?\x0c7\xed\x99fc\xda?:\tA.\xc6g\xda?\x1c\x1f)\xfd\x03\n\xc1?\xfe\x1e\xf9(/\xf0\xe3?\x08h\x99\x05\x81m\xe7?\xa0\xa8=\xfc\x96\x93\xcd?x\x8b\xf8v\xbe_\xc8?\xa2\xd9Zg\xd9\xb9\xed?;\xdb\xa6\xfas\xdb\xed?\xd8\xc9\xfcA-\xcd\xdd?@\xe27`\x0cQ\x94?d\x11:-\x8e\xcf\xd9?\xc9S\xde\xff\xbbN\xe5?\xe0o(\xf4s?\xba?\x0bq\xb9j%o\xeb?\x10\xe8\xa1t\t\x9b\xcb?\xa5\xf0\x15\t\x1ep\xed?\xc7\xb2~\x02\x82l\xef?0\xe6\xa8g\xec\x82\xc3?\xe0\xc6\xe8\xb1\xc2~\xd6?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    rb_cpu_data = np.ndarray(shape=len(recordbatches_bytes), dtype=np.byte,
                             buffer=bytearray(recordbatches_bytes))
    rb_gpu_data = cuda.to_device(rb_cpu_data)
    del cpu_data

    devptr = ffi.cast("void*", rb_gpu_data.device_ctypes_pointer.value)
    libgdf.gdf_ipc_parser_open_recordbatches(ipch, devptr, rb_gpu_data.size)

    if libgdf.gdf_ipc_parser_failed(ipch):
        print(libgdf.gdf_ipc_parser_get_error(ipch))

    jsonraw = libgdf.gdf_ipc_parser_get_layout_json(ipch)
    jsontext = ffi.string(jsonraw).decode()
    json_rb = json.loads(jsontext)
    pprint(json_rb)

    offset = libgdf.gdf_ipc_parser_get_data_offset(ipch)

    libgdf.gdf_ipc_parser_close(ipch)

    # Check
    dicts = json_schema['dictionaries']
    assert len(dicts) == 1
    dictdata = dicts[0]['data']['columns'][0]['DATA']
    assert set(dictdata) == {'orange', 'apple', 'pear', 'grape'}

    gpu_data = rb_gpu_data[offset:]

    schema_fields = json_schema['schema']['fields']
    assert len(schema_fields) == 3
    field_names = [f['name'] for f in schema_fields]
    assert field_names == ['idx', 'name', 'weight']

    # check the dictionary id in schema
    assert schema_fields[1]['dictionary']['id'] == dicts[0]['id']

    # Get "idx" column
    idx_buf_off = json_rb[0]['data_buffer']['offset']
    idx_buf_len = json_rb[0]['data_buffer']['length']
    idx_buf = gpu_data[idx_buf_off:][:idx_buf_len]
    assert json_rb[0]['dtype']['name'] == 'INT32'
    idx_size = json_rb[0]['length']
    assert idx_size == 30
    idx_data = np.ndarray(shape=idx_size, dtype=np.int32,
                          buffer=idx_buf.copy_to_host())
    print(idx_data)

    # Get "name" column
    name_buf_off = json_rb[1]['data_buffer']['offset']
    name_buf_len = json_rb[1]['data_buffer']['length']
    name_buf = gpu_data[name_buf_off:][:name_buf_len]
    assert json_rb[1]['dtype']['name'] == 'DICTIONARY'
    name_size = json_rb[1]['length']
    name_data = np.ndarray(shape=name_size, dtype=np.int32,
                           buffer=name_buf.copy_to_host())
    print(name_data)

    # Get "name" column
    weight_buf_off = json_rb[2]['data_buffer']['offset']
    weight_buf_len = json_rb[2]['data_buffer']['length']
    weight_buf = gpu_data[weight_buf_off:][:weight_buf_len]
    assert json_rb[2]['dtype']['name'] == 'DOUBLE'
    weight_size = json_rb[2]['length']
    weight_data = np.ndarray(shape=weight_size, dtype=np.float64,
                             buffer=weight_buf.copy_to_host())
    print(weight_data)

    # verify data
    sortedidx = np.argsort(idx_data)
    idx_data = idx_data[sortedidx]
    name_data = name_data[sortedidx]
    weight_data = weight_data[sortedidx]

    got_iter = zip(idx_data, name_data, weight_data)
    for expected, got in zip(get_expected_values(), got_iter):
        assert expected[0] == got[0]
        assert expected[1] == dictdata[got[1]]
        assert expected[2] == got[2]
コード例 #5
0
ファイル: test_ipc.py プロジェクト: xiaolin1990/cudf
def test_ipc():

    batch = make_batch()
    schema_bytes = batch.schema.serialize().to_pybytes()
    recordbatches_bytes = batch.serialize().to_pybytes()

    cpu_data = np.ndarray(shape=len(schema_bytes),
                          dtype=np.byte,
                          buffer=bytearray(schema_bytes))

    # Use GDF IPC parser
    schema_ptr = ffi.cast("void*", cpu_data.ctypes.data)
    ipch = libgdf.gdf_ipc_parser_open(schema_ptr, cpu_data.size)

    if libgdf.gdf_ipc_parser_failed(ipch):
        assert 0, str(ffi.string(libgdf.gdf_ipc_parser_get_error(ipch)))
    jsonraw = libgdf.gdf_ipc_parser_get_schema_json(ipch)
    jsontext = ffi.string(jsonraw).decode()
    json_schema = json.loads(jsontext)
    print('json_schema:')
    pprint(json_schema)

    rb_cpu_data = np.ndarray(shape=len(recordbatches_bytes),
                             dtype=np.byte,
                             buffer=bytearray(recordbatches_bytes))
    rb_gpu_data = rmm.to_device(rb_cpu_data)
    del cpu_data

    devptr = ffi.cast("void*", rb_gpu_data.device_ctypes_pointer.value)

    libgdf.gdf_ipc_parser_open_recordbatches(ipch, devptr, rb_gpu_data.size)

    if libgdf.gdf_ipc_parser_failed(ipch):
        assert 0, str(ffi.string(libgdf.gdf_ipc_parser_get_error(ipch)))

    jsonraw = libgdf.gdf_ipc_parser_get_layout_json(ipch)
    jsontext = ffi.string(jsonraw).decode()
    json_rb = json.loads(jsontext)
    print('json_rb:')
    pprint(json_rb)

    offset = libgdf.gdf_ipc_parser_get_data_offset(ipch)

    libgdf.gdf_ipc_parser_close(ipch)

    # Check
    dicts = json_schema['dictionaries']
    assert len(dicts) == 1
    dictdata = dicts[0]['data']['columns'][0]['DATA']
    assert set(dictdata) == {'orange', 'apple', 'pear', 'grape'}

    gpu_data = rb_gpu_data[offset:]

    schema_fields = json_schema['schema']['fields']
    assert len(schema_fields) == 3
    field_names = [f['name'] for f in schema_fields]
    assert field_names == ['idx', 'name', 'weight']

    # check the dictionary id in schema
    assert schema_fields[1]['dictionary']['id'] == dicts[0]['id']

    # Get "idx" column
    idx_buf_off = json_rb[0]['data_buffer']['offset']
    idx_buf_len = json_rb[0]['data_buffer']['length']
    idx_buf = gpu_data[idx_buf_off:][:idx_buf_len]
    assert json_rb[0]['dtype']['name'] == 'INT32'
    idx_size = json_rb[0]['length']
    assert idx_size == 30
    idx_data = np.ndarray(shape=idx_size,
                          dtype=np.int32,
                          buffer=idx_buf.copy_to_host())
    print('idx_data:')
    print(idx_data)

    # Get "name" column
    name_buf_off = json_rb[1]['data_buffer']['offset']
    name_buf_len = json_rb[1]['data_buffer']['length']
    name_buf = gpu_data[name_buf_off:][:name_buf_len]
    assert json_rb[1]['dtype']['name'] == 'DICTIONARY'
    name_size = json_rb[1]['length']
    name_data = np.ndarray(shape=name_size,
                           dtype=np.int32,
                           buffer=name_buf.copy_to_host())
    print('name_data:')
    print(name_data)

    # Get "weight" column
    weight_buf_off = json_rb[2]['data_buffer']['offset']
    weight_buf_len = json_rb[2]['data_buffer']['length']
    weight_buf = gpu_data[weight_buf_off:][:weight_buf_len]
    assert json_rb[2]['dtype']['name'] == 'DOUBLE'
    weight_size = json_rb[2]['length']
    weight_data = np.ndarray(shape=weight_size,
                             dtype=np.float64,
                             buffer=weight_buf.copy_to_host())
    print('weight_data:')
    print(weight_data)

    # verify data
    sortedidx = np.argsort(idx_data)
    idx_data = idx_data[sortedidx]
    name_data = name_data[sortedidx]
    weight_data = weight_data[sortedidx]

    got_iter = zip(idx_data, name_data, weight_data)
    for expected, got in zip(get_expected_values(), got_iter):
        assert expected[0] == got[0]
        assert expected[1] == dictdata[got[1]]
        assert expected[2] == got[2]
コード例 #6
0
def test_ipc():
    # make gpu array
    TESTDATA = b"\x00\x01\x00\x00\x10\x00\x00\x00\x0c\x00\x0e\x00\x06\x00\x05\x00\x08\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x00\x10\x00\x00\x00\x00\x00\n\x00\x08\x00\x00\x00\x04\x00\x00\x00\n\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00l\x00\x00\x00\x04\x00\x00\x00\xb0\xff\xff\xff\x00\x00\x01\x038\x00\x00\x00\x1c\x00\x00\x00\x14\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x1c\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x9a\xff\xff\xff\x00\x00\x01\x00\x8c\xff\xff\xff \x00\x01\x00\x94\xff\xff\xff\x01\x00\x02\x00\x08\x00\x00\x00dest_lon\x00\x00\x00\x00\x14\x00\x18\x00\x08\x00\x06\x00\x07\x00\x0c\x00\x00\x00\x10\x00\x14\x00\x00\x00\x14\x00\x00\x00\x00\x00\x01\x03H\x00\x00\x00$\x00\x00\x00\x14\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00,\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x08\x00\x06\x00\x06\x00\x00\x00\x00\x00\x01\x00\xf8\xff\xff\xff \x00\x01\x00\x08\x00\x08\x00\x04\x00\x06\x00\x08\x00\x00\x00\x01\x00\x02\x00\x08\x00\x00\x00dest_lat\x00\x00\x00\x00\xd8\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x16\x00\x06\x00\x05\x00\x08\x00\x0c\x00\x0c\x00\x00\x00\x00\x03\x01\x00\x18\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x18\x00\x0c\x00\x04\x00\x08\x00\n\x00\x00\x00|\x00\x00\x00\x10\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\xa7\x06B\x91\xa7\x06B\x91\xa7\x06B\xc4\xcd\xdfA\x91\xa7\x06B\xc4\xcd\xdfA\xe7\xea\nB\x9c\xb3\x1cB\xe7\xea\nB\x9c\xb3\x1cB\xe7\xea\nB]n\xe3A\xe7\xea\nB\xd9$\'Brc\x03BL\x8a\xffArc\x03B\xd9$\'Brc\x03BL\x8a\xffArc\x03Bt@\x06B\x03o\x1fB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00C\xa5\xcb\xc2C\xa5\xcb\xc2C\xa5\xcb\xc2\x06\x11\xa5\xc2C\xa5\xcb\xc2\x06\x11\xa5\xc2\xd0r\xb8\xc2\x1eV\x99\xc2\xd0r\xb8\xc2\x1eV\x99\xc2\xd0r\xb8\xc2\xce\xa1\xa2\xc2\xd0r\xb8\xc2>\x81\xaf\xc2\x1b\xb4\xc1\xc2ag\xcc\xc2\x1b\xb4\xc1\xc2>\x81\xaf\xc2\x1b\xb4\xc1\xc2ag\xcc\xc2\x1b\xb4\xc1\xc2\xd1\x81\xad\xc2\x81U\xd1\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    cpu_data = np.ndarray(shape=len(TESTDATA),
                          dtype=np.byte,
                          buffer=bytearray(TESTDATA))
    gpu_data = cuda.to_device(cpu_data)
    del cpu_data

    # Use GDF IPC parser
    devptr = ffi.cast("void*", gpu_data.device_ctypes_pointer.value)
    ipcparser = libgdf.gdf_ipc_parser_open(devptr)
    assert not libgdf.gdf_ipc_parser_failed(ipcparser)
    assert not ffi.string(libgdf.gdf_ipc_parser_get_error(ipcparser))

    # get schema as json
    jsonraw = libgdf.gdf_ipc_parser_to_json(ipcparser)
    jsontext = ffi.string(jsonraw).decode()
    jsonparsed = json.loads(jsontext)
    pprint(jsonparsed)

    dataptr = libgdf.gdf_ipc_parser_get_data_offset(ipcparser)
    dataptr = int(ffi.cast('uint64_t', dataptr))
    data_region = gpu_data[dataptr:]
    print(data_region.shape)

    def get_column(schema):
        offset = schema['data_buffer']['offset']
        raw_size = schema['data_buffer']['length']
        size = schema['length']
        assert schema['dtype']['bitwidth'] == 32
        assert schema['dtype']['name'] == 'FloatingPoint'
        raw_data_col1 = data_region[offset:offset + raw_size]
        assert raw_data_col1.size == raw_size

        dtype = np.dtype(np.float32)
        itemsize = dtype.itemsize
        ary = DeviceNDArray(shape=(raw_size // itemsize, ),
                            strides=(itemsize, ),
                            dtype=dtype,
                            gpu_data=raw_data_col1.gpu_data)
        hary = ary[:size].copy_to_host()
        return hary

    # Get first column
    schema_col1 = jsonparsed[0]
    name_col1 = schema_col1['name']
    assert name_col1 == 'dest_lat'

    dest_lat = get_column(schema_col1)

    # Get second column
    schema_col2 = jsonparsed[1]
    name_col2 = schema_col2['name']
    assert name_col2 == 'dest_lon'

    dest_lon = get_column(schema_col2)

    libgdf.gdf_ipc_parser_close(ipcparser)

    # Check data integrity
    np.testing.assert_array_less(dest_lat, 42)
    np.testing.assert_array_less(27, dest_lat)
    np.testing.assert_array_less(dest_lon, -76)
    np.testing.assert_array_less(-105, dest_lon)