diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2012-05-11 12:21:07 -0400 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2012-05-11 12:21:07 -0400 |
commit | 4df084d9a85a6a43891104be1b7197a3939e16f8 (patch) | |
tree | be4e23055a6bf19fbcda68f822c1a17663ebb004 /copy_host_ptr.c | |
parent | 0e700c44202cb6e7138543519e4c072155b73191 (diff) |
Add use-host-ptr and copy-host-ptr programs
Diffstat (limited to 'copy_host_ptr.c')
-rw-r--r-- | copy_host_ptr.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/copy_host_ptr.c b/copy_host_ptr.c new file mode 100644 index 0000000..f585fb7 --- /dev/null +++ b/copy_host_ptr.c @@ -0,0 +1,93 @@ +#include <assert.h> +#include <stdlib.h> +#include <stdio.h> + +#include <CL/cl.h> + +#include "cl_simple.h" +#include "cl_util.h" + +int main (int argc, char ** argv) +{ + + struct cl_simple_context context; + cl_mem src_buffer; + cl_int error = CL_SUCCESS; + unsigned num_items; + int * src_data; + int * out; + unsigned src_size; + unsigned i; + int copy_host_ptr; + cl_mem_flags mem_flags; + size_t global_work_size = 1; + + if (argc != 3) { + fprintf(stderr, "Usage: copy-host-ptr num_items copy_host_ptr(T/F)\n"); + return EXIT_FAILURE; + } + + num_items = atoi(argv[1]); + copy_host_ptr = atoi(argv[2]); + src_size = num_items * sizeof(int); + + src_data = malloc(src_size * sizeof(int)); + out = malloc(src_size * sizeof(int)); + + for (i = 0; i < num_items; i++) { + src_data[i] = i; + } + + if (!clSimpleSimpleInit(&context, "memcpy")) { + return EXIT_FAILURE; + } + + if (!clSimpleSetOutputBuffer(&context, src_size)) { + return EXIT_FAILURE; + } + + if (copy_host_ptr) { + src_buffer = clCreateBuffer(context.cl_ctx, + CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, + src_size, src_data, &error); + if (error != CL_SUCCESS) { + fprintf(stderr, "clCreateBuffer() failed.\n"); + return EXIT_FAILURE; + } + } else { + if (!clSimpleCreateBuffer(&src_buffer, context.cl_ctx, + CL_MEM_READ_ONLY, src_size)) { + return EXIT_FAILURE; + } + if (!clSimpleEnqueueWriteBuffer(context.command_queue, src_buffer, + src_size, src_data)) { + return EXIT_FAILURE; + } + } + + if (!clSimpleKernelSetArg(context.kernel, 1, sizeof(cl_mem), &src_buffer) + || !clSimpleKernelSetArg(context.kernel, 2, sizeof(int), &num_items)) { + return EXIT_FAILURE; + } + + if (!clSimpleEnqueueNDRangeKernel(context.command_queue, + context.kernel, 1, &global_work_size, + &global_work_size)) { + return EXIT_FAILURE; + } + + if (!clSimpleReadOutput(&context, out, src_size)) { + return EXIT_FAILURE; + } + + for (i = 0; i < num_items; i++) { + fprintf(stderr, "%4d ", out[i]); + if (num_items % 10 == 9) + fprintf(stderr, "\n"); + } + fprintf(stderr, "\n"); + + return EXIT_SUCCESS; + +} + |