def _parse_metdata(self): "Parse the metadata in the IPC handle" from libgdf_cffi import ffi, libgdf @contextmanager 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) # get void* from the gpu array devptr = ffi.cast("void*", self._gpu_data.device_ctypes_pointer.value) # parse with open_parser(devptr) as ipcparser: # check for failure if libgdf.gdf_ipc_parser_failed(ipcparser): raw_error = libgdf.gdf_ipc_parser_get_error(ipcparser) error = ffi.string(raw_error).decode() _logger.error('IPCParser failed: %s', error) raise MetadataParsingError(error) # get schema as json _logger.debug('IPCParser get metadata as json') jsonraw = libgdf.gdf_ipc_parser_to_json(ipcparser) jsontext = ffi.string(jsonraw).decode() outdct = json.loads(jsontext) # get data offset _logger.debug('IPCParser data region offset') dataoffset = libgdf.gdf_ipc_parser_get_data_offset(ipcparser) dataoffset = int(ffi.cast('uint64_t', dataoffset)) dataptr = self._gpu_data[dataoffset:] return outdct, dataptr
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]
def check_error(ipcparser): if libgdf.gdf_ipc_parser_failed(ipcparser): raw_error = libgdf.gdf_ipc_parser_get_error(ipcparser) error = ffi.string(raw_error).decode() _logger.error('IPCParser failed: %s', error) raise MetadataParsingError(error)
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]
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)