Exemple #1
0
vector * gpu_matrix_vector_sub_scalar(vector * v_x, double alpha) {
    size_t datasize;
    cl_int status;
    vector * output;
    cl_mem buffer_data_x;
    vector_buffer buffer_v_x;
    cl_command_queue cmd_queue;
    cl_kernel kernel;
    cl_event write_buffer_events[1],
             read_buffer_events[1];

    output = malloc(sizeof(vector));
    output->length = v_x->length;
    output->stride = 1;
    output->data = malloc(sizeof(double) * v_x->length);

    datasize = gpu_matrix_vector_datasize(v_x);
    cmd_queue = clCreateCommandQueue(
        context_get(),
        device_get(),
        CL_QUEUE_PROFILING_ENABLE,
        &status
    );
    buffer_data_x = buffers_create(
        CL_MEM_READ_WRITE,
        datasize,
        NULL,
        &status
    );
    buffer_v_x = gpu_matrix_vector_to_vector_buffer(
        v_x, buffer_data_x
    );

    status = clEnqueueWriteBuffer(
        cmd_queue, buffer_data_x,
        CL_TRUE, 0, datasize,
        v_x->data, 0, NULL, write_buffer_events
    );
    clWaitForEvents(1, write_buffer_events);

    gpu_matrix_vector_buffer_sub_scalar_BANG(&buffer_v_x, alpha, cmd_queue);

    // Print write buffer profilling information
    status = clEnqueueReadBuffer(
        cmd_queue,
        buffer_data_x,
        CL_TRUE,
        0,
        datasize,
        output->data,
        0,
        NULL,
        read_buffer_events
    );
    clReleaseMemObject(buffer_data_x);
    clReleaseEvent(read_buffer_events[0]);
    clReleaseEvent(write_buffer_events[0]);

    return output;
}
Exemple #2
0
/**
 * Read from kernel.
 */
