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