18 #ifndef viskores_exec_cuda_internal_ArrayPortalFromThrust_h
19 #define viskores_exec_cuda_internal_ArrayPortalFromThrust_h
25 #include <type_traits>
29 #include <thrust/system/cuda/memory.h>
45 template <
typename T>
struct UseScalarTextureLoad :
public std::false_type {};
46 template <
typename T>
struct UseVecTextureLoads :
public std::false_type {};
47 template <
typename T>
struct UseMultipleScalarTextureLoads :
public std::false_type {};
51 template <>
struct UseScalarTextureLoad<const
viskores::
UInt8> : std::true_type {};
52 template <>
struct UseScalarTextureLoad<const
viskores::
Int16> : std::true_type {};
53 template <>
struct UseScalarTextureLoad<const
viskores::
UInt16> : std::true_type {};
54 template <>
struct UseScalarTextureLoad<const
viskores::
Int32> : std::true_type {};
55 template <>
struct UseScalarTextureLoad<const
viskores::
UInt32> : std::true_type {};
56 template <>
struct UseScalarTextureLoad<const
viskores::
Float32> : std::true_type {};
57 template <>
struct UseScalarTextureLoad<const
viskores::
Float64> : std::true_type {};
61 template <>
struct UseVecTextureLoads<const
viskores::
Vec2i_32> : std::true_type {};
62 template <>
struct UseVecTextureLoads<const
viskores::
Vec2ui_32> : std::true_type {};
63 template <>
struct UseVecTextureLoads<const
viskores::
Vec2f_32> : std::true_type {};
64 template <>
struct UseVecTextureLoads<const
viskores::
Vec2f_64> : std::true_type {};
66 template <>
struct UseVecTextureLoads<const
viskores::
Vec4i_32> : std::true_type {};
67 template <>
struct UseVecTextureLoads<const
viskores::
Vec4ui_32> : std::true_type {};
68 template <>
struct UseVecTextureLoads<const
viskores::
Vec4f_32> : std::true_type {};
75 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec2ui_8> : std::true_type {};
76 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec2i_16> : std::true_type {};
77 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec2ui_16> : std::true_type {};
78 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec2i_64> : std::true_type {};
79 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec2ui_64> : std::true_type {};
81 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec3ui_8> : std::true_type {};
82 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec3i_16> : std::true_type {};
83 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec3ui_16> : std::true_type {};
84 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec3i_32> : std::true_type {};
85 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec3ui_32> : std::true_type {};
86 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec3f_32> : std::true_type {};
87 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec3f_64> : std::true_type {};
89 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec4ui_8> : std::true_type {};
90 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec4i_16> : std::true_type {};
91 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec4ui_16> : std::true_type {};
92 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec4i_64> : std::true_type {};
93 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec4ui_64> : std::true_type {};
94 template <>
struct UseMultipleScalarTextureLoads<const
viskores::
Vec4f_64> : std::true_type {};
98 template <
typename T,
typename Enable =
void>
99 struct load_through_texture
103 __device__
static T
get(
const T*
const data) {
return *data; }
109 template <
typename T>
110 struct load_through_texture<T, typename std::enable_if<UseScalarTextureLoad<const T>::value>::type>
115 __device__
static T
get(
const T*
const data)
117 #if __CUDA_ARCH__ >= 350
127 template <
typename T>
128 struct load_through_texture<T, typename std::enable_if<UseVecTextureLoads<const T>::value>::type>
132 __device__
static T
get(
const T*
const data)
134 #if __CUDA_ARCH__ >= 350
144 const int2 temp = __ldg((
const int2*)data);
150 const uint2 temp = __ldg((
const uint2*)data);
156 const int4 temp = __ldg((
const int4*)data);
162 const uint4 temp = __ldg((
const uint4*)data);
168 const float2 temp = __ldg((
const float2*)data);
174 const float4 temp = __ldg((
const float4*)data);
180 const double2 temp = __ldg((
const double2*)data);
186 template <
typename T>
187 struct load_through_texture<
189 typename std::enable_if<UseMultipleScalarTextureLoads<const T>::value>::type>
193 using NonConstT =
typename std::remove_const<T>::type;
195 __device__
static T
get(
const T*
const data)
197 #if __CUDA_ARCH__ >= 350
205 __device__
static T getAs(
const T*
const data)
209 using ComponentType =
typename T::ComponentType;
210 const ComponentType* recasted_data = (
const ComponentType*)(data);
215 result[i] = __ldg(recasted_data + i);
221 class ArrayPortalFromThrustBase
228 template <
typename T>
229 class ArrayPortalFromThrust :
public ArrayPortalFromThrustBase
233 using IteratorType = T*;
234 using difference_type = std::ptrdiff_t;
239 ArrayPortalFromThrust(IteratorType begin, IteratorType end)
240 : BeginIterator(begin)
249 template <
typename OtherT>
251 : BeginIterator(src.GetIteratorBegin())
252 , EndIterator(src.GetIteratorEnd())
260 return static_cast<viskores::Id>((this->EndIterator - this->BeginIterator));
266 return *(this->BeginIterator +
static_cast<difference_type
>(index));
272 *(this->BeginIterator +
static_cast<difference_type
>(index)) = value;
276 IteratorType GetIteratorBegin()
const {
return this->BeginIterator; }
279 IteratorType GetIteratorEnd()
const {
return this->EndIterator; }
282 IteratorType BeginIterator;
283 IteratorType EndIterator;
286 template <
typename T>
287 class ConstArrayPortalFromThrust :
public ArrayPortalFromThrustBase
291 using IteratorType =
const T*;
292 using difference_type = std::ptrdiff_t;
295 : BeginIterator(
nullptr)
296 , EndIterator(
nullptr)
301 ConstArrayPortalFromThrust(IteratorType begin, IteratorType end)
302 : BeginIterator(begin)
314 ConstArrayPortalFromThrust(
const ArrayPortalFromThrust<T>& src)
315 : BeginIterator(src.GetIteratorBegin())
316 , EndIterator(src.GetIteratorEnd())
324 return static_cast<viskores::Id>((this->EndIterator - this->BeginIterator));
332 #ifdef VISKORES_CUDA_DEVICE_PASS
336 this->BeginIterator + index);
348 #if !(defined(VISKORES_MSVC) && defined(VISKORES_CUDA))
355 IteratorType GetIteratorBegin()
const {
return this->BeginIterator; }
358 IteratorType GetIteratorEnd()
const {
return this->EndIterator; }
361 IteratorType BeginIterator;
362 IteratorType EndIterator;
369 #endif //viskores_exec_cuda_internal_ArrayPortalFromThrust_h