21 #ifndef ROCPRIM_ITERATOR_TEXTURE_CACHE_ITERATOR_HPP_ 22 #define ROCPRIM_ITERATOR_TEXTURE_CACHE_ITERATOR_HPP_ 26 #include <type_traits> 28 #include "../config.hpp" 29 #include "../functional.hpp" 30 #include "../detail/various.hpp" 35 BEGIN_ROCPRIM_NAMESPACE
40 template <
class T,
unsigned int NumElements>
64 #define DEFINE_MAKE_TEXTURE_TYPE(base, suffix) \ 67 struct make_texture_type<base, suffix> \ 69 using type = ::base##suffix; \ 72 DEFINE_MAKE_TEXTURE_TYPE(
char, 2);
73 DEFINE_MAKE_TEXTURE_TYPE(
char, 4);
74 DEFINE_MAKE_TEXTURE_TYPE(
int, 2);
75 DEFINE_MAKE_TEXTURE_TYPE(
int, 4);
76 DEFINE_MAKE_TEXTURE_TYPE(
short, 2);
77 DEFINE_MAKE_TEXTURE_TYPE(
short, 4);
84 static constexpr
unsigned int size =
sizeof(T);
85 using texture_base_type =
86 typename std::conditional<
89 typename std::conditional<
96 using texture_4 =
typename make_texture_type<texture_base_type, 4>::type;
97 using texture_2 =
typename make_texture_type<texture_base_type, 2>::type;
98 using texture_1 =
typename make_texture_type<texture_base_type, 1>::type;
101 typename std::conditional<
102 size %
sizeof(texture_4) == 0,
104 typename std::conditional<
105 size %
sizeof(texture_2) == 0,
131 class Difference = std::ptrdiff_t
147 #ifndef DOXYGEN_SHOULD_SKIP_THIS 151 ROCPRIM_HOST_DEVICE
inline 154 ROCPRIM_HOST_DEVICE
inline 156 : ptr(NULL), texture_offset(0), texture_object(0)
168 template<
class Qualified>
171 size_t bytes =
size_t(-1),
172 size_t texture_offset = 0)
174 this->ptr =
const_cast<typename std::remove_cv<Qualified>::type*
>(ptr);
175 this->texture_offset = texture_offset;
177 hipChannelFormatDesc channel_desc = hipCreateChannelDesc<texture_type>();
178 hipResourceDesc resourse_desc;
179 hipTextureDesc texture_desc;
180 memset(&resourse_desc, 0,
sizeof(hipResourceDesc));
181 memset(&texture_desc, 0,
sizeof(hipTextureDesc));
182 resourse_desc.resType = hipResourceTypeLinear;
183 resourse_desc.res.linear.devPtr = this->ptr;
184 resourse_desc.res.linear.desc = channel_desc;
185 resourse_desc.res.linear.sizeInBytes = bytes;
186 texture_desc.readMode = hipReadModeElementType;
188 return hipCreateTextureObject(&texture_object, &resourse_desc, &texture_desc, NULL);
195 return hipDestroyTextureObject(texture_object);
198 #ifndef DOXYGEN_SHOULD_SKIP_THIS 199 ROCPRIM_HOST_DEVICE
inline 207 ROCPRIM_HOST_DEVICE
inline 216 ROCPRIM_HOST_DEVICE
inline 219 #ifndef __HIP_DEVICE_COMPILE__ 220 return ptr[texture_offset];
222 texture_type words[multiple];
224 #if defined(__gfx940__) || defined(__gfx941__) || defined(__gfx942__) 225 #pragma message "Texture cache iterator is not supported on gfx94x as the texture fetch functions in HIP are not available." 226 ROCPRIM_PRINT_ERROR_ONCE(
"WARNING: Usage of texture_cache_iterator on gfx94x device is not supported and will not produce valid results.")
229 for(
unsigned int i = 0; i < multiple; i++)
234 (texture_offset * multiple) + i
242 ROCPRIM_HOST_DEVICE
inline 248 ROCPRIM_HOST_DEVICE
inline 252 retval.ptr = ptr + distance;
253 retval.texture_object = texture_object;
254 retval.texture_offset = texture_offset + distance;
258 ROCPRIM_HOST_DEVICE
inline 262 texture_offset += distance;
266 ROCPRIM_HOST_DEVICE
inline 270 retval.ptr = ptr - distance;
271 retval.texture_object = texture_object;
272 retval.texture_offset = texture_offset - distance;
276 ROCPRIM_HOST_DEVICE
inline 280 texture_offset -= distance;
284 ROCPRIM_HOST_DEVICE
inline 287 return ptr - other.ptr;
290 ROCPRIM_HOST_DEVICE
inline 297 ROCPRIM_HOST_DEVICE
inline 300 return (ptr == other.ptr) && (texture_offset == other.texture_offset);
303 ROCPRIM_HOST_DEVICE
inline 306 return (ptr != other.ptr) || (texture_offset != other.texture_offset);
309 ROCPRIM_HOST_DEVICE
inline 312 return (ptr - other.ptr) > 0;
315 ROCPRIM_HOST_DEVICE
inline 318 return (ptr - other.ptr) >= 0;
321 ROCPRIM_HOST_DEVICE
inline 324 return (ptr - other.ptr) < 0;
327 ROCPRIM_HOST_DEVICE
inline 330 return (ptr - other.ptr) <= 0;
337 #endif // DOXYGEN_SHOULD_SKIP_THIS 340 using texture_type = typename ::rocprim::detail::match_texture_type<T>::type;
341 static constexpr
unsigned int multiple =
sizeof(T) /
sizeof(texture_type);
344 hipTextureObject_t texture_object;
347 #ifndef DOXYGEN_SHOULD_SKIP_THIS 352 ROCPRIM_HOST_DEVICE
inline 357 return iterator + distance;
359 #endif // DOXYGEN_SHOULD_SKIP_THIS 361 END_ROCPRIM_NAMESPACE
366 #endif // ROCPRIM_ITERATOR_TEXTURE_CACHE_ITERATOR_HPP_ Definition: texture_cache_iterator.hpp:41
ROCPRIM_HOST_DEVICE bool operator>=(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Greater than or equal to operator for tuples.
Definition: tuple.hpp:915
ROCPRIM_HOST_DEVICE bool operator<(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Less than operator for tuples.
Definition: tuple.hpp:864
hipError_t unbind_texture()
Destroys the texture object that this iterator points at.
Definition: texture_cache_iterator.hpp:193
std::random_access_iterator_tag iterator_category
The category of the iterator.
Definition: texture_cache_iterator.hpp:145
ROCPRIM_HOST_DEVICE bool operator!=(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Not equal to operator for tuples.
Definition: tuple.hpp:838
Difference difference_type
A type used for identify distance between iterators.
Definition: texture_cache_iterator.hpp:143
Deprecated: Configuration of device-level scan primitives.
Definition: block_histogram.hpp:62
const value_type & reference
A reference type of the type iterated over (value_type).
Definition: texture_cache_iterator.hpp:139
ROCPRIM_HOST_DEVICE bool operator<=(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Less than or equal to operator for tuples.
Definition: tuple.hpp:898
typename std::remove_const< T >::type value_type
The type of the value that can be obtained by dereferencing the iterator.
Definition: texture_cache_iterator.hpp:137
const value_type * pointer
A pointer type of the type iterated over (value_type).
Definition: texture_cache_iterator.hpp:141
#define ROCPRIM_PRINT_ERROR_ONCE(message)
Prints the supplied error message only once (using only one of the active threads).
Definition: functional.hpp:42
hipError_t bind_texture(Qualified *ptr, size_t bytes=size_t(-1), size_t texture_offset=0)
Creates a hipTextureObject_t and binds this iterator to it.
Definition: texture_cache_iterator.hpp:170
ROCPRIM_HOST_DEVICE bool operator>(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Greater than operator for tuples.
Definition: tuple.hpp:881
ROCPRIM_HOST_DEVICE bool operator==(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Equal to operator for tuples.
Definition: tuple.hpp:819
Definition: texture_cache_iterator.hpp:82
A random-access input (read-only) iterator adaptor for dereferencing array values through texture cac...
Definition: texture_cache_iterator.hpp:133