int read_kernel(int handle, void *buffer, int length)
{
  KERNEL_ASSERT(handle == 0);
  KERNEL_ASSERT(length >= strlen(buffer));

  device_t *dev;
  gcd_t *gcd;
  int buf_len;
  buf_len = 0;

  dev = device_get(TYPECODE_TTY, 0);
  KERNEL_ASSERT(dev != NULL);

  gcd = (gcd_t *)dev->generic_device;
  KERNEL_ASSERT(gcd != NULL);

  while(stringcmp(buffer, "n") != 0){

    buf_len = buf_len + gcd->read(gcd, buffer, length);
    KERNEL_ASSERT(buf_len >= 0);
    kwrite(buffer);
  }
  gcd->write(gcd, buffer, buf_len);
  return buf_len;
}
Exemple #3
0
static int devfs_stat(struct mount_entry __unused *mount, uid_t __unused uid,
                      gid_t __unused gid, ino_t inode, struct stat *stat)
{
    if (inode == DEVFS_INODE_ROOT) {
        stat->st_dev = -1;
        stat->st_ino = DEVFS_INODE_ROOT;
        stat->st_mode = VFS_FTYPE_DIR;
    } else {
        struct device *device;

        device = device_get(inode);
        if (!device)
            return -EINVAL;

        stat->st_dev = device->id;
        stat->st_ino = device->id;
        stat->st_mode = VFS_FTYPE_DEV;
    }

    /* XXX: Set correct values */
    stat->st_nlink = 0;
    stat->st_uid = 0;
    stat->st_gid = 0;
    stat->st_rdev = 0;
    stat->st_size = 0;
    stat->st_blksize = 0;
    stat->st_blocks = 0;
    stat->st_atime = 0;
    stat->st_mtime = 0;
    stat->st_ctime = 0;

    return 0;
}
Exemple #4
0
void do_mount() {
    for(int i = 0; i < get_num_of_devices(); i++)
        vfs_mount("/", device_get(i));

    if (!vfs_root_mounted())
        panic("unable to mount root directory\n");
}
Exemple #5
0
void vfs_mount_all(void)
{
    int i;
    device_t *dev;

    for(i=0; i<CONFIG_MAX_FILESYSTEMS; i++) {
        dev = device_get(YAMS_TYPECODE_DISK, i);
        if(dev == NULL) {
            /* No more disks. */
            return;
        } else {
            gbd_t *gbd;
            gbd = (gbd_t *) dev->generic_device;

            if(gbd == NULL) {
                kprintf("VFS: Warning, invalid disk driver detected, "
                        "skipping\n");
                continue;
            }

            vfs_mount_fs(gbd, NULL);
        }
    }

}
Exemple #6
0
device_t *device_find(device_t *_where, fourcc_t _fcc, device_t *_dev)
{
	LinkedList *root;
	if(_where == NULL)
		root = &device_list;
	else
		root = &_where->children;

	LinkedList *ptr;
	if(_dev == NULL)
	{
		if(_where == NULL)
			ptr = device_list.next;
		else
			ptr = _where->children.next;
	}
	else
		ptr = _dev->list_ptr.next;

	while(ptr != root)
	{
		device_t *dev = device_get(ptr);
		if(dev->fourcc == _fcc)
			return dev;

		ptr = ptr->next;
	}

	return NULL;
}
Exemple #7
0
index_t gpu_matrix_vector_iamin(vector * v_x) {
    size_t datasize = gpu_matrix_vector_datasize(v_x);
    cl_int status;
    index_t output;
    cl_mem buffer_data, buffer_indices;
    cl_command_queue cmd_queue;
    cl_kernel kernel;
    index_t remaining_length = v_x->length;
    cl_event write_buffer_events[1],
             read_buffer_events[1];
    vector_buffer buffer_v_x;
    
    cmd_queue = clCreateCommandQueue(
        context_get(),
        device_get(),
        CL_QUEUE_PROFILING_ENABLE,
        &status
    );
    buffer_data = buffers_create(
        CL_MEM_READ_WRITE,
        datasize,
        NULL,
        &status
    );
    status = clEnqueueWriteBuffer(
        cmd_queue, buffer_data,
        CL_TRUE, 0, datasize,
        v_x->data, 0, NULL, write_buffer_events
    );

    buffer_v_x = gpu_matrix_vector_to_vector_buffer(v_x, buffer_data);
    gpu_matrix_vector_buffer_abs_BANG(&buffer_v_x, cmd_queue);
    buffer_indices = gpu_matrix_vector_buffer_imin(&buffer_v_x, cmd_queue);

    // Print write buffer profilling information
    status = clEnqueueReadBuffer(
        cmd_queue,
        buffer_indices,
        CL_TRUE,
        0,
        sizeof(index_t),
        &output,
        0,
        NULL,
        read_buffer_events
    );

    clReleaseMemObject(buffer_data);
    clReleaseMemObject(buffer_indices);
    clReleaseEvent(read_buffer_events[0]);
    clReleaseEvent(write_buffer_events[0]);

    return output;
}
static void adjustColour(byte* val)
{
	// Adjust to sine level
	*val = getSineVal(*val);

	// Gamma correction
    *val = (byte)(pow(*val / 255.0, GAMMA_CORRECTION) * 255);

	// Adjust for brightness
	*val = remap(*val, MIN_RGB_LEVEL, MAX_RGB_LEVEL, MIN_RGB_LEVEL, device_get()->brightness);
}
Exemple #9
0
gcd_t* get_tty()
{
  device_t *dev;
  gcd_t *gcd;

  /* Find system console (first tty) */
  dev = device_get(YAMS_TYPECODE_TTY, 0);
  KERNEL_ASSERT(dev != NULL);
  gcd = (gcd_t *)dev->generic_device;
  KERNEL_ASSERT(gcd != NULL);
  return gcd;
}
Exemple #10
0
Fichier : io.c Projet : Tayacan/OSM
gcd_t* get_gcd() {
    device_t *dev;
    gcd_t *gcd;

    dev = device_get(YAMS_TYPECODE_TTY, 0);
    KERNEL_ASSERT(dev != NULL);

    gcd = (gcd_t *)dev->generic_device;
    KERNEL_ASSERT(gcd != NULL);

    return gcd;
}
Exemple #11
0
int serial_con_write(struct file *fp, const char *buf, off_t off, size_t n)
{
	struct device *devp;
	size_t i;

	if (!(devp = device_get(fp->dp->rdev)))
		return -ENODEV;

	for (i = 0; i < n; i++)
		serial_con_put(*((u16 *) devp->device), buf[i]);

	return n;
}
Exemple #12
0
void gpu_matrix_vector_scal(vector * v_x, double alpha) {
    size_t global_work_size[1] = { v_x->length };
    vector * output;
    size_t datasize = gpu_matrix_vector_datasize(v_x);
    cl_int status;
    cl_command_queue cmd_queue = clCreateCommandQueue(
        context_get(),
        device_get(),
        CL_QUEUE_PROFILING_ENABLE,
        &status
    );
    cl_event write_buffer_events[2], read_buffer_events[1], enqueue_events[1];
    cl_mem buffer_x, buffer_y, buffer_output, buffer_local_cache;
    vector_buffer buffer_v_x, buffer_v_y;

    buffer_x = buffers_create(
        CL_MEM_READ_ONLY,
        datasize,
        NULL,
        &status
    );
    buffer_v_x = gpu_matrix_vector_to_vector_buffer(v_x, buffer_x);
    
    status = clEnqueueWriteBuffer(
        cmd_queue, buffer_x,
        CL_FALSE, 0, datasize,
        v_x->data, 0, NULL, write_buffer_events
    );

    clWaitForEvents(1, write_buffer_events);
    gpu_matrix_vector_buffer_scal_BANG(
        &buffer_v_x,
        alpha,
        cmd_queue
    );

    clEnqueueReadBuffer(
        cmd_queue,
        buffer_x,
        CL_TRUE,
        0,
        datasize,
        v_x->data,
        0,
        NULL,
        read_buffer_events
    );

    clReleaseEvent(write_buffer_events[0]);
    clReleaseEvent(read_buffer_events[0]);
}
Exemple #13
0
/* Writes length bytes from buffer to the open file identified by
   filehandle, starting at the current position and advancing the
   position. Returns the number of bytes actually written, or a
   negative value on error. */
