Beispiel #1
0
void
pgstrom_setup_opencl_devinfo(List *dev_list)
{
	pgstrom_platform_info  *pl_info;
	pgstrom_platform_info  *pl_info_sh;
	pgstrom_device_info **dev_array;
	ListCell   *cell;
	Size		length;
	int			index;

	Assert(devinfo_shm_values->num_devices == 0);
	Assert(TopShmemContext != NULL);

	/* copy platform info into shared memory segment */
	pl_info = ((pgstrom_device_info *) linitial(dev_list))->pl_info;
	length = offsetof(pgstrom_platform_info, buffer[pl_info->buflen]);
	pl_info_sh = pgstrom_shmem_alloc(TopShmemContext, length);
	if (!pl_info_sh)
		elog(ERROR, "out of shared memory");
	memcpy(pl_info_sh, pl_info, length);
	PLDEVINFO_SHIFT(pl_info_sh, pl_info, pl_profile);
	PLDEVINFO_SHIFT(pl_info_sh, pl_info, pl_version);
	PLDEVINFO_SHIFT(pl_info_sh, pl_info, pl_name);
	PLDEVINFO_SHIFT(pl_info_sh, pl_info, pl_vendor);
	PLDEVINFO_SHIFT(pl_info_sh, pl_info, pl_extensions);

	/* copy device info into shared memory segment */
	length = sizeof(pgstrom_device_info *) * list_length(dev_list);
	dev_array = pgstrom_shmem_alloc(TopShmemContext, length);
	if (!dev_array)
		elog(ERROR, "out of shared memory");

	index = 0;
	foreach (cell, dev_list)
	{
		pgstrom_device_info	*dev_info = lfirst(cell);
		pgstrom_device_info *dest;

		length = offsetof(pgstrom_device_info, buffer[dev_info->buflen]);
		dest = pgstrom_shmem_alloc(TopShmemContext, length);
		if (!dest)
			elog(ERROR, "out of shared memory");
		memcpy(dest, dev_info, length);

		/* pointer adjustment */
		dest->pl_info = pl_info_sh;
		PLDEVINFO_SHIFT(dest, dev_info, dev_device_extensions);
		PLDEVINFO_SHIFT(dest, dev_info, dev_name);
		PLDEVINFO_SHIFT(dest, dev_info, dev_opencl_c_version);
		PLDEVINFO_SHIFT(dest, dev_info, dev_profile);
		PLDEVINFO_SHIFT(dest, dev_info, dev_vendor);
		PLDEVINFO_SHIFT(dest, dev_info, dev_version);
		PLDEVINFO_SHIFT(dest, dev_info, driver_version);

		dev_array[index++] = dest;
	}
Beispiel #2
0
/*
 * Debugging facilities for shmem.c
 */
Datum
pgstrom_shmem_alloc_func(PG_FUNCTION_ARGS)
{
#ifdef PGSTROM_DEBUG
	Size	size = PG_GETARG_INT64(0);
	void   *address;

	address = pgstrom_shmem_alloc(size);

	PG_RETURN_INT64((Size) address);
#else
	elog(ERROR, "%s is not implemented for production release", __FUNCTION__);

	PG_RETURN_NULL();
#endif
}