device_memory = vkAllocateMemory(device = logical_device, pAllocateInfo = memAllocInfo, pAllocator = 0, ) logging.info('Make the GPU memory visible to CPU') _ppData = vkMapMemory(device = logical_device, memory = device_memory, offset = 0, size = mem_size, flags = 0) # ************************************************************************************************ logging.info('Initialize the memory with random integer using _ppData, which is visible to CPU') ppData = ffi.from_buffer("int[]",_ppData) print('** Assign random int between -1000 and 1000') for x in range(buffer_length*2): ppData[x] = random.randint(-1000,1000) # Further modify gpu memory (using numpy) from CPU. Finally, assign 4000 to input buffer and # 0 to output buffer. arr = np.frombuffer(_ppData,dtype=np.int32) print('** Numpy array:') print(arr) arr[2] = 100 print('** Buffer after assigning 100 to index 2:') print('Numpy array: %r'%arr) print(ppData[2])
def _new(ctype, **kwargs): _type = ffi.typeof(ctype) # keep only valued kwargs kwargs = {k: kwargs[k] for k in kwargs if kwargs[k]} # cast pointer ptrs = {} pfns = {} pcs = {} for k, v in kwargs.items(): # convert tuple pair to dict ktype = dict(_type.fields)[k].type if k == 'pCode': pcs[k] = ffi.cast('uint32_t*', ffi.from_buffer(v)) elif k.startswith('pfn'): pfn_name = _get_pfn_name(ctype) mod = sys.modules[__name__] setattr(mod, '_internal_' + pfn_name, v) pfns[k] = getattr(mod, '_external_' + pfn_name) elif ktype.kind == 'pointer': ptrs[k] = _cast_ptr(v, ktype) # init object init = dict(kwargs, **{k: v for k, (v, _) in ptrs.items()}) init.update(pfns) init.update(pcs) ret = ffi.new(_type.cname + '*', init)[0]