int syscall_write(uint32_t fd, char *s, int len)
{
    gcd_t *gcd;
    device_t *dev;
    if (fd == FILEHANDLE_STDOUT || fd == FILEHANDLE_STDERR)
    {
        dev = device_get(YAMS_TYPECODE_TTY, 0);
        gcd = (gcd_t *)dev->generic_device;
        return gcd->write(gcd, s, len);
    } else {
      KERNEL_PANIC("Write syscall not finished yet.");
      return 0;
    }
}
Exemple #14
0
/* returns the number of bytes written, or a negative value on error */        
int syscall_write(int fhandle, const void *buffer, int length) {
    fhandle = fhandle;
    gcd_t *gcd;
    device_t *dev;

    dev = device_get(YAMS_TYPECODE_TTY, 0); //from init_startup_fallback
    if (dev == NULL)  //if error return negative value
        return -1;

    gcd = (gcd_t *)dev->generic_device; //from init_startup_fallback
    if (gcd == NULL)  //if error return negative value
        return -1;

    gcd->write(gcd, buffer, length); //from init_startup_fallback
    return length; 
}
Exemple #15
0
gcd_t* get_tty(void)
{
  device_t *dev;
  gcd_t *gcd;

  /* Find system console (first tty) */
  dev = device_get(YAMS_TYPECODE_TTY, 0);
  if (dev == NULL) {
    return NULL;
  }
  gcd = (gcd_t *)dev->generic_device;
  if (gcd == NULL) {
    return NULL;
  }
  return gcd;
}
Exemple #16
0
int write(int filehandle, const void *buffer, int length){
  buffer = buffer;
  if(length < 0){
    return ERROR_NEGATIVE_LENGTH;
  }
  if(filehandle == 0){
    return ERROR_CANNOT_WRITE_TO_FILE;
  }
  device_t *device;
  gcd_t *gcd;
  device = device_get(TYPECODE_TTY, 0);
  KERNEL_ASSERT(device != NULL);
  gcd = (gcd_t *) device->generic_device;
  KERNEL_ASSERT(gcd != NULL);
  int written = gcd->write(gcd, buffer, length);
  return written;
}
Exemple #17
0
int syscall_write(int filehandle, const void *buffer, int length) {
    device_t *dev;
    gcd_t *gcd;

    if (filehandle != FILEHANDLE_STDOUT || length < 0)
        return -1;

    dev = device_get(YAMS_TYPECODE_TTY, 0);
    if (dev == NULL)
        return -1;

    gcd = (gcd_t *)dev->generic_device;
    if (gcd == NULL)
        return -1;

    length = gcd->write(gcd, buffer, length);
    return length;
}
Exemple #18
0
int syscall_write(int fhandle, const void *buffer, int length) {
if(fhandle == 1) {
device_t *dev;
gcd_t *gcd;

/* Skaffer device */
dev = device_get(YAMS_TYPECODE_TTY,0);
KERNEL_ASSERT(dev != NULL);
/* skaffer generisk device fra device */
gcd = (gcd_t *)dev->generic_device;
KERNEL_ASSERT(gcd != NULL);


/* iflg. drivers/gcd.h, skriver write, "at most len bytes from the buffer to the device. the function returns the number of bytes read." */
return gcd->write(gcd,buffer,length);
}
return -1;

}
Exemple #19
0
static void cmd_device_list(int _argc, char **_argv)
{
	LinkedList *ptr = device_list.next;
	if(ptr == &device_list)
	{
		bufferPrintf("devices: No devices registered.\n");
		return;
	}

	bufferPrintf("devices: Listing devices:\n");

	while(ptr != &device_list)
	{
		device_t *dev = device_get(ptr);
		bufferPrintf("devices:    %s\n", dev->name);

		ptr = ptr->next;
	}
}
Exemple #20
0
int syscall_write(int filehandle, void *buffer, int length) {

  filehandle = filehandle;

  device_t *dev;
  gcd_t *gcd;


  /* Find system console (first tty) */
  dev = device_get(YAMS_TYPECODE_TTY, 0);
  KERNEL_ASSERT(dev != NULL);

  gcd = (gcd_t *)dev->generic_device;
  KERNEL_ASSERT(gcd != NULL);

  int lengthWritten = gcd->write(gcd, buffer, length);
  lengthWritten += gcd->write(gcd, (void *)"\n", 1);

  return lengthWritten +  1;
}
Exemple #21
0
/* returns the number of bytes read before reaching the EOF 
 * or a negative value on error 
 */
