summaryrefslogtreecommitdiff
path: root/copy_host_ptr.c
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2012-05-11 12:21:07 -0400
committerTom Stellard <thomas.stellard@amd.com>2012-05-11 12:21:07 -0400
commit4df084d9a85a6a43891104be1b7197a3939e16f8 (patch)
treebe4e23055a6bf19fbcda68f822c1a17663ebb004 /copy_host_ptr.c
parent0e700c44202cb6e7138543519e4c072155b73191 (diff)
Add use-host-ptr and copy-host-ptr programs
Diffstat (limited to 'copy_host_ptr.c')
-rw-r--r--copy_host_ptr.c93
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;
+
+}
+