From cff54e489587eea15a6d756d55fb931bff10fcb6 Mon Sep 17 00:00:00 2001 From: Artur Gainullin Date: Fri, 19 Apr 2019 19:32:47 -0700 Subject: [PATCH] [SYCL] Fix load method of vec according to specification Load method doesn't change data pointed by multi_ptr so const should be added to data type according to specification. This requires aditional constructors for multi_ptr from accessor class. Signed-off-by: Artur Gainullin --- sycl/include/CL/sycl/multi_ptr.hpp | 47 ++++++++++++++++++++++++++++++ sycl/include/CL/sycl/types.hpp | 10 ++++--- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/sycl/include/CL/sycl/multi_ptr.hpp b/sycl/include/CL/sycl/multi_ptr.hpp index 40ca217e15728..752ec2effd56c 100644 --- a/sycl/include/CL/sycl/multi_ptr.hpp +++ b/sycl/include/CL/sycl/multi_ptr.hpp @@ -118,6 +118,53 @@ template class multi_ptr { Accessor) : multi_ptr(Accessor.get_pointer()) {} + // The following constructors are necessary to create multi_ptr from accessor. Constructors above + // could not be used for this purpose because it will require 2 implicit + // conversions of user types which is not allowed by C++: + // 1. from accessor to multi_ptr + // 2. from multi_ptr to multi_ptr + + // Only if Space == global_space and element type is const + template < + int dimensions, access::mode Mode, access::placeholder isPlaceholder, + access::address_space _Space = Space, typename ET = ElementType, + typename = typename std::enable_if< + _Space == Space && Space == access::address_space::global_space && + std::is_const::value && + std::is_same::value>::type> + multi_ptr(accessor::type, dimensions, Mode, + access::target::global_buffer, isPlaceholder> + Accessor) + : multi_ptr(Accessor.get_pointer()) {} + + // Only if Space == local_space and element type is const + template < + int dimensions, access::mode Mode, access::placeholder isPlaceholder, + access::address_space _Space = Space, typename ET = ElementType, + typename = typename std::enable_if< + _Space == Space && Space == access::address_space::local_space && + std::is_const::value && + std::is_same::value>::type> + multi_ptr(accessor::type, dimensions, Mode, + access::target::local, isPlaceholder> + Accessor) + : multi_ptr(Accessor.get_pointer()) {} + + // Only if Space == constant_space and element type is const + template < + int dimensions, access::mode Mode, access::placeholder isPlaceholder, + access::address_space _Space = Space, typename ET = ElementType, + typename = typename std::enable_if< + _Space == Space && Space == access::address_space::constant_space && + std::is_const::value && + std::is_same::value>::type> + multi_ptr(accessor::type, dimensions, Mode, + access::target::constant_buffer, isPlaceholder> + Accessor) + : multi_ptr(Accessor.get_pointer()) {} + // Returns the underlying OpenCL C pointer pointer_t get() const { return m_Pointer; } diff --git a/sycl/include/CL/sycl/types.hpp b/sycl/include/CL/sycl/types.hpp index da5d278c1ede9..e09c04dd64f70 100644 --- a/sycl/include/CL/sycl/types.hpp +++ b/sycl/include/CL/sycl/types.hpp @@ -586,14 +586,16 @@ template class vec { #error "Undefine __SYCL_LOADSTORE macro" #endif #define __SYCL_LOADSTORE(Space) \ - void load(size_t Offset, multi_ptr Ptr) { \ + void load(size_t Offset, multi_ptr Ptr) { \ if (NumElements != 3) { \ - m_Data = *multi_ptr(static_cast( \ - static_cast(Ptr + Offset * NumElements))); \ + m_Data = \ + *multi_ptr(static_cast( \ + static_cast(Ptr + Offset * NumElements))); \ return; \ } \ for (int I = 0; I < NumElements; I++) { \ - setValue(I, *multi_ptr(Ptr + Offset * NumElements + I)); \ + setValue( \ + I, *multi_ptr(Ptr + Offset * NumElements + I)); \ } \ } \ void store(size_t Offset, multi_ptr Ptr) const { \