diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/cpu/worker.cpp | 16 | ||||
-rw-r--r-- | src/core/events.cpp | 24 | ||||
-rw-r--r-- | src/core/events.h | 8 | ||||
-rw-r--r-- | src/core/kernel.cpp | 56 | ||||
-rw-r--r-- | src/core/memobject.cpp | 10 | ||||
-rw-r--r-- | src/core/memobject.h | 13 |
6 files changed, 73 insertions, 54 deletions
diff --git a/src/core/cpu/worker.cpp b/src/core/cpu/worker.cpp index 635706b..409c4a6 100644 --- a/src/core/cpu/worker.cpp +++ b/src/core/cpu/worker.cpp @@ -248,11 +248,11 @@ void *worker(void *data) break; } - case Event::MigrateMemObjects: - { + case Event::MigrateMemObjects: + { MigrateMemObjectsEvent *e = (MigrateMemObjectsEvent *)event; - int num_mem_objects = e->num_mem_objects(); - Coal::MemObject ** mem_objects = (Coal::MemObject **)e->mem_objects(); + int num_mem_objects = e->num_mem_objects(); + const cl_mem * mem_objects = e->mem_objects(); cl_mem_migration_flags flags = e->flags(); std::cout << "Event::MigrateMemObjects " << std::endl; @@ -262,10 +262,10 @@ void *worker(void *data) // only migrate date from HOST to Device. // Force pre-allocation (or copying) of the CPUBuffers for this device: for (int i = 0; i < num_mem_objects; i++) { - mem_objects[i]->allocate(device); - } - break; - } + pobj(mem_objects[i])->allocate(device); + } + break; + } default: break; diff --git a/src/core/events.cpp b/src/core/events.cpp index 22676f1..f4b7c09 100644 --- a/src/core/events.cpp +++ b/src/core/events.cpp @@ -56,7 +56,7 @@ BufferEvent::BufferEvent(CommandQueue *parent, : Event(parent, CL_QUEUED, num_events_in_wait_list, event_wait_list, errcode_ret), p_buffer(buffer) { - clRetainMemObject((cl_mem) p_buffer); + clRetainMemObject(desc(p_buffer)); if (*errcode_ret != CL_SUCCESS) return; @@ -103,7 +103,7 @@ BufferEvent::BufferEvent(CommandQueue *parent, BufferEvent::~BufferEvent() { - clReleaseMemObject((cl_mem) p_buffer); + clReleaseMemObject(desc(p_buffer)); } MemObject *BufferEvent::buffer() const @@ -431,7 +431,7 @@ CopyBufferEvent::CopyBufferEvent(CommandQueue *parent, errcode_ret), p_destination(destination), p_src_offset(src_offset), p_dst_offset(dst_offset), p_cb(cb) { - clRetainMemObject((cl_mem) p_destination); + clRetainMemObject(desc(p_destination)); if (*errcode_ret != CL_SUCCESS) return; @@ -483,7 +483,7 @@ CopyBufferEvent::CopyBufferEvent(CommandQueue *parent, CopyBufferEvent::~CopyBufferEvent() { - clReleaseMemObject((cl_mem) p_destination); + clReleaseMemObject(desc(p_destination)); } MemObject *CopyBufferEvent::source() const @@ -587,7 +587,7 @@ NativeKernelEvent::NativeKernelEvent(CommandQueue *parent, void *args, size_t cb_args, cl_uint num_mem_objects, - const MemObject **mem_list, + const cl_mem *mem_list, const void **args_mem_loc, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, @@ -665,7 +665,7 @@ NativeKernelEvent::NativeKernelEvent(CommandQueue *parent, // Replace memory objects with global pointers for (cl_uint i=0; i<num_mem_objects; ++i) { - const MemObject *buffer = mem_list[i]; + const MemObject *buffer = pobj(mem_list[i]); const char *loc = (const char *)args_mem_loc[i]; if (!buffer) @@ -729,7 +729,7 @@ KernelEvent::KernelEvent(CommandQueue *parent, if (a->kind() == Kernel::Arg::Buffer && a->file() != Kernel::Arg::Local) { MemObject *buffer = *(MemObject **)(a->value(0)); - clRetainMemObject((cl_mem)buffer); + clRetainMemObject(desc(buffer)); } } @@ -955,7 +955,7 @@ KernelEvent::~KernelEvent() if (a->kind() == Kernel::Arg::Buffer && a->file() != Kernel::Arg::Local) { MemObject *buffer = *(MemObject **)(a->value(0)); - clReleaseMemObject((cl_mem)buffer); + clReleaseMemObject(desc(buffer)); } } clReleaseKernel(desc(p_kernel)); @@ -1619,7 +1619,7 @@ Event::Type MarkerEvent::type() const MigrateMemObjectsEvent::MigrateMemObjectsEvent(CommandQueue *parent, cl_uint num_mem_objects, - const Coal::MemObject **mem_objects, + const cl_mem * mem_objects, cl_mem_migration_flags flags, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, @@ -1642,9 +1642,9 @@ MigrateMemObjectsEvent::MigrateMemObjectsEvent(CommandQueue *parent, Context *ctx = (Context *)parent->parent(); for (int i = 0; i < num_mem_objects; i++) { - if (!mem_objects[i]->isA(Coal::Object::T_MemObject)) + if (!pobj(mem_objects[i])->isA(Coal::Object::T_MemObject)) { *errcode_ret = CL_INVALID_MEM_OBJECT; break; } - else if (ctx != (Context *)mem_objects[i]->parent()) + else if (ctx != (Context *)pobj(mem_objects[i])->parent()) { *errcode_ret = CL_INVALID_CONTEXT; break; } } } @@ -1654,7 +1654,7 @@ cl_uint MigrateMemObjectsEvent::num_mem_objects() const return p_num_mem_objects; } -const Coal::MemObject ** MigrateMemObjectsEvent::mem_objects() const +const cl_mem * MigrateMemObjectsEvent::mem_objects() const { return p_mem_objects; } diff --git a/src/core/events.h b/src/core/events.h index 00b6fb1..aad5792 100644 --- a/src/core/events.h +++ b/src/core/events.h @@ -598,7 +598,7 @@ class NativeKernelEvent : public Event void *args, size_t cb_args, cl_uint num_mem_objects, - const MemObject **mem_list, + const cl_mem *mem_list, const void **args_mem_loc, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, @@ -748,7 +748,7 @@ class MigrateMemObjectsEvent: public Event public: MigrateMemObjectsEvent(CommandQueue *parent, cl_uint num_mem_objects, - const Coal::MemObject **mem_objects, + const cl_mem * mem_objects, cl_mem_migration_flags flags, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, @@ -757,12 +757,12 @@ class MigrateMemObjectsEvent: public Event Type type() const; /*!< \brief Say the event is a \c Coal::Event::MigrateMemObjects one */ cl_uint num_mem_objects() const; /*!< \brief Number of MemObjects to migrate */ - const Coal::MemObject **mem_objects() const;/*!< \brief List of MemObjects to migrate */ + const cl_mem *mem_objects() const; /*!< \brief List of MemObjects to migrate */ cl_mem_migration_flags flags() const; /*!< \brief Migrate flags */ private: cl_uint p_num_mem_objects; - const Coal::MemObject **p_mem_objects; + const cl_mem *p_mem_objects; cl_mem_migration_flags p_flags; }; diff --git a/src/core/kernel.cpp b/src/core/kernel.cpp index 4f1b7b1..dd8c116 100644 --- a/src/core/kernel.cpp +++ b/src/core/kernel.cpp @@ -317,6 +317,11 @@ llvm::Function *Kernel::function(DeviceInterface *device) const /****************************************************************************** * cl_int Kernel::setArg +* +* Note: the argument void *value can either be a pointer to raw data, or a +* derived type of MemObject, upcast to an ICD descriptor (see icd.h). +* In this case, we must be careful to distinguish between the two and do the +* downcast to a clover object if valule is a pointer to an ICD object. ******************************************************************************/ cl_int Kernel::setArg(cl_uint index, size_t size, const void *value) { @@ -345,18 +350,21 @@ cl_int Kernel::setArg(cl_uint index, size_t size, const void *value) /*------------------------------------------------------------------------- * Special case for samplers (pointers in C++, uint32 in OpenCL). *------------------------------------------------------------------------*/ - if (size == sizeof(cl_sampler) && arg_size == 4 && - (*(Object **)value)->isA(T_Sampler)) + if (arg->kind() == Arg::Sampler && size == sizeof(cl_sampler) && arg_size == 4) { - unsigned int bitfield = (*(Sampler **)value)->bitfield(); + // Test if this is a sampler object: + MemObject * val = pobj(*(cl_mem *)value); + if (((Object *)val)->isA(T_Sampler)) + { + unsigned int bitfield = ((Sampler *)val)->bitfield(); - arg->refineKind(Arg::Sampler); - arg->alloc(); - arg->loadData(&bitfield, size); + arg->refineKind(Arg::Sampler); + arg->alloc(); + arg->loadData(&bitfield, size); - return CL_SUCCESS; + return CL_SUCCESS; + } } - // LLVM IR redefines function parameter types to fit the smallest integer type width for the ABI // eg: <2xi8> (2 bytes) may actually be pushed as an i32 (4 bytes!), but this knowledge is // not known to shamrock. But, we do know the parameter type alignment in addFunction(). @@ -364,24 +372,30 @@ cl_int Kernel::setArg(cl_uint index, size_t size, const void *value) if ((size != arg_size) && (size > arg->targetAlignment())) return CL_INVALID_ARG_SIZE; /*------------------------------------------------------------------------- - * Check for null values + * Downcast 'void *value' from a potential &cl_mem argument to a MemObject + * if arg type is one of Arg::Buffer, Arg::Image2D, or Arg::Image3D. + * Also, check for null values. *------------------------------------------------------------------------*/ - cl_mem null_mem = 0; + MemObject *mem_value = NULL; - if (!value) + switch (arg->kind()) { - switch (arg->kind()) - { - /*------------------------------------------------------------- - * Special case buffers : value can be 0 (or point to 0) - *------------------------------------------------------------*/ - case Arg::Buffer: - case Arg::Image2D: - case Arg::Image3D: value = &null_mem; - default: return CL_INVALID_ARG_VALUE; - } + /*------------------------------------------------------------- + * Special case buffers : value can be 0 (or point to 0) + *------------------------------------------------------------*/ + case Arg::Buffer: + case Arg::Image2D: + case Arg::Image3D: + if (value) { + mem_value = pobj(*(cl_mem *)value); + } + value = &mem_value; + break; + default: + if (!value) return CL_INVALID_ARG_VALUE; } + /*------------------------------------------------------------------------- * Copy just the data actually passed. Expect LLVM to do the signext/zeroext. *------------------------------------------------------------------------*/ diff --git a/src/core/memobject.cpp b/src/core/memobject.cpp index c72c3c9..81e6fb3 100644 --- a/src/core/memobject.cpp +++ b/src/core/memobject.cpp @@ -115,7 +115,7 @@ MemObject::~MemObject() { dtor_callback_t callback; if (p_dtor_callback_stack.pop(callback)) - callback.first((cl_mem)this, callback.second); + callback.first(desc(this), callback.second); } if (p_devicebuffers) @@ -378,14 +378,14 @@ cl_int MemObject::info(cl_mem_info param_name, if (type() != SubBuffer) SIMPLE_ASSIGN(cl_mem, 0) else - SIMPLE_ASSIGN(cl_mem, subbuf->parent()); + SIMPLE_ASSIGN(cl_mem, desc(subbuf->parent())); break; case CL_MEM_OFFSET: if (type() != SubBuffer) - SIMPLE_ASSIGN(cl_mem, 0) + SIMPLE_ASSIGN(size_t, 0) else - SIMPLE_ASSIGN(cl_mem, subbuf->offset()); + SIMPLE_ASSIGN(size_t, subbuf->offset()); break; default: @@ -500,7 +500,7 @@ SubBuffer::SubBuffer(class Buffer *parent, size_t offset, size_t size, : MemObject((Context *)parent->parent(), flags, 0, errcode_ret), p_offset(offset), p_size(size), p_parent(parent) { - clRetainMemObject((cl_mem) p_parent); + clRetainMemObject(desc(p_parent)); if (size == 0) { diff --git a/src/core/memobject.h b/src/core/memobject.h index ede6050..55f2fe3 100644 --- a/src/core/memobject.h +++ b/src/core/memobject.h @@ -35,12 +35,20 @@ #define __MEMOBJECT_H__ #include "object.h" +#include "icd.h" #include "dsp/u_concurrent_stack.h" #include <CL/cl.h> namespace Coal { + class MemObject; +} +struct _cl_mem: public Coal::descriptor<Coal::MemObject, _cl_mem> {}; + + +namespace Coal +{ class DeviceBuffer; class Context; @@ -50,7 +58,7 @@ class BufferEvent; /** * \brief Base class for all the memory objects */ -class MemObject : public Object +class MemObject : public _cl_mem, public Object { public: /** @@ -298,7 +306,4 @@ class Image3D : public Image2D } -struct _cl_mem : public Coal::MemObject -{}; - #endif |