int syscall_read(int fhandle, void *buffer, int length) {
    fhandle = fhandle;
    gcd_t *gcd;
    device_t *dev;
    int len;

    dev = device_get(YAMS_TYPECODE_TTY, 0); //from init_startup_fallback
    if (dev == NULL) //if error return negative value
        return -1;
    
    gcd = (gcd_t *)dev->generic_device; //from init_startup_fallback
    if (gcd == NULL)  //if error return negative value
        return -1;

    len = gcd->read(gcd, buffer, length); //from init_startup_fallback
    if (len < 0) //gcd->read function failed
        return -1;

    return len; 
}
Exemple #22
0
int write_file(int file_handle, const void *buffer, int length) {
    device_t *dev;
    gcd_t *gcd;
    int len;

    if (file_handle == FILEHANDLE_STDIN) {
	return -1;
    }
    
    dev = device_get(YAMS_TYPECODE_TTY, 0);
    KERNEL_ASSERT(dev != NULL);

    gcd = (gcd_t *)dev->generic_device;
    KERNEL_ASSERT(gcd != NULL);

    len = gcd->write(gcd, buffer, length);

    return len;
    
}
Exemple #23
0
/* Verify parent MPU6000 exists */
static int mpu6000_accel_probe(const char *name) {
    const void *blob = fdtparse_get_blob();
    int offset, parent_offset, ret;
    char *parent;
    struct obj *parent_obj;

    offset = fdt_path_offset(blob, name);
    if (offset < 0) {
        return 0;
    }

    if (fdt_node_check_compatible(blob, offset, MPU6000_ACCEL_COMPAT)) {
        return 0;
    }

    parent_offset = fdt_parent_offset(blob, offset);
    if (parent_offset < 0) {
        return 0;
    }

    parent = fdtparse_get_path(blob, parent_offset);
    if (!parent) {
        return 0;
    }

    /* Attempt to get parent MPU6000 */
    parent_obj = device_get(parent);
    if (parent_obj) {
        /* Found it!  Good to go! */
        device_put(parent_obj);
        ret = 1;
    }
    else {
        /* No MPU6000, no MPU6000 accelerometer */
        ret = 0;
    }

    free(parent);

    return ret;
}
Exemple #24
0
void cmd_lsdev()
{
    _printk("NAME TYPE\n");
    for (int i = 0; i < get_num_of_devices(); i++) {
        struct device *d = device_get(i);

        if (!d) {
            i --;
            continue;
        }

        _printk("%s %s\n", d->name,
                d->type == DEV_TYPE_TTY ? "[tty]"
                : d->type == DEV_TYPE_PSEUDO ? "[pseudo]"
                : d->type == DEV_TYPE_ISA ? "[isa]"
                : d->type == DEV_TYPE_PCI ? "[pci]"
                : d->type == DEV_TYPE_BLK ? "[blk]"
                : d->type == DEV_TYPE_TTY_INPUT ? "[intty]"
                : "[unktype]");
    }
}
Exemple #25
0
/**
 * Fallback function for system startup. This function is executed
 * if the initial startup program (shell or other userland process given
 * with initprog boot argument) is not started or specified.
 *
 * This is a good place for some kernel test code!
 *
 */
void init_startup_fallback(void)
{
  DEBUG("debuginit", "In init_startup_fallback\n");

  /* Run console test if "testconsole" was given as boot argument. */
  if (bootargs_get("testconsole") != NULL)
  {
    device_t *dev;
    gcd_t *gcd;
    char buffer[64];
    char buffer2[64];
    int len;

    DEBUG("debuginit", "In console test\n");

    /* Find system console (first tty) */
    dev = device_get(YAMS_TYPECODE_TTY, 0);
    KERNEL_ASSERT(dev != NULL);


    gcd = (gcd_t *)dev->generic_device;
    KERNEL_ASSERT(gcd != NULL);

    len = snprintf(buffer, 63, "Hello user! Press any key.\n");
    gcd->write(gcd, buffer, len);

    len = gcd->read(gcd, buffer2, 63);
    KERNEL_ASSERT(len >= 0);
    buffer2[len] = '\0';

    len = snprintf(buffer, 63, "You said: '%s'\n", buffer2);
    gcd->write(gcd, buffer, len);

    DEBUG("debuginit", "Console test done, %d bytes written\n", len);
  }

  /* Nothing else to do, so we shut the system down. */
  kprintf("Startup fallback code ends.\n");
  halt_kernel();
}
void signal_usr(int sd, struct mosquitto *mosq)
{
	struct device *md_dev;
	struct module *md;
	char md_id[DEVICE_MD_ID_SIZE + 1];

	if (user_signal == MODULE_SIGUSR1) {
		if (config.remap_usr1)
			strcpy(md_id, config.remap_usr1);
		else
			strcpy(md_id, MODULE_SIGUSR1_ID);
	}
	else if (user_signal == MODULE_SIGUSR2) {
		if (config.remap_usr2)
			strcpy(md_id, config.remap_usr2);
		else
			strcpy(md_id, MODULE_SIGUSR2_ID);
	}

	md = device_get_module(&bridge, md_id);
	if (md) {
		md_dev = device_get(&bridge, md->device);
		if (!md_dev) {
			fprintf(stderr, "Error: Orphan module.\n");
			device_remove_module(&bridge, md_id);
			user_signal = 0;
			return;
		}
		if (md_dev->md_deps->type == MODULE_SERIAL && bridge.serial_ready) {
				snprintf(gbuf, GBUF_SIZE, "%s%s,%d,%s", SERIAL_INIT_MSG, md_dev->id, PROTO_MD_RAW, md->id);
				serialport_printlf(sd, gbuf);
		}

		if (connected)
			mqtt_publish(mosq, md->topic, "1");
	}
	user_signal = 0;
}
Exemple #27
0
int syscall_read(int fhandle, void *buffer, int length) {
if(fhandle == 0) {
device_t *dev;
gcd_t *gcd;

/* Skaffer device */
dev = device_get(YAMS_TYPECODE_TTY,0);
KERNEL_ASSERT(dev != NULL);
/* skaffer generisk device fra device */
gcd = (gcd_t *)dev->generic_device;
KERNEL_ASSERT(gcd != NULL);


/* iflg. drivers/gcd.h, læser read, "at most len bytes from the device to the buffer. the function returns the number of bytes read." */

return gcd->read(gcd,buffer,length);
}
return -1;

/*int tmp = fhandle;
int tmp2 =(int) buffer;
int tmp3 = length; */
}
Exemple #28
0
vector * gpu_matrix_vector_add_arbitary(unsigned count, vector * arr_v[]) {
    if (count == 1) {
        return gpu_matrix_vector_copy(arr_v[0]);
    } else if (count == 0) {
        // Have fun mingling with the NULL pointer
        return NULL;
    } 

    size_t datasize;
    cl_int status;
    vector * output;
    cl_mem buffer_data;
    cl_command_queue cmd_queue;
    cl_kernel kernel;
    cl_event write_buffer_events_arr[10];
    cl_event *write_buffer_events,
             read_buffer_events[1];
    vector_buffer buffer_v_this;

    if (count < 10) {
        write_buffer_events = write_buffer_events_arr;
    } else {
        write_buffer_events = malloc(sizeof(cl_event) * count);
    }
    // increate write_buffer_events and read_buffer_events if count is not enough

    output = malloc(sizeof(vector));
    output->length = arr_v[0]->length;
    output->stride = 1;
    output->data = malloc(sizeof(double) * arr_v[0]->length);
    datasize = gpu_matrix_vector_datasize(arr_v[0]);
    cmd_queue = clCreateCommandQueue(
        context_get(),
        device_get(),
        CL_QUEUE_PROFILING_ENABLE,
        &status
    );
    buffer_data = buffers_create(
        CL_MEM_READ_WRITE,
        datasize,
        NULL,
        &status
    );
    buffer_v_this = gpu_matrix_vector_to_vector_buffer(
        arr_v[0], buffer_data
    );
    status = clEnqueueWriteBuffer(
        cmd_queue, buffer_data,
        CL_TRUE, 0, datasize,
        arr_v[0]->data, 0, NULL, write_buffer_events
    );
    clWaitForEvents(1, write_buffer_events);
    clReleaseEvent(write_buffer_events[0]);

    // Naive implementation, Improvements later
    for (unsigned i = 1 ; i < count ; i++) {
        cl_mem buffer_data_next;
        vector_buffer buffer_v_next;

        buffer_data_next = buffers_create(
            CL_MEM_READ_ONLY,
            datasize,
            NULL,
            &status
        );
        status = clEnqueueWriteBuffer(
            cmd_queue, buffer_data_next,
            CL_TRUE, 0 ,datasize,
            arr_v[i]->data, 0, NULL, write_buffer_events+i
        );
        buffer_v_next = gpu_matrix_vector_to_vector_buffer(
            arr_v[i], buffer_data_next 
        );
        clWaitForEvents(1, write_buffer_events+i);
        gpu_matrix_vector_buffer_add_BANG(&buffer_v_this, &buffer_v_next, cmd_queue);

        clReleaseEvent(write_buffer_events[i]);
        clReleaseMemObject(buffer_data_next);
    }

    // Print write buffer profilling information
    status = clEnqueueReadBuffer(
        cmd_queue,
        buffer_data,
        CL_TRUE,
        0,
        datasize,
        output->data,
        0,
        NULL,
        read_buffer_events 
    );
    clReleaseMemObject(buffer_data);
    clReleaseEvent(read_buffer_events[0]);

    if (count >= 10) {
        free(write_buffer_events); 
    }

    return output;
}
Exemple #29
0
double gpu_matrix_vector_dot(vector * v_x, vector * v_y) {
    size_t datasize = gpu_matrix_vector_datasize(v_x);
    size_t global_work_size[1];
    cl_int status;
    double output;
    cl_mem buffer_data_output, buffer_data_x, buffer_data_y;
    vector_buffer buffer_v_x, buffer_v_y;
    cl_command_queue cmd_queue;
    cl_event write_buffer_events[2],
             read_buffer_events[1];
  
    datasize = gpu_matrix_vector_datasize(v_x);
    global_work_size[0] = v_x->length;
    cmd_queue = clCreateCommandQueue(
        context_get(),
        device_get(),
        CL_QUEUE_PROFILING_ENABLE,
        &status
    );
    buffer_data_x = buffers_create(
        CL_MEM_READ_WRITE,
        datasize,
        NULL,
        &status
    );
    buffer_v_x = gpu_matrix_vector_to_vector_buffer(v_x, buffer_data_x);

    status = clEnqueueWriteBuffer(
        cmd_queue, buffer_data_x,
        CL_FALSE, 0, datasize,
        v_x->data, 0, NULL,
        write_buffer_events
    );
    buffer_data_y = buffers_create(
        CL_MEM_READ_ONLY,
        datasize,
        NULL,
        &status
    );
    status = clEnqueueWriteBuffer(
        cmd_queue, buffer_data_y,
        CL_FALSE, 0, datasize,
        v_y->data, 0, NULL,
        write_buffer_events+1
    );
    buffer_v_y = gpu_matrix_vector_to_vector_buffer(v_y, buffer_data_y);
    clWaitForEvents(2, write_buffer_events);

    gpu_matrix_vector_buffer_mul_BANG(&buffer_v_x, &buffer_v_y, cmd_queue); 
    gpu_matrix_vector_buffer_asum_BANG(&buffer_v_x, cmd_queue);

    clEnqueueReadBuffer(
        cmd_queue,
        buffer_v_x.buffer,
        CL_TRUE,
        0,
        sizeof(double),
        &output,
        0,
        NULL,
        read_buffer_events
    );
    clWaitForEvents(1, read_buffer_events);

    // Release buffer objects
    clReleaseMemObject(buffer_v_x.buffer);
    clReleaseEvent(read_buffer_events[0]);
    clReleaseEvent(write_buffer_events[0]);
    clReleaseEvent(write_buffer_events[1]);

    return output;
}
Exemple #30
0
void gpu_matrix_vector_rot(
    vector * v_x,
    vector * v_y,
    double c,
    double s
){
    cl_kernel kernel;
    cl_command_queue cmd_queue;
    cl_int status;
    cl_event read_buffer_events[2], write_buffer_events[2];
    size_t datasize = gpu_matrix_vector_datasize(v_x);
    cl_mem buffer_data_x, buffer_data_y;
    vector_buffer buffer_v_x, buffer_v_y;

    cmd_queue = clCreateCommandQueue(
        context_get(),
        device_get(),
        CL_QUEUE_PROFILING_ENABLE,
        &status
    );
    buffer_data_x = buffers_create(
        CL_MEM_READ_WRITE,
        datasize,
        NULL,
        &status
    );
    buffer_data_y = buffers_create(
        CL_MEM_READ_WRITE,
        datasize,
        NULL,
        &status
    );
    status = clEnqueueWriteBuffer(
        cmd_queue, buffer_data_x,
        CL_FALSE, 0, datasize,
        v_x->data, 0, NULL,
        write_buffer_events
    );
    status = clEnqueueWriteBuffer(
        cmd_queue, buffer_data_y,
        CL_FALSE, 0, datasize,
        v_y->data, 0, NULL,
        write_buffer_events+1
    );
    clWaitForEvents(2, write_buffer_events);
    
    buffer_v_x = gpu_matrix_vector_to_vector_buffer(v_x, buffer_data_x);
    buffer_v_y = gpu_matrix_vector_to_vector_buffer(v_x, buffer_data_y);

    gpu_matrix_vector_buffer_rot_BANG(&buffer_v_x, &buffer_v_y, c, s, cmd_queue);

    status = clEnqueueReadBuffer(
        cmd_queue,
        buffer_v_x.buffer,
        CL_TRUE,
        0,
        datasize,
        v_x->data,
        0,
        NULL,
        read_buffer_events
    );
    status = clEnqueueReadBuffer(
        cmd_queue,
        buffer_v_y.buffer,
        CL_TRUE,
        0,
        datasize,
        v_y->data,
        0,
        NULL,
        read_buffer_events+1
    );

    clWaitForEvents(2, read_buffer_events